Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3811e38dac | ||
![]() |
c50ed8a901 |
39 changed files with 633 additions and 1622 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -2,5 +2,5 @@
|
|||
__pycache__
|
||||
*.pyc
|
||||
|
||||
http_cache.sqlite
|
||||
test_output
|
||||
# home-manager output
|
||||
/result
|
||||
|
|
5
Pipfile
5
Pipfile
|
@ -4,12 +4,9 @@ verify_ssl = true
|
|||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
mako = "*"
|
||||
toml = "*"
|
||||
pyyaml = "*"
|
||||
requests = "*"
|
||||
requests-cache = "*"
|
||||
attrs = "*"
|
||||
cattrs = "*"
|
||||
jinja2 = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
|
505
Pipfile.lock
generated
505
Pipfile.lock
generated
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "fc47da1b3ed38e959a395151eeda0547cf4399f14ebe255028e1465586bbe20b"
|
||||
"sha256": "6dd7401b01b42acded1cd79ddaf80273fb3be8f90eee6ccd13010c388fdc3f8a"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {},
|
||||
|
@ -14,299 +14,258 @@
|
|||
]
|
||||
},
|
||||
"default": {
|
||||
"attrs": {
|
||||
"hashes": [
|
||||
"sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff",
|
||||
"sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==24.3.0"
|
||||
},
|
||||
"cattrs": {
|
||||
"hashes": [
|
||||
"sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0",
|
||||
"sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==24.1.2"
|
||||
},
|
||||
"certifi": {
|
||||
"hashes": [
|
||||
"sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56",
|
||||
"sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"
|
||||
"sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1",
|
||||
"sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2024.12.14"
|
||||
"version": "==2023.11.17"
|
||||
},
|
||||
"charset-normalizer": {
|
||||
"hashes": [
|
||||
"sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537",
|
||||
"sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa",
|
||||
"sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a",
|
||||
"sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294",
|
||||
"sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b",
|
||||
"sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd",
|
||||
"sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601",
|
||||
"sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd",
|
||||
"sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4",
|
||||
"sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d",
|
||||
"sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2",
|
||||
"sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313",
|
||||
"sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd",
|
||||
"sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa",
|
||||
"sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8",
|
||||
"sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1",
|
||||
"sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2",
|
||||
"sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496",
|
||||
"sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d",
|
||||
"sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b",
|
||||
"sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e",
|
||||
"sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a",
|
||||
"sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4",
|
||||
"sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca",
|
||||
"sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78",
|
||||
"sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408",
|
||||
"sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5",
|
||||
"sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3",
|
||||
"sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f",
|
||||
"sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a",
|
||||
"sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765",
|
||||
"sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6",
|
||||
"sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146",
|
||||
"sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6",
|
||||
"sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9",
|
||||
"sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd",
|
||||
"sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c",
|
||||
"sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f",
|
||||
"sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545",
|
||||
"sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176",
|
||||
"sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770",
|
||||
"sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824",
|
||||
"sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f",
|
||||
"sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf",
|
||||
"sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487",
|
||||
"sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d",
|
||||
"sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd",
|
||||
"sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b",
|
||||
"sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534",
|
||||
"sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f",
|
||||
"sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b",
|
||||
"sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9",
|
||||
"sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd",
|
||||
"sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125",
|
||||
"sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9",
|
||||
"sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de",
|
||||
"sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11",
|
||||
"sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d",
|
||||
"sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35",
|
||||
"sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f",
|
||||
"sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda",
|
||||
"sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7",
|
||||
"sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a",
|
||||
"sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971",
|
||||
"sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8",
|
||||
"sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41",
|
||||
"sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d",
|
||||
"sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f",
|
||||
"sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757",
|
||||
"sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a",
|
||||
"sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886",
|
||||
"sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77",
|
||||
"sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76",
|
||||
"sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247",
|
||||
"sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85",
|
||||
"sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb",
|
||||
"sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7",
|
||||
"sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e",
|
||||
"sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6",
|
||||
"sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037",
|
||||
"sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1",
|
||||
"sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e",
|
||||
"sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807",
|
||||
"sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407",
|
||||
"sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c",
|
||||
"sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12",
|
||||
"sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3",
|
||||
"sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089",
|
||||
"sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd",
|
||||
"sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e",
|
||||
"sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
|
||||
"sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
|
||||
"sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
|
||||
"sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
|
||||
"sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
|
||||
"sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
|
||||
"sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
|
||||
"sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
|
||||
"sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
|
||||
"sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
|
||||
"sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
|
||||
"sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
|
||||
"sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
|
||||
"sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
|
||||
"sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
|
||||
"sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
|
||||
"sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
|
||||
"sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
|
||||
"sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
|
||||
"sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
|
||||
"sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
|
||||
"sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
|
||||
"sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
|
||||
"sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
|
||||
"sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
|
||||
"sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
|
||||
"sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
|
||||
"sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
|
||||
"sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
|
||||
"sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
|
||||
"sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
|
||||
"sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
|
||||
"sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
|
||||
"sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
|
||||
"sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
|
||||
"sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
|
||||
"sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
|
||||
"sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
|
||||
"sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
|
||||
"sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
|
||||
"sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
|
||||
"sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
|
||||
"sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
|
||||
"sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
|
||||
"sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
|
||||
"sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
|
||||
"sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
|
||||
"sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
|
||||
"sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
|
||||
"sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
|
||||
"sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
|
||||
"sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
|
||||
"sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
|
||||
"sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
|
||||
"sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
|
||||
"sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
|
||||
"sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
|
||||
"sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
|
||||
"sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
|
||||
"sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
|
||||
"sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
|
||||
"sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
|
||||
"sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
|
||||
"sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
|
||||
"sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
|
||||
"sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
|
||||
"sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
|
||||
"sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
|
||||
"sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
|
||||
"sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
|
||||
"sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
|
||||
"sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
|
||||
"sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
|
||||
"sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
|
||||
"sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
|
||||
"sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
|
||||
"sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
|
||||
"sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
|
||||
"sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
|
||||
"sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
|
||||
"sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
|
||||
"sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
|
||||
"sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
|
||||
"sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
|
||||
"sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
|
||||
"sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
|
||||
"sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
|
||||
"sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
|
||||
"sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
|
||||
"sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
|
||||
"sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
|
||||
"sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==3.4.1"
|
||||
"markers": "python_full_version >= '3.7.0'",
|
||||
"version": "==3.3.2"
|
||||
},
|
||||
"idna": {
|
||||
"hashes": [
|
||||
"sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
|
||||
"sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
|
||||
"sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca",
|
||||
"sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==3.10"
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==3.6"
|
||||
},
|
||||
"jinja2": {
|
||||
"mako": {
|
||||
"hashes": [
|
||||
"sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d",
|
||||
"sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
|
||||
"sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9",
|
||||
"sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==3.1.6"
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==1.3.0"
|
||||
},
|
||||
"markupsafe": {
|
||||
"hashes": [
|
||||
"sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4",
|
||||
"sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30",
|
||||
"sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0",
|
||||
"sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9",
|
||||
"sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396",
|
||||
"sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13",
|
||||
"sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028",
|
||||
"sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca",
|
||||
"sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557",
|
||||
"sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832",
|
||||
"sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0",
|
||||
"sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b",
|
||||
"sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579",
|
||||
"sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a",
|
||||
"sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c",
|
||||
"sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff",
|
||||
"sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c",
|
||||
"sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22",
|
||||
"sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094",
|
||||
"sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb",
|
||||
"sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e",
|
||||
"sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5",
|
||||
"sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a",
|
||||
"sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d",
|
||||
"sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a",
|
||||
"sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b",
|
||||
"sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8",
|
||||
"sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225",
|
||||
"sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c",
|
||||
"sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144",
|
||||
"sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f",
|
||||
"sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87",
|
||||
"sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d",
|
||||
"sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93",
|
||||
"sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf",
|
||||
"sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158",
|
||||
"sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84",
|
||||
"sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb",
|
||||
"sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48",
|
||||
"sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171",
|
||||
"sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c",
|
||||
"sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6",
|
||||
"sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd",
|
||||
"sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d",
|
||||
"sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1",
|
||||
"sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d",
|
||||
"sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca",
|
||||
"sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a",
|
||||
"sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29",
|
||||
"sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe",
|
||||
"sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798",
|
||||
"sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c",
|
||||
"sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8",
|
||||
"sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f",
|
||||
"sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f",
|
||||
"sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a",
|
||||
"sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178",
|
||||
"sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0",
|
||||
"sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79",
|
||||
"sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430",
|
||||
"sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
|
||||
"sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
|
||||
"sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
|
||||
"sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431",
|
||||
"sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686",
|
||||
"sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c",
|
||||
"sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559",
|
||||
"sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc",
|
||||
"sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb",
|
||||
"sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939",
|
||||
"sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c",
|
||||
"sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0",
|
||||
"sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4",
|
||||
"sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9",
|
||||
"sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575",
|
||||
"sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
|
||||
"sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d",
|
||||
"sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd",
|
||||
"sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3",
|
||||
"sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00",
|
||||
"sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155",
|
||||
"sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac",
|
||||
"sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52",
|
||||
"sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f",
|
||||
"sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8",
|
||||
"sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
|
||||
"sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007",
|
||||
"sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24",
|
||||
"sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea",
|
||||
"sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
|
||||
"sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0",
|
||||
"sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee",
|
||||
"sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be",
|
||||
"sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2",
|
||||
"sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1",
|
||||
"sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707",
|
||||
"sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6",
|
||||
"sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c",
|
||||
"sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
|
||||
"sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823",
|
||||
"sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779",
|
||||
"sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
|
||||
"sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c",
|
||||
"sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
|
||||
"sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee",
|
||||
"sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc",
|
||||
"sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
|
||||
"sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48",
|
||||
"sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7",
|
||||
"sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e",
|
||||
"sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b",
|
||||
"sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa",
|
||||
"sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5",
|
||||
"sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e",
|
||||
"sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb",
|
||||
"sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9",
|
||||
"sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57",
|
||||
"sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc",
|
||||
"sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc",
|
||||
"sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2",
|
||||
"sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"
|
||||
],
|
||||
"markers": "python_version >= '3.9'",
|
||||
"version": "==3.0.2"
|
||||
},
|
||||
"platformdirs": {
|
||||
"hashes": [
|
||||
"sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907",
|
||||
"sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"
|
||||
],
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==4.3.6"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==2.1.3"
|
||||
},
|
||||
"pyyaml": {
|
||||
"hashes": [
|
||||
"sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
|
||||
"sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
|
||||
"sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
|
||||
"sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
|
||||
"sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
|
||||
"sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
|
||||
"sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
|
||||
"sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
|
||||
"sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
|
||||
"sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
|
||||
"sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
|
||||
"sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
|
||||
"sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
|
||||
"sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
|
||||
"sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
|
||||
"sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
|
||||
"sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
|
||||
"sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
|
||||
"sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
|
||||
"sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
|
||||
"sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
|
||||
"sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
|
||||
"sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
|
||||
"sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
|
||||
"sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
|
||||
"sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
|
||||
"sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
|
||||
"sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
|
||||
"sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
|
||||
"sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
|
||||
"sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
|
||||
"sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
|
||||
"sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
|
||||
"sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
|
||||
"sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
|
||||
"sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
|
||||
"sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
|
||||
"sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
|
||||
"sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
|
||||
"sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
|
||||
"sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
|
||||
"sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
|
||||
"sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
|
||||
"sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
|
||||
"sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
|
||||
"sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
|
||||
"sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
|
||||
"sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
|
||||
"sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
|
||||
"sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
|
||||
"sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
|
||||
"sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
|
||||
"sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
|
||||
"sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
|
||||
"sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
|
||||
"sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
|
||||
"sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
|
||||
"sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
|
||||
"sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
|
||||
"sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
|
||||
"sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
|
||||
"sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
|
||||
"sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
|
||||
"sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
|
||||
"sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
|
||||
"sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
|
||||
"sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
|
||||
"sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
|
||||
"sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
|
||||
"sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
|
||||
"sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
|
||||
"sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
|
||||
"sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
|
||||
"sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
|
||||
"sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
|
||||
"sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
|
||||
"sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
|
||||
"sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
|
||||
"sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
|
||||
"sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
|
||||
"sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
|
||||
"sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
|
||||
"sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
|
||||
"sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
|
||||
"sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
|
||||
"sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
|
||||
"sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
|
||||
"sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
|
||||
"sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
|
||||
"sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
|
||||
"sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
|
||||
"sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
|
||||
"sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
|
||||
"sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
|
||||
"sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
|
||||
"sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
|
||||
"sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
|
||||
"sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
|
||||
"sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
|
||||
"sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
|
||||
"sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
|
||||
"sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
|
||||
"sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==6.0.2"
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==6.0.1"
|
||||
},
|
||||
"requests": {
|
||||
"hashes": [
|
||||
"sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
|
||||
"sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
|
||||
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
|
||||
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==2.32.3"
|
||||
},
|
||||
"requests-cache": {
|
||||
"hashes": [
|
||||
"sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603",
|
||||
"sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==1.2.1"
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==2.31.0"
|
||||
},
|
||||
"toml": {
|
||||
"hashes": [
|
||||
|
@ -314,24 +273,16 @@
|
|||
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
|
||||
],
|
||||
"index": "pypi",
|
||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'",
|
||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||
"version": "==0.10.2"
|
||||
},
|
||||
"url-normalize": {
|
||||
"hashes": [
|
||||
"sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2",
|
||||
"sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"
|
||||
],
|
||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
|
||||
"version": "==1.4.3"
|
||||
},
|
||||
"urllib3": {
|
||||
"hashes": [
|
||||
"sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df",
|
||||
"sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"
|
||||
"sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3",
|
||||
"sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"
|
||||
],
|
||||
"markers": "python_version >= '3.9'",
|
||||
"version": "==2.3.0"
|
||||
"markers": "python_version >= '3.8'",
|
||||
"version": "==2.1.0"
|
||||
}
|
||||
},
|
||||
"develop": {}
|
||||
|
|
132
flake.lock
generated
Normal file
132
flake.lock
generated
Normal file
|
@ -0,0 +1,132 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"locked": {
|
||||
"lastModified": 1659877975,
|
||||
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1720607326,
|
||||
"narHash": "sha256-0Bpp15EMSP+Q/4TyIS/tQnKU5ZjbZGDtxoQFu+ddqCY=",
|
||||
"owner": "exzombie",
|
||||
"repo": "home-manager-smona",
|
||||
"rev": "ff5bf3f36ebd59dec42b00dad40e195ae8818ee4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "exzombie",
|
||||
"ref": "nixgl-compat",
|
||||
"repo": "home-manager-smona",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixGL": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1713543440,
|
||||
"narHash": "sha256-lnzZQYG0+EXl/6NkGpyIz+FEOc/DSEG57AP1VsdeNrM=",
|
||||
"owner": "nix-community",
|
||||
"repo": "nixGL",
|
||||
"rev": "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "nixGL",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1660551188,
|
||||
"narHash": "sha256-a1LARMMYQ8DPx1BgoI/UN4bXe12hhZkCNqdxNi6uS0g=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "441dc5d512153039f19ef198e662e4f3dbb9fd65",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1724242322,
|
||||
"narHash": "sha256-HMpK7hNjhEk4z5SFg5UtxEio9OWFocHdaQzCfW1pE7w=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "224042e9a3039291f22f4f2ded12af95a616cca0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-24.05",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"home-manager": "home-manager",
|
||||
"nixGL": "nixGL",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
19
flake.nix
Normal file
19
flake.nix
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-24.05";
|
||||
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
|
||||
home-manager = {
|
||||
url = "github:exzombie/home-manager-smona/nixgl-compat";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nixGL.url = "github:nix-community/nixGL";
|
||||
};
|
||||
|
||||
outputs = { nixpkgs, ... } @ inputs:
|
||||
(import ./modules/hosts.nix inputs) // {
|
||||
# TODO devshell config
|
||||
};
|
||||
}
|
|
@ -1,40 +1,31 @@
|
|||
wireless = ["wlp5s0"]
|
||||
ethernet = ["enp6s0"]
|
||||
# hwmon2 = k10temp, temp1 = Tctl
|
||||
temperature_path = "/sys/class/hwmon/hwmon2/temp1_input"
|
||||
temperature-path = "/sys/class/hwmon/hwmon2/temp1_input"
|
||||
|
||||
[[outputs]]
|
||||
match = "*"
|
||||
background_path = "~/.local/share/backgrounds/adventurer/full.jpg"
|
||||
|
||||
[[outputs]]
|
||||
match = "LG Electronics LG ULTRAWIDE 312NTYT34842"
|
||||
position = [0, 1080]
|
||||
mode = "3440x1440@160Hz"
|
||||
background = ["~/.local/share/backgrounds/adventurer/full.jpg", "fill"]
|
||||
|
||||
[[outputs]]
|
||||
match = "ASUSTek COMPUTER INC VG258 M1LMQS004947"
|
||||
position = [0, 0]
|
||||
position = [0, 1080]
|
||||
mode = "1920x1080@165Hz"
|
||||
background_path = "~/.local/share/backgrounds/adventurer/l.jpg"
|
||||
background = ["~/.local/share/backgrounds/adventurer/l.jpg", "fill"]
|
||||
|
||||
[[outputs]]
|
||||
match = "BNQ BenQ GL2580 46J02196SL0"
|
||||
position = [1920, 1080]
|
||||
mode = "1920x1080@60Hz"
|
||||
background_path = "~/.local/share/backgrounds/adventurer/r.jpg"
|
||||
background = ["~/.local/share/backgrounds/adventurer/r.jpg", "fill"]
|
||||
|
||||
[[outputs]]
|
||||
match = "BNQ BenQ GL2580 46J02151SL0"
|
||||
position = [960, 0]
|
||||
mode = "1920x1080@60Hz"
|
||||
background_path = "~/.local/share/backgrounds/adventurer/t.jpg"
|
||||
background = ["~/.local/share/backgrounds/adventurer/t.jpg", "fill"]
|
||||
|
||||
[[outputs]]
|
||||
match = "Pioneer Electronic Corporation AV Receiver Unknown"
|
||||
mode = "3840x2160@60Hz"
|
||||
scale = 2
|
||||
|
||||
[niri]
|
||||
# 1/3 proportion is better for the ultrawide
|
||||
default_column_width = 0.33333
|
||||
|
|
|
@ -3,7 +3,7 @@ ethernet = ["eno1"]
|
|||
|
||||
[[outputs]]
|
||||
match = "*"
|
||||
background_path = "~/.local/share/backgrounds/concord/full.jpg"
|
||||
background = ["~/.local/share/backgrounds/concord/full.jpg", "fill"]
|
||||
|
||||
[[outputs]]
|
||||
match = "Pioneer Electronic Corporation AV Receiver Unknown"
|
||||
|
|
12
hosts/default.toml
Normal file
12
hosts/default.toml
Normal file
|
@ -0,0 +1,12 @@
|
|||
is-virtual = false
|
||||
base16-scheme = "seti"
|
||||
disks = ["/"]
|
||||
system-font = "Fira Sans"
|
||||
system-mono-font = "Fira Mono"
|
||||
#temperature-path = ""
|
||||
|
||||
[[outputs]]
|
||||
match = "*"
|
||||
background = ["~/.local/share/backgrounds/sway-dark-1920x1080.png", "fill"]
|
||||
|
||||
inputs = []
|
|
@ -1,7 +1,7 @@
|
|||
wireless = ["wlp4s0"]
|
||||
ethernet = ["enp2s0"]
|
||||
temperature_path = "/sys/class/hwmon/hwmon5/temp1_input"
|
||||
temperature-path = "/sys/class/hwmon/hwmon5/temp1_input"
|
||||
|
||||
[[outputs]]
|
||||
match = "*"
|
||||
background_path = "~/.local/share/backgrounds/faithful/full.jpg"
|
||||
background = ["~/.local/share/backgrounds/faithful/full.jpg", "fill"]
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
wireless = ["wlp170s0"]
|
||||
auto_ethernet = true
|
||||
temperature_path = "/sys/class/hwmon/hwmon4/temp1_input"
|
||||
has_battery = true
|
||||
#ethernet = ["enp2s0"]
|
||||
temperature-path = "/sys/class/hwmon/hwmon4/temp1_input"
|
||||
|
||||
[[outputs]]
|
||||
match = "eDP-1"
|
||||
background_path = "~/.local/share/backgrounds/liberation.jpg"
|
||||
scale = 1
|
||||
background = ["~/.local/share/backgrounds/sway-dark-1920x1080.png", "fill"]
|
||||
scale = "1.25"
|
||||
|
||||
[[inputs]]
|
||||
match = "2362:628:PIXA3854:00_093A:0274_Touchpad"
|
||||
tap = true
|
||||
tap = "enabled"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
wireless = ["wlan0"]
|
||||
ethernet = ["eth0"]
|
||||
disk = ["/"]
|
||||
temperature_path = "/sys/class/hwmon/hwmon0/temp1_input"
|
||||
temperature-path = "/sys/class/hwmon/hwmon0/temp1_input"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
# it's not feasible to generate and install a universal bashrc.
|
||||
|
||||
# Aliases
|
||||
alias drs='dbus-run-session'
|
||||
alias dsway='dbus-run-session sway'
|
||||
alias docker='sudo docker'
|
||||
|
||||
export EDITOR=hx
|
||||
|
|
338
install.py
338
install.py
|
@ -1,9 +1,6 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
from dataclasses import dataclass
|
||||
from datetime import timedelta
|
||||
from enum import Enum
|
||||
import os
|
||||
import shutil
|
||||
import socket
|
||||
|
@ -13,34 +10,29 @@ from functools import partial
|
|||
from pathlib import Path
|
||||
from typing import List
|
||||
|
||||
from attrs import define, field
|
||||
import cattrs
|
||||
import jinja2
|
||||
import requests_cache
|
||||
import mako.lookup
|
||||
import mako.template
|
||||
import requests
|
||||
import toml
|
||||
import yaml
|
||||
|
||||
http_session = requests_cache.CachedSession(expire_after=timedelta(days=1))
|
||||
|
||||
BASE16_TEMPLATES_URL = "https://raw.githubusercontent.com/chriskempson/base16-templates-source/master/list.yaml"
|
||||
BASE16_TEMPLATES = yaml.safe_load(http_session.get(BASE16_TEMPLATES_URL).text)
|
||||
BASE16_TEMPLATES_URL = 'https://raw.githubusercontent.com/chriskempson/base16-templates-source/master/list.yaml'
|
||||
BASE16_TEMPLATES = yaml.safe_load(requests.get(BASE16_TEMPLATES_URL).text)
|
||||
|
||||
# Pending https://github.com/chriskempson/base16-templates-source/pull/106
|
||||
BASE16_TEMPLATES["wofi-colors"] = "https://github.com/agausmann/base16-wofi-colors"
|
||||
BASE16_TEMPLATES['wofi-colors'] = 'https://github.com/agausmann/base16-wofi-colors'
|
||||
|
||||
|
||||
def get_base16(scheme, app, template="default"):
|
||||
def get_base16(scheme, app, template='default'):
|
||||
base_url = BASE16_TEMPLATES[app]
|
||||
if "github.com" in base_url:
|
||||
base_url = (
|
||||
base_url.replace("github.com", "raw.githubusercontent.com") + "/master/"
|
||||
)
|
||||
if 'github.com' in base_url:
|
||||
base_url = base_url.replace('github.com', 'raw.githubusercontent.com') + '/master/'
|
||||
else:
|
||||
base_url += "/blob/master/"
|
||||
config = yaml.safe_load(http_session.get(base_url + "templates/config.yaml").text)
|
||||
output = config[template]["output"]
|
||||
extension = config[template]["extension"]
|
||||
return http_session.get(base_url + output + "/base16-" + scheme + extension).text
|
||||
base_url += '/blob/master/'
|
||||
config = yaml.safe_load(requests.get(base_url + 'templates/config.yaml').text)
|
||||
output = config[template]['output']
|
||||
extension = config[template]['extension']
|
||||
return requests.get(base_url + output + '/base16-' + scheme + extension).text
|
||||
|
||||
|
||||
def is_outdated(src: List[Path], dst: Path) -> bool:
|
||||
|
@ -48,241 +40,114 @@ def is_outdated(src: List[Path], dst: Path) -> bool:
|
|||
return True
|
||||
|
||||
dst_modified = dst.stat().st_mtime
|
||||
return any(a_src.stat().st_mtime > dst_modified for a_src in src if a_src.exists())
|
||||
|
||||
|
||||
class BackgroundMode(Enum):
|
||||
Fill = "fill"
|
||||
|
||||
@property
|
||||
def sway_value(self) -> str:
|
||||
match self:
|
||||
case self.Fill:
|
||||
return "fill"
|
||||
|
||||
@property
|
||||
def wpaperd_value(self) -> str:
|
||||
match self:
|
||||
case self.Fill:
|
||||
return "center"
|
||||
|
||||
|
||||
@define
|
||||
class InputConfig:
|
||||
match: str
|
||||
tap: bool | None = None
|
||||
|
||||
@property
|
||||
def sway_lines(self) -> str:
|
||||
lines = []
|
||||
if self.tap is not None:
|
||||
lines.append(f" tap {'enabled' if self.tap else 'disabled'}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
@define
|
||||
class OutputConfig:
|
||||
match: str
|
||||
position: list | None = None
|
||||
mode: str | None = None
|
||||
scale: float | None = None
|
||||
background_path: str | None = None
|
||||
background_mode: BackgroundMode = BackgroundMode.Fill
|
||||
port: str | None = None
|
||||
|
||||
@property
|
||||
def sway_lines(self) -> str:
|
||||
lines = []
|
||||
if self.position:
|
||||
lines.append(f" position {' '.join(map(str, self.position))}")
|
||||
if self.mode:
|
||||
lines.append(f" mode '{self.mode}'")
|
||||
if self.background_path:
|
||||
lines.append(
|
||||
f" background '{self.background_path}' {self.background_mode.sway_value}"
|
||||
)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
@property
|
||||
def swaylock_image_line(self) -> str | None:
|
||||
if (self.match != "*" and self.port is None) or self.background_path is None:
|
||||
return None
|
||||
|
||||
if self.match == "*":
|
||||
return f"image={self.background_path}"
|
||||
return f"image={self.port}:{self.background_path}"
|
||||
|
||||
@property
|
||||
def niri_lines(self) -> str:
|
||||
lines = []
|
||||
if self.position:
|
||||
lines.append(f" position x={self.position[0]} y={self.position[1]}")
|
||||
if self.mode:
|
||||
lines.append(f" mode \"{self.mode.removesuffix('Hz')}\"")
|
||||
if self.scale:
|
||||
lines.append(f" scale {self.scale}")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
@property
|
||||
def wpaperd_config_fragment(self) -> dict:
|
||||
if self.background_path is None:
|
||||
return {}
|
||||
|
||||
key = self.match
|
||||
if self.match == "*":
|
||||
key = "any"
|
||||
|
||||
return {
|
||||
key: {
|
||||
"path": self.background_path,
|
||||
"mode": self.background_mode.wpaperd_value,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@define
|
||||
class NiriConfig:
|
||||
default_column_width: float = 0.5
|
||||
|
||||
|
||||
@define
|
||||
class HostConfig:
|
||||
name: str
|
||||
is_virtual: bool = False
|
||||
base16_scheme: str = "seti"
|
||||
wireless: list[str] = field(factory=list)
|
||||
ethernet: list[str] = field(factory=list)
|
||||
auto_ethernet: bool = True
|
||||
disks: list[str] = field(factory=lambda: ["/"])
|
||||
has_battery: bool = False
|
||||
system_font: str = "Fira Sans"
|
||||
system_mono_font: str = "Fira Mono"
|
||||
temperature_path: str | None = None
|
||||
terminal: str = "alacritty"
|
||||
lock_cmd: str = "swaylock -c 000000"
|
||||
display_on_cmd: str = "wlopm --on *"
|
||||
display_off_cmd: str = "wlopm --off *"
|
||||
use_jump_host: bool = False
|
||||
inputs: list[InputConfig] = field(factory=list)
|
||||
outputs: list[OutputConfig] = field(factory=list)
|
||||
niri: NiriConfig = field(factory=NiriConfig)
|
||||
|
||||
@property
|
||||
def swaylock_images(self) -> str:
|
||||
return "\n".join(
|
||||
line for output in self.outputs if (line := output.swaylock_image_line)
|
||||
)
|
||||
|
||||
@property
|
||||
def wpaperd_config(self) -> str:
|
||||
config = {}
|
||||
|
||||
for output in self.outputs:
|
||||
config.update(output.wpaperd_config_fragment)
|
||||
|
||||
return toml.dumps(config)
|
||||
return any(
|
||||
a_src.stat().st_mtime > dst_modified
|
||||
for a_src in src
|
||||
if a_src.exists()
|
||||
)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Generates and installs dotfiles for this host.",
|
||||
description='Generates and installs dotfiles for this host.',
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
||||
)
|
||||
parser.add_argument(
|
||||
"-d",
|
||||
"--dotfiles",
|
||||
help="The base directory of the dotfiles repository.",
|
||||
'-d', '--dotfiles',
|
||||
help='The base directory of the dotfiles repository.',
|
||||
type=Path,
|
||||
default=Path(sys.argv[0]).parent,
|
||||
)
|
||||
parser.add_argument(
|
||||
"-n",
|
||||
"--hostname",
|
||||
help="The hostname or other identifying name of this system that will"
|
||||
" be used to retrieve the host-specific configuration.",
|
||||
default=os.environ.get("HOSTNAME") or socket.gethostname(),
|
||||
'-n', '--hostname',
|
||||
help='The hostname or other identifying name of this system that will'
|
||||
' be used to retrieve the host-specific configuration.',
|
||||
default=os.environ.get('HOSTNAME') or socket.gethostname(),
|
||||
)
|
||||
parser.add_argument(
|
||||
"-o",
|
||||
"--home",
|
||||
help="The home directory where generated dotfiles will be installed.",
|
||||
'-o', '--home',
|
||||
help='The home directory where generated dotfiles will be installed.',
|
||||
type=Path,
|
||||
default=os.environ.get("HOME") or Path.home(),
|
||||
default=os.environ.get('HOME') or Path.home(),
|
||||
)
|
||||
parser.add_argument(
|
||||
"-f",
|
||||
"--force",
|
||||
help="Force overwrite all files even if they are not considered outdated.",
|
||||
action="store_true",
|
||||
'-f', '--force',
|
||||
help='Force overwrite all files even if they are not considered outdated.',
|
||||
action='store_true'
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
dotfiles_dir: Path = args.dotfiles
|
||||
raw_dir = dotfiles_dir / "raw"
|
||||
templates_dir = dotfiles_dir / "templates"
|
||||
host_filename = dotfiles_dir / "hosts" / "{}.toml".format(args.hostname)
|
||||
raw_dir = args.dotfiles / 'raw'
|
||||
templates_dir = args.dotfiles / 'templates'
|
||||
include_dir = args.dotfiles / 'include'
|
||||
default_host_filename = args.dotfiles / 'hosts' / 'default.toml'
|
||||
host_filename = args.dotfiles / 'hosts' / '{}.toml'.format(args.hostname)
|
||||
|
||||
with open(default_host_filename) as host_file:
|
||||
host_config = toml.load(host_file)
|
||||
|
||||
host_toml = {
|
||||
"name": args.hostname,
|
||||
}
|
||||
if host_filename.exists():
|
||||
with open(host_filename) as host_file:
|
||||
host_toml.update(toml.load(host_file))
|
||||
host_config.update(toml.load(host_file))
|
||||
|
||||
host_config = cattrs.structure(host_toml, HostConfig)
|
||||
host_config['name'] = args.hostname
|
||||
|
||||
for output in host_config.outputs:
|
||||
# Attempt to resolve port names for swaylock template
|
||||
# Preprocess output configs for sway
|
||||
for input in host_config.get('inputs', []):
|
||||
# Generate config lines for sway template
|
||||
lines = []
|
||||
for key in input:
|
||||
if key == 'match':
|
||||
continue
|
||||
if isinstance(input[key], list):
|
||||
val = ' '.join(repr(elem) for elem in input[key])
|
||||
else:
|
||||
val = repr(input[key])
|
||||
lines.append(f'{key} {val}')
|
||||
|
||||
input['sway-lines'] = lines
|
||||
|
||||
for output in host_config['outputs']:
|
||||
# Generate config lines for sway template
|
||||
lines = []
|
||||
for key in output:
|
||||
if key == 'match':
|
||||
continue
|
||||
if isinstance(output[key], list):
|
||||
val = ' '.join(repr(elem) for elem in output[key])
|
||||
else:
|
||||
val = repr(output[key])
|
||||
lines.append(f'{key} {val}')
|
||||
|
||||
output['sway-lines'] = lines
|
||||
|
||||
# Attempt to resolve device names for swaylock template
|
||||
# (Workaround https://github.com/swaywm/swaylock/issues/114)
|
||||
#
|
||||
# This will only work if this is run on the target host
|
||||
# and if sway or niri is running, but that is usually the case...
|
||||
if output.match == "*":
|
||||
continue
|
||||
|
||||
try:
|
||||
if "SWAYSOCK" in os.environ:
|
||||
# and if sway is running, but that is usually the case...
|
||||
if output['match'] != '*':
|
||||
try:
|
||||
get_outputs = subprocess.check_output(
|
||||
["swaymsg", "-t", "get_outputs", "-p"],
|
||||
).decode("utf-8")
|
||||
['swaymsg', '-t', 'get_outputs', '-p'],
|
||||
).decode('utf-8')
|
||||
for line in get_outputs.splitlines():
|
||||
# Line format: Output <port> '<match identifier>'
|
||||
if line.startswith("Output") and output.match in line:
|
||||
output.port = line.split()[1]
|
||||
break
|
||||
# Line format: Output <device> '<match identifier>'
|
||||
if line.startswith('Output') and output['match'] in line:
|
||||
output['device'] = line.split()[1]
|
||||
break
|
||||
except subprocess.CalledProcessError:
|
||||
print('Could not contact sway to retrieve output names.')
|
||||
print('Please re-run in sway to finish configuring swaylock.')
|
||||
|
||||
elif "NIRI_SOCKET" in os.environ:
|
||||
get_outputs = subprocess.check_output(
|
||||
["niri", "msg", "outputs"],
|
||||
).decode("utf-8")
|
||||
for line in get_outputs.splitlines():
|
||||
# Line format: Output "<match identifier>" (<port>)
|
||||
if line.startswith("Output") and output.match in line:
|
||||
output.port = (
|
||||
line.split()[-1].removeprefix("(").removesuffix(")")
|
||||
)
|
||||
break
|
||||
else:
|
||||
print(
|
||||
"Could not find SWAYSOCK or NIRI_SOCKET, cannot retrieve output names."
|
||||
)
|
||||
print("Please re-run in sway or niri to finish configuring swaylock.")
|
||||
|
||||
except subprocess.CalledProcessError:
|
||||
print("Could not contact sway or niri to retrieve output names.")
|
||||
print("Please re-run in sway or niri to finish configuring swaylock.")
|
||||
|
||||
jenv = jinja2.Environment(
|
||||
loader=jinja2.FileSystemLoader("templates"),
|
||||
autoescape=jinja2.select_autoescape(),
|
||||
lookup = mako.lookup.TemplateLookup(
|
||||
directories=[
|
||||
str(templates_dir),
|
||||
str(include_dir),
|
||||
],
|
||||
)
|
||||
|
||||
changed_paths = set()
|
||||
|
||||
for raw_path in raw_dir.glob("**/*"):
|
||||
for raw_path in raw_dir.glob('**/*'):
|
||||
if not raw_path.is_file():
|
||||
continue
|
||||
rel_path = raw_path.relative_to(raw_dir)
|
||||
|
@ -292,35 +157,32 @@ def main():
|
|||
print(rel_path)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copy(raw_path, output_path)
|
||||
changed_paths.update(map(str, rel_path.parents))
|
||||
|
||||
for template_path in templates_dir.glob("**/*"):
|
||||
for template_path in templates_dir.glob('**/*'):
|
||||
if not template_path.is_file():
|
||||
continue
|
||||
rel_path = template_path.relative_to(templates_dir)
|
||||
output_path: Path = args.home / template_path.relative_to(templates_dir)
|
||||
output_path = output_path.with_name(output_path.name.removesuffix(".j2"))
|
||||
output_path = args.home / template_path.relative_to(templates_dir)
|
||||
|
||||
if args.force or is_outdated([template_path, host_filename], output_path):
|
||||
print(rel_path)
|
||||
template = jenv.get_template(str(rel_path))
|
||||
template = mako.template.Template(
|
||||
filename=str(template_path),
|
||||
strict_undefined=True,
|
||||
lookup=lookup,
|
||||
)
|
||||
output = template.render(
|
||||
host=host_config,
|
||||
home=args.home,
|
||||
get_base16=partial(get_base16, host_config.base16_scheme),
|
||||
get_base16=partial(get_base16, host_config.get('base16-scheme', 'default-dark')),
|
||||
)
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(output_path, "w+") as output_file:
|
||||
with open(output_path, 'w+') as output_file:
|
||||
output_file.write(output)
|
||||
|
||||
# Copy permissions from original file
|
||||
output_path.chmod(template_path.stat().st_mode & 0o777)
|
||||
changed_paths.update(map(str, rel_path.parents))
|
||||
|
||||
# Post-install hooks
|
||||
if ".config/waybar" in changed_paths:
|
||||
subprocess.call(["killall", "-USR2", "waybar"])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
12
justfile
Normal file
12
justfile
Normal file
|
@ -0,0 +1,12 @@
|
|||
user := `whoami`
|
||||
hostname := `hostname`
|
||||
hm_flags := "--flake .#" + user + "@" + hostname
|
||||
|
||||
alias b := build
|
||||
alias inst := install
|
||||
|
||||
build:
|
||||
home-manager build {{hm_flags}}
|
||||
|
||||
install:
|
||||
home-manager switch {{hm_flags}}
|
14
modules/common.nix
Normal file
14
modules/common.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
{ config, lib, pkgs, ... }: {
|
||||
home = {
|
||||
stateVersion = "24.05";
|
||||
|
||||
username = "goose";
|
||||
homeDirectory = "/home/goose";
|
||||
|
||||
packages = with pkgs; [
|
||||
# fira-mono
|
||||
];
|
||||
};
|
||||
|
||||
# programs.home-manager.enable = true;
|
||||
}
|
24
modules/hosts.nix
Normal file
24
modules/hosts.nix
Normal file
|
@ -0,0 +1,24 @@
|
|||
{ nixpkgs, flake-utils, home-manager, nixGL, ... } @ inputs:
|
||||
let
|
||||
getNixOsPkgs = system: import nixpkgs { inherit system; };
|
||||
getPkgs = system: import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ nixGL.overlay ];
|
||||
};
|
||||
|
||||
makeHostSystem = pkgs: modules: home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
modules = [ ./common.nix ] ++ modules;
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
packages.x86_64-linux.homeConfigurations = let
|
||||
pkgs = getPkgs "x86_64-linux";
|
||||
makeHost = makeHostSystem pkgs;
|
||||
in {
|
||||
"goose@adventurer" = makeHost [ /*./hosts/adventurer.nix*/ ];
|
||||
};
|
||||
}
|
Binary file not shown.
Before Width: | Height: | Size: 1.2 MiB |
|
@ -1 +0,0 @@
|
|||
chase-baker-NPiv36bUc4I-unsplash.jpg
|
1
templates/.cache/wal/colors
Normal file
1
templates/.cache/wal/colors
Normal file
|
@ -0,0 +1 @@
|
|||
${get_base16('wofi-colors')}
|
|
@ -1 +0,0 @@
|
|||
{{ get_base16('wofi-colors') }}
|
|
@ -1,5 +1,9 @@
|
|||
[font]
|
||||
size = {{ 10 if host.is_virtual else 12 }}
|
||||
% if host.get('is-virtual', False):
|
||||
size = 10
|
||||
% else:
|
||||
size = 12
|
||||
%endif
|
||||
|
||||
[font.bold]
|
||||
family = "Fira Mono"
|
||||
|
@ -10,4 +14,4 @@ family = "Fira Mono"
|
|||
[window]
|
||||
opacity = 0.9
|
||||
|
||||
{{ get_base16('alacritty') }}
|
||||
${get_base16('alacritty')}
|
|
@ -3,4 +3,5 @@
|
|||
origin = bottom-center
|
||||
font = "DejaVu Sans Mono 10"
|
||||
|
||||
{{ get_base16('dunst') }}
|
||||
${get_base16('dunst')}
|
||||
|
|
@ -3,23 +3,23 @@ general {
|
|||
interval = 5
|
||||
}
|
||||
|
||||
{{ get_base16('i3status') }}
|
||||
${get_base16('i3status')}
|
||||
|
||||
{% for iface in host.wireless %}
|
||||
wireless {{ iface }} {
|
||||
format_up = "{{ iface }} %ip %essid %quality"
|
||||
format_down = "{{ iface }} down"
|
||||
% for iface in host.get('wireless', []):
|
||||
wireless ${iface} {
|
||||
format_up = "${iface} %ip %essid %quality"
|
||||
format_down = "${iface} down"
|
||||
}
|
||||
order += "wireless {{ iface }}"
|
||||
{% endfor %}
|
||||
order += "wireless ${iface}"
|
||||
% endfor
|
||||
|
||||
{% for iface in host.ethernet %}
|
||||
ethernet {{ iface }} {
|
||||
format_up = "{{ iface }} %ip"
|
||||
format_down = "{{ iface }} down"
|
||||
% for iface in host.get('ethernet', []):
|
||||
ethernet ${iface} {
|
||||
format_up = "${iface} %ip"
|
||||
format_down = "${iface} down"
|
||||
}
|
||||
order += "ethernet {{ iface }}"
|
||||
{% endfor %}
|
||||
order += "ethernet ${iface}"
|
||||
% endfor
|
||||
|
||||
volume default {
|
||||
format = "vol %volume"
|
||||
|
@ -38,12 +38,12 @@ battery all {
|
|||
}
|
||||
order += "battery all"
|
||||
|
||||
{% for disk in host.disks %}
|
||||
disk "{{ disk }}" {
|
||||
format = "{{ disk }} %avail"
|
||||
% for disk in host.get('disks', ['/']):
|
||||
disk "${disk}" {
|
||||
format = "${disk} %avail"
|
||||
}
|
||||
order += "disk {{ disk }}"
|
||||
{% endfor %}
|
||||
order += "disk ${disk}"
|
||||
% endfor
|
||||
|
||||
cpu_usage {
|
||||
format = "cpu %usage"
|
||||
|
@ -59,13 +59,13 @@ memory {
|
|||
}
|
||||
order += "memory"
|
||||
|
||||
{% if host.temperature_path %}
|
||||
% if 'temperature-path' in host:
|
||||
cpu_temperature 0 {
|
||||
format = "temp %degrees°C"
|
||||
path = "{{ host.temperature_path }}"
|
||||
path = "${host['temperature-path']}"
|
||||
}
|
||||
order += "cpu_temperature 0"
|
||||
{% endif %}
|
||||
% endif
|
||||
|
||||
tztime utc {
|
||||
format = "%Y-%m-%d %H:%M:%S"
|
|
@ -1,495 +0,0 @@
|
|||
// This config is in the KDL format: https://kdl.dev
|
||||
// "/-" comments out the following node.
|
||||
// Check the wiki for a full description of the configuration:
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview
|
||||
|
||||
// Input device configuration.
|
||||
// Find the full list of options on the wiki:
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
|
||||
input {
|
||||
keyboard {
|
||||
xkb {
|
||||
// You can set rules, model, layout, variant and options.
|
||||
// For more information, see xkeyboard-config(7).
|
||||
|
||||
// For example:
|
||||
// layout "us,ru"
|
||||
// options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
|
||||
}
|
||||
}
|
||||
|
||||
// Next sections include libinput settings.
|
||||
// Omitting settings disables them, or leaves them at their default values.
|
||||
touchpad {
|
||||
// off
|
||||
tap
|
||||
// dwt
|
||||
// dwtp
|
||||
natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "two-finger"
|
||||
// disabled-on-external-mouse
|
||||
}
|
||||
|
||||
mouse {
|
||||
// off
|
||||
// natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "no-scroll"
|
||||
}
|
||||
|
||||
trackpoint {
|
||||
// off
|
||||
// natural-scroll
|
||||
// accel-speed 0.2
|
||||
// accel-profile "flat"
|
||||
// scroll-method "on-button-down"
|
||||
// scroll-button 273
|
||||
// middle-emulation
|
||||
}
|
||||
|
||||
// Uncomment this to make the mouse warp to the center of newly focused windows.
|
||||
// warp-mouse-to-focus
|
||||
|
||||
// Focus windows and outputs automatically when moving the mouse into them.
|
||||
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
|
||||
// focus-follows-mouse max-scroll-amount="0%"
|
||||
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input#disable-power-key-handling
|
||||
disable-power-key-handling
|
||||
}
|
||||
|
||||
{% for output in host.outputs %}
|
||||
output "{{ output.match }}" {
|
||||
{{ output.niri_lines }}
|
||||
}
|
||||
|
||||
{% endfor %}
|
||||
|
||||
// Settings that influence how windows are positioned and sized.
|
||||
// Find more information on the wiki:
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
|
||||
layout {
|
||||
// Set gaps around windows in logical pixels.
|
||||
gaps 16
|
||||
|
||||
// When to center a column when changing focus, options are:
|
||||
// - "never", default behavior, focusing an off-screen column will keep at the left
|
||||
// or right edge of the screen.
|
||||
// - "always", the focused column will always be centered.
|
||||
// - "on-overflow", focusing a column will center it if it doesn't fit
|
||||
// together with the previously focused column.
|
||||
center-focused-column "never"
|
||||
|
||||
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
|
||||
preset-column-widths {
|
||||
// Proportion sets the width as a fraction of the output width, taking gaps into account.
|
||||
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
|
||||
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
|
||||
proportion 0.33333
|
||||
proportion 0.5
|
||||
proportion 0.66667
|
||||
|
||||
// Fixed sets the width in logical pixels exactly.
|
||||
// fixed 1920
|
||||
}
|
||||
|
||||
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
|
||||
// preset-window-heights { }
|
||||
|
||||
// You can change the default width of the new windows.
|
||||
default-column-width { proportion {{ host.niri.default_column_width }}; }
|
||||
// If you leave the brackets empty, the windows themselves will decide their initial width.
|
||||
// default-column-width {}
|
||||
|
||||
// By default focus ring and border are rendered as a solid background rectangle
|
||||
// behind windows. That is, they will show up through semitransparent windows.
|
||||
// This is because windows using client-side decorations can have an arbitrary shape.
|
||||
//
|
||||
// If you don't like that, you should uncomment `prefer-no-csd` below.
|
||||
// Niri will draw focus ring and border *around* windows that agree to omit their
|
||||
// client-side decorations.
|
||||
//
|
||||
// Alternatively, you can override it with a window rule called
|
||||
// `draw-border-with-background`.
|
||||
|
||||
// You can change how the focus ring looks.
|
||||
focus-ring {
|
||||
// Uncomment this line to disable the focus ring.
|
||||
// off
|
||||
|
||||
// How many logical pixels the ring extends out from the windows.
|
||||
width 4
|
||||
|
||||
// Colors can be set in a variety of ways:
|
||||
// - CSS named colors: "red"
|
||||
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
|
||||
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
|
||||
|
||||
// Color of the ring on the active monitor.
|
||||
active-color "#7fc8ff"
|
||||
|
||||
// Color of the ring on inactive monitors.
|
||||
inactive-color "#505050"
|
||||
|
||||
// You can also use gradients. They take precedence over solid colors.
|
||||
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
|
||||
// The angle is the same as in linear-gradient, and is optional,
|
||||
// defaulting to 180 (top-to-bottom gradient).
|
||||
// You can use any CSS linear-gradient tool on the web to set these up.
|
||||
// Changing the color space is also supported, check the wiki for more info.
|
||||
//
|
||||
// active-gradient from="#80c8ff" to="#bbddff" angle=45
|
||||
|
||||
// You can also color the gradient relative to the entire view
|
||||
// of the workspace, rather than relative to just the window itself.
|
||||
// To do that, set relative-to="workspace-view".
|
||||
//
|
||||
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
|
||||
}
|
||||
|
||||
// You can also add a border. It's similar to the focus ring, but always visible.
|
||||
border {
|
||||
// The settings are the same as for the focus ring.
|
||||
// If you enable the border, you probably want to disable the focus ring.
|
||||
off
|
||||
|
||||
width 4
|
||||
active-color "#ffc87f"
|
||||
inactive-color "#505050"
|
||||
|
||||
// active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
|
||||
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
|
||||
}
|
||||
|
||||
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
|
||||
// You can think of them as a kind of outer gaps. They are set in logical pixels.
|
||||
// Left and right struts will cause the next window to the side to always be visible.
|
||||
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
|
||||
// layer-shell panels and regular gaps.
|
||||
struts {
|
||||
left 32
|
||||
right 32
|
||||
// top 64
|
||||
// bottom 64
|
||||
}
|
||||
}
|
||||
|
||||
// Add lines like this to spawn processes at startup.
|
||||
// Note that running niri as a session supports xdg-desktop-autostart,
|
||||
// which may be more convenient to use.
|
||||
// See the binds section below for more spawn examples.
|
||||
// spawn-at-startup "alacritty" "-e" "fish"
|
||||
spawn-at-startup "pipewire"
|
||||
spawn-at-startup "pipewire-pulse"
|
||||
spawn-at-startup "wireplumber"
|
||||
spawn-at-startup "waybar"
|
||||
spawn-at-startup "xwayland-satellite" ":12"
|
||||
spawn-at-startup "wpaperd"
|
||||
|
||||
environment {
|
||||
DISPLAY ":12"
|
||||
}
|
||||
|
||||
cursor {
|
||||
xcursor-theme "breeze_cursors"
|
||||
xcursor-size 24
|
||||
}
|
||||
|
||||
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
|
||||
// If the client will specifically ask for CSD, the request will be honored.
|
||||
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
|
||||
// This option will also fix border/focus ring drawing behind some semitransparent windows.
|
||||
// After enabling or disabling this, you need to restart the apps for this to take effect.
|
||||
prefer-no-csd
|
||||
|
||||
// You can change the path where screenshots are saved.
|
||||
// A ~ at the front will be expanded to the home directory.
|
||||
// The path is formatted with strftime(3) to give you the screenshot date and time.
|
||||
screenshot-path "~/pictures/screenshots/%Y-%m-%dT%H-%M-%S.png"
|
||||
|
||||
// You can also set this to null to disable saving screenshots to disk.
|
||||
// screenshot-path null
|
||||
|
||||
// Animation settings.
|
||||
// The wiki explains how to configure individual animations:
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
|
||||
animations {
|
||||
// Uncomment to turn off all animations.
|
||||
// off
|
||||
|
||||
// Slow down all animations by this factor. Values below 1 speed them up instead.
|
||||
// slowdown 3.0
|
||||
}
|
||||
|
||||
// Window rules let you adjust behavior for individual windows.
|
||||
// Find more information on the wiki:
|
||||
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
|
||||
|
||||
// Work around WezTerm's initial configure bug
|
||||
// by setting an empty default-column-width.
|
||||
window-rule {
|
||||
// This regular expression is intentionally made as specific as possible,
|
||||
// since this is the default config, and we want no false positives.
|
||||
// You can get away with just app-id="wezterm" if you want.
|
||||
match app-id=r#"^org\.wezfurlong\.wezterm$"#
|
||||
default-column-width {}
|
||||
}
|
||||
|
||||
// Open the Firefox picture-in-picture player as floating by default.
|
||||
window-rule {
|
||||
// This app-id regular expression will work for both:
|
||||
// - host Firefox (app-id is "firefox")
|
||||
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
|
||||
match app-id=r#"[Ff]irefox$"# title="^Picture-in-Picture$"
|
||||
open-floating true
|
||||
}
|
||||
|
||||
// Example: block out two password managers from screen capture.
|
||||
// (This example rule is commented out with a "/-" in front.)
|
||||
/-window-rule {
|
||||
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
|
||||
match app-id=r#"^org\.gnome\.World\.Secrets$"#
|
||||
|
||||
block-out-from "screen-capture"
|
||||
|
||||
// Use this instead if you want them visible on third-party screenshot tools.
|
||||
// block-out-from "screencast"
|
||||
}
|
||||
|
||||
// Example: enable rounded corners for all windows.
|
||||
// (This example rule is commented out with a "/-" in front.)
|
||||
window-rule {
|
||||
geometry-corner-radius 4
|
||||
clip-to-geometry true
|
||||
}
|
||||
|
||||
binds {
|
||||
// Keys consist of modifiers separated by + signs, followed by an XKB key name
|
||||
// in the end. To find an XKB name for a particular key, you may use a program
|
||||
// like wev.
|
||||
//
|
||||
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
|
||||
// when running as a winit window.
|
||||
//
|
||||
// Most actions that you can bind here can also be invoked programmatically with
|
||||
// `niri msg action do-something`.
|
||||
|
||||
// Mod-Shift-/, which is usually the same as Mod-?,
|
||||
// shows a list of important hotkeys.
|
||||
Mod+Shift+Slash { show-hotkey-overlay; }
|
||||
|
||||
// Suggested binds for running programs: terminal, app launcher, screen locker.
|
||||
Mod+T { spawn "alacritty"; }
|
||||
Mod+D { spawn "wofi" "--show" "drun"; }
|
||||
Mod+Shift+D { spawn "wofi" "--show" "run"; }
|
||||
Mod+P { spawn "wofi-pass"; }
|
||||
Super+Alt+L { spawn "swaylock"; }
|
||||
|
||||
// You can also use a shell. Do this if you need pipes, multiple commands, etc.
|
||||
// Note: the entire command goes as a single argument in the end.
|
||||
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
|
||||
|
||||
// Example volume keys mappings for PipeWire & WirePlumber.
|
||||
// The allow-when-locked=true property makes them work even when the session is locked.
|
||||
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
|
||||
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
|
||||
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
|
||||
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
|
||||
XF86AudioMedia allow-when-locked=true { spawn "playerctl" "play-pause"; }
|
||||
XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; }
|
||||
XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; }
|
||||
XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; }
|
||||
|
||||
Mod+Q { close-window; }
|
||||
|
||||
Mod+Left { focus-column-left; }
|
||||
Mod+Down { focus-window-down; }
|
||||
Mod+Up { focus-window-up; }
|
||||
Mod+Right { focus-column-right; }
|
||||
Mod+H { focus-column-left; }
|
||||
Mod+J { focus-window-down; }
|
||||
Mod+K { focus-window-up; }
|
||||
Mod+L { focus-column-right; }
|
||||
|
||||
Mod+Shift+Left { move-column-left; }
|
||||
Mod+Shift+Down { move-window-down; }
|
||||
Mod+Shift+Up { move-window-up; }
|
||||
Mod+Shift+Right { move-column-right; }
|
||||
Mod+Shift+H { move-column-left; }
|
||||
Mod+Shift+J { move-window-down; }
|
||||
Mod+Shift+K { move-window-up; }
|
||||
Mod+Shift+L { move-column-right; }
|
||||
|
||||
// Alternative commands that move across workspaces when reaching
|
||||
// the first or last window in a column.
|
||||
// Mod+J { focus-window-or-workspace-down; }
|
||||
// Mod+K { focus-window-or-workspace-up; }
|
||||
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
|
||||
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
|
||||
|
||||
Mod+Home { focus-column-first; }
|
||||
Mod+End { focus-column-last; }
|
||||
Mod+Ctrl+Home { move-column-to-first; }
|
||||
Mod+Ctrl+End { move-column-to-last; }
|
||||
|
||||
Mod+Ctrl+Left { focus-monitor-left; }
|
||||
Mod+Ctrl+Down { focus-monitor-down; }
|
||||
Mod+Ctrl+Up { focus-monitor-up; }
|
||||
Mod+Ctrl+Right { focus-monitor-right; }
|
||||
Mod+Ctrl+H { focus-monitor-left; }
|
||||
Mod+Ctrl+J { focus-monitor-down; }
|
||||
Mod+Ctrl+K { focus-monitor-up; }
|
||||
Mod+Ctrl+L { focus-monitor-right; }
|
||||
|
||||
Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
|
||||
Mod+Shift+Ctrl+Down { move-workspace-to-monitor-down; }
|
||||
Mod+Shift+Ctrl+Up { move-workspace-to-monitor-up; }
|
||||
Mod+Shift+Ctrl+Right { move-workspace-to-monitor-right; }
|
||||
Mod+Shift+Ctrl+H { move-workspace-to-monitor-left; }
|
||||
Mod+Shift+Ctrl+J { move-workspace-to-monitor-down; }
|
||||
Mod+Shift+Ctrl+K { move-workspace-to-monitor-up; }
|
||||
Mod+Shift+Ctrl+L { move-workspace-to-monitor-right; }
|
||||
|
||||
Mod+Page_Down { focus-workspace-down; }
|
||||
Mod+Page_Up { focus-workspace-up; }
|
||||
Mod+U { focus-workspace-down; }
|
||||
Mod+I { focus-workspace-up; }
|
||||
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
|
||||
Mod+Ctrl+U { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+I { move-column-to-workspace-up; }
|
||||
|
||||
// Alternatively, there are commands to move just a single window:
|
||||
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
|
||||
// ...
|
||||
|
||||
Mod+Shift+Page_Down { move-workspace-down; }
|
||||
Mod+Shift+Page_Up { move-workspace-up; }
|
||||
Mod+Shift+U { move-workspace-down; }
|
||||
Mod+Shift+I { move-workspace-up; }
|
||||
|
||||
// You can bind mouse wheel scroll ticks using the following syntax.
|
||||
// These binds will change direction based on the natural-scroll setting.
|
||||
//
|
||||
// To avoid scrolling through workspaces really fast, you can use
|
||||
// the cooldown-ms property. The bind will be rate-limited to this value.
|
||||
// You can set a cooldown on any bind, but it's most useful for the wheel.
|
||||
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
|
||||
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
|
||||
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
|
||||
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
|
||||
|
||||
Mod+WheelScrollRight { focus-column-right; }
|
||||
Mod+WheelScrollLeft { focus-column-left; }
|
||||
Mod+Ctrl+WheelScrollRight { move-column-right; }
|
||||
Mod+Ctrl+WheelScrollLeft { move-column-left; }
|
||||
|
||||
// Usually scrolling up and down with Shift in applications results in
|
||||
// horizontal scrolling; these binds replicate that.
|
||||
Mod+Shift+WheelScrollDown { focus-column-right; }
|
||||
Mod+Shift+WheelScrollUp { focus-column-left; }
|
||||
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
|
||||
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
|
||||
|
||||
// Similarly, you can bind touchpad scroll "ticks".
|
||||
// Touchpad scrolling is continuous, so for these binds it is split into
|
||||
// discrete intervals.
|
||||
// These binds are also affected by touchpad's natural-scroll, so these
|
||||
// example binds are "inverted", since we have natural-scroll enabled for
|
||||
// touchpads by default.
|
||||
// Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
|
||||
// Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
|
||||
|
||||
// You can refer to workspaces by index. However, keep in mind that
|
||||
// niri is a dynamic workspace system, so these commands are kind of
|
||||
// "best effort". Trying to refer to a workspace index bigger than
|
||||
// the current workspace count will instead refer to the bottommost
|
||||
// (empty) workspace.
|
||||
//
|
||||
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
|
||||
// will all refer to the 3rd workspace.
|
||||
Mod+1 { focus-workspace 1; }
|
||||
Mod+2 { focus-workspace 2; }
|
||||
Mod+3 { focus-workspace 3; }
|
||||
Mod+4 { focus-workspace 4; }
|
||||
Mod+5 { focus-workspace 5; }
|
||||
Mod+6 { focus-workspace 6; }
|
||||
Mod+7 { focus-workspace 7; }
|
||||
Mod+8 { focus-workspace 8; }
|
||||
Mod+9 { focus-workspace 9; }
|
||||
Mod+Ctrl+1 { move-column-to-workspace 1; }
|
||||
Mod+Ctrl+2 { move-column-to-workspace 2; }
|
||||
Mod+Ctrl+3 { move-column-to-workspace 3; }
|
||||
Mod+Ctrl+4 { move-column-to-workspace 4; }
|
||||
Mod+Ctrl+5 { move-column-to-workspace 5; }
|
||||
Mod+Ctrl+6 { move-column-to-workspace 6; }
|
||||
Mod+Ctrl+7 { move-column-to-workspace 7; }
|
||||
Mod+Ctrl+8 { move-column-to-workspace 8; }
|
||||
Mod+Ctrl+9 { move-column-to-workspace 9; }
|
||||
|
||||
// Alternatively, there are commands to move just a single window:
|
||||
// Mod+Ctrl+1 { move-window-to-workspace 1; }
|
||||
|
||||
// Switches focus between the current and the previous workspace.
|
||||
// Mod+Tab { focus-workspace-previous; }
|
||||
|
||||
// The following binds move the focused window in and out of a column.
|
||||
// If the window is alone, they will consume it into the nearby column to the side.
|
||||
// If the window is already in a column, they will expel it out.
|
||||
Mod+BracketLeft { consume-or-expel-window-left; }
|
||||
Mod+BracketRight { consume-or-expel-window-right; }
|
||||
|
||||
// Consume one window from the right to the bottom of the focused column.
|
||||
Mod+Comma { consume-window-into-column; }
|
||||
// Expel the bottom window from the focused column to the right.
|
||||
Mod+Period { expel-window-from-column; }
|
||||
|
||||
Mod+R { switch-preset-column-width; }
|
||||
Mod+Shift+R { switch-preset-window-height; }
|
||||
Mod+Ctrl+R { reset-window-height; }
|
||||
Mod+F { maximize-column; }
|
||||
Mod+Shift+F { fullscreen-window; }
|
||||
Mod+C { center-column; }
|
||||
|
||||
// Finer width adjustments.
|
||||
// This command can also:
|
||||
// * set width in pixels: "1000"
|
||||
// * adjust width in pixels: "-5" or "+5"
|
||||
// * set width as a percentage of screen width: "25%"
|
||||
// * adjust width as a percentage of screen width: "-10%" or "+10%"
|
||||
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
|
||||
// set-column-width "100" will make the column occupy 200 physical screen pixels.
|
||||
Mod+Minus { set-column-width "-10%"; }
|
||||
Mod+Equal { set-column-width "+10%"; }
|
||||
|
||||
// Finer height adjustments when in column with other windows.
|
||||
Mod+Shift+Minus { set-window-height "-10%"; }
|
||||
Mod+Shift+Equal { set-window-height "+10%"; }
|
||||
|
||||
// Move the focused window between the floating and the tiling layout.
|
||||
Mod+V { toggle-window-floating; }
|
||||
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
|
||||
|
||||
// Actions to switch layouts.
|
||||
// Note: if you uncomment these, make sure you do NOT have
|
||||
// a matching layout switch hotkey configured in xkb options above.
|
||||
// Having both at once on the same hotkey will break the switching,
|
||||
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
|
||||
// Mod+Space { switch-layout "next"; }
|
||||
// Mod+Shift+Space { switch-layout "prev"; }
|
||||
|
||||
Print { screenshot; }
|
||||
Ctrl+Print { screenshot-screen; }
|
||||
Alt+Print { screenshot-window; }
|
||||
|
||||
// The quit action will show a confirmation dialog to avoid accidental exits.
|
||||
Mod+Shift+E { quit; }
|
||||
Ctrl+Alt+Delete { quit; }
|
||||
|
||||
// Powers off the monitors. To turn them back on, do any input like
|
||||
// moving the mouse or pressing any other key.
|
||||
Mod+Shift+P { power-off-monitors; }
|
||||
}
|
|
@ -5,7 +5,7 @@ riverctl map normal Super D spawn 'wofi --show drun'
|
|||
riverctl map normal Super+Shift D spawn 'wofi --show run'
|
||||
riverctl map normal Super P spawn wofi-pass
|
||||
riverctl map normal Super+Shift S spawn 'wl-copy < "$(grimshot --notify save window)"'
|
||||
riverctl map normal Super+Control S spawn 'wl-copy < "$(grimshot --notify save area)"'
|
||||
riverctl map normal Super+Ctrl S spawn 'wl-copy < "$(grimshot --notify save area)"'
|
||||
riverctl map normal Super+Shift P spawn swaylock
|
||||
|
||||
|
||||
|
@ -127,12 +127,6 @@ riverctl default-layout rivertile
|
|||
riverctl map normal Super E output-layout bsp-layout
|
||||
riverctl map normal Super W output-layout rivertile
|
||||
riverctl map normal Super G output-layout uniform-grid
|
||||
riverctl map normal Super S output-layout secondary-grid
|
||||
|
||||
# TODO: automated script to register windows to always float
|
||||
riverctl rule-add -app-id wsjtx -title "* Wide Graph" float
|
||||
riverctl rule-add -app-id GridTracker -title Alerts float
|
||||
riverctl rule-add -app-id wsjtx -title "* Log QSO" float
|
||||
|
||||
# Only run these at the first load.
|
||||
if [ -z $RIVER_RELOAD ]
|
||||
|
@ -143,7 +137,6 @@ then
|
|||
rivertile -view-padding 6 -outer-padding 6 &
|
||||
river-bsp-layout &
|
||||
river-uniform-grid-layout &
|
||||
river-secondary-grid-layout &
|
||||
|
||||
# Daemons
|
||||
pipewire &
|
||||
|
@ -151,7 +144,6 @@ then
|
|||
pipewire-pulse &
|
||||
dunst &
|
||||
udiskie &
|
||||
swayidle &
|
||||
|
||||
# Bar
|
||||
i3bar-river &
|
||||
|
|
|
@ -27,7 +27,7 @@ set $kdown j
|
|||
set $kup k
|
||||
set $kright l
|
||||
|
||||
{{ get_base16('i3', 'colors') }}
|
||||
${get_base16('i3', 'colors')}
|
||||
|
||||
# property border bg text indic child
|
||||
client.focused $base0D $base0D $base00 $base0E $base0D
|
||||
|
@ -37,17 +37,21 @@ client.urgent $base08 $base08 $base00 $base08 $base08
|
|||
client.placeholder $base01 $base01 $base05 $base01 $base01
|
||||
client.background $base07
|
||||
|
||||
{% for output in host.outputs %}
|
||||
output "{{ output.match }}" {
|
||||
{{ output.sway_lines }}
|
||||
% for output in host.get('outputs', []):
|
||||
output ${repr(output['match'])} {
|
||||
% for line in output['sway-lines']:
|
||||
${line}
|
||||
% endfor
|
||||
}
|
||||
{% endfor %}
|
||||
% endfor
|
||||
|
||||
{% for input in host.inputs %}
|
||||
input "{{ input.match }}" {
|
||||
{{ input.sway_lines }}
|
||||
% for input in host.get('inputs', []):
|
||||
input ${repr(input['match'])} {
|
||||
% for line in input['sway-lines']:
|
||||
${line}
|
||||
% endfor
|
||||
}
|
||||
{% endfor %}
|
||||
%endfor
|
||||
|
||||
gaps inner 8
|
||||
|
||||
|
@ -73,7 +77,7 @@ exec dunst
|
|||
exec udiskie
|
||||
exec fcitx5
|
||||
|
||||
font pango:{{ host.system_mono_font }} 8
|
||||
font pango:${host['system-mono-font']} 8
|
||||
focus_follows_mouse no
|
||||
|
||||
floating_modifier $mod
|
||||
|
@ -82,14 +86,14 @@ bindsym $mod+Shift+c reload
|
|||
bindsym $mod+Shift+r restart
|
||||
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'
|
||||
bindsym $mod+Shift+q kill
|
||||
bindsym $mod+Shift+p exec {{ host.lock_cmd }}
|
||||
bindsym $mod+Shift+p exec ${host.get('lock-cmd', 'swaylock -c 000000')}
|
||||
|
||||
# Blank individual displays
|
||||
bindsym $mod+o output - dpms off
|
||||
# Unblank all displays
|
||||
bindsym $mod+Shift+o output * dpms on
|
||||
|
||||
bindsym $mod+Return exec {{ host.terminal }}
|
||||
bindsym $mod+Return exec ${host.get('terminal', 'alacritty')}
|
||||
bindsym $mod+d exec wofi --show drun
|
||||
bindsym $mod+Shift+d exec wofi --show run
|
||||
bindsym $mod+p exec wofi-pass
|
||||
|
@ -181,9 +185,9 @@ bindsym XF86AudioPlay exec playerctl play-pause
|
|||
bar {
|
||||
tray_output none
|
||||
status_command i3status
|
||||
font pango:{{ host.system_mono_font }} 10
|
||||
font pango:${host['system-mono-font']} 10
|
||||
|
||||
{{ get_base16('i3', 'bar-colors') }}
|
||||
${get_base16('i3', 'bar-colors')}
|
||||
|
||||
colors {
|
||||
background $base01
|
2
templates/.config/swayidle/config
Normal file
2
templates/.config/swayidle/config
Normal file
|
@ -0,0 +1,2 @@
|
|||
timeout 10 'pgrep swaylock && ${host.get('display-off-cmd', 'swaymsg "output * dpms off"')}' \
|
||||
resume 'pgrep swaylock && ${host.get('display-on-cmd', 'swaymsg "output * dpms on"')}'
|
|
@ -1 +0,0 @@
|
|||
timeout 10 'pgrep swaylock && {{ host.display_off_cmd }}' resume 'pgrep swaylock && {{ host.display_on_cmd }}'
|
15
templates/.config/swaylock/config
Normal file
15
templates/.config/swaylock/config
Normal file
|
@ -0,0 +1,15 @@
|
|||
ignore-empty-password
|
||||
indicator-idle-visible
|
||||
color=000000
|
||||
scaling=fill
|
||||
font=${host['system-font']}
|
||||
|
||||
% for output in host['outputs']:
|
||||
% if 'background' in output and (output['match'] == '*' or 'device' in output):
|
||||
% if output['match'] == '*':
|
||||
image=${output['background'][0]}
|
||||
% else:
|
||||
image=${output['device']}:${output['background'][0]}
|
||||
% endif
|
||||
% endif
|
||||
% endfor
|
|
@ -1,8 +0,0 @@
|
|||
ignore-empty-password
|
||||
indicator-idle-visible
|
||||
color=000000
|
||||
scaling=fill
|
||||
font={{ host.system_font }}
|
||||
|
||||
|
||||
{{ host.swaylock_images }}
|
|
@ -1,136 +0,0 @@
|
|||
// -*- mode: jsonc -*-
|
||||
{
|
||||
"layer": "top",
|
||||
"position": "top",
|
||||
"height": 30,
|
||||
"spacing": 4,
|
||||
"modules-left": [
|
||||
"niri/workspaces"
|
||||
],
|
||||
"modules-center": [
|
||||
"niri/window"
|
||||
],
|
||||
"modules-right": [
|
||||
|
||||
{% for iface in host.wireless + host.ethernet %}
|
||||
"network#{{ iface }}",
|
||||
{% endfor %}
|
||||
|
||||
{% if not host.ethernet and host.auto_ethernet %}
|
||||
"network#auto_ethernet",
|
||||
{% endif %}
|
||||
|
||||
"wireplumber",
|
||||
"battery",
|
||||
"group/disks",
|
||||
"cpu",
|
||||
"memory",
|
||||
|
||||
{% if host.temperature_path %}
|
||||
"temperature",
|
||||
{% endif %}
|
||||
|
||||
"clock#utc",
|
||||
"clock#local"
|
||||
],
|
||||
|
||||
{% for iface in host.wireless %}
|
||||
"network#{{ iface }}": {
|
||||
"interface": "{{ iface }}",
|
||||
"format": "\uf1eb \uf058",
|
||||
"format-disconnected": "\uf1eb \uf057",
|
||||
"tooltip-format": "{{ iface }} {ipaddr} {essid} {signalStrength}",
|
||||
"tooltip-format-disconnected": "{{ iface }} down"
|
||||
},
|
||||
{% endfor %}
|
||||
|
||||
{% for iface in host.ethernet %}
|
||||
"network#{{ iface }}": {
|
||||
"interface": "{{ iface }}",
|
||||
"format": "\uf6ff \uf058",
|
||||
"format-disconnected": "\uf6ff \uf057",
|
||||
"tooltip-format": "{{ iface }} {ipaddr}",
|
||||
"tooltip-format-disconnected": "{{ iface }} down"
|
||||
},
|
||||
{% endfor %}
|
||||
|
||||
{% if not host.ethernet and host.auto_ethernet %}
|
||||
"network#auto_ethernet": {
|
||||
"interface": "en*",
|
||||
"format": "\uf6ff \uf058",
|
||||
"format-disconnected": "\uf6ff \uf057",
|
||||
"tooltip-format": "{{ iface }} {ipaddr}",
|
||||
"tooltip-format-disconnected": "{{ iface }} down"
|
||||
},
|
||||
{% endif %}
|
||||
|
||||
"wireplumber": {
|
||||
"format": "{icon} {volume}%",
|
||||
"format-muted": "\uf6a9 {volume}%",
|
||||
"format-icons": ["\uf026", "\uf027", "\uf028"]
|
||||
},
|
||||
|
||||
{% if host.has_battery %}
|
||||
"battery": {
|
||||
"design-capacity": true,
|
||||
"format": "{icon} {capacity}% {time}",
|
||||
"format-time": "{H}:{m}",
|
||||
"format-icons": [
|
||||
"\uf244",
|
||||
"\uf243",
|
||||
"\uf242",
|
||||
"\uf241",
|
||||
"\uf240",
|
||||
],
|
||||
"format-charging": "\ue55b {capacity}% {time}",
|
||||
"format-full": "\ue55c {capacity}%",
|
||||
},
|
||||
{% endif %}
|
||||
|
||||
"group/disks": {
|
||||
// TODO: make drawer that expands orthogonally, outside of the bar
|
||||
"orientation": "inherit",
|
||||
"modules": [
|
||||
{% for disk in host.disks %}
|
||||
"disk#{{ disk }}",
|
||||
{% endfor %}
|
||||
],
|
||||
"drawer": {}
|
||||
},
|
||||
|
||||
{% for disk in host.disks %}
|
||||
"disk#{{ disk }}": {
|
||||
"path": "{{ disk }}",
|
||||
"format": "{{ disk }} {free}",
|
||||
"tooltip-format": "{used} / {total} ({percentage_used}%)"
|
||||
},
|
||||
{% endfor %}
|
||||
|
||||
"cpu": {
|
||||
"format": "\uf2db {usage}%",
|
||||
"tooltip": false
|
||||
},
|
||||
"memory": {
|
||||
"format": "\uf538 {percentage}%",
|
||||
"tooltip-format": "{used}GiB / {total}GiB"
|
||||
},
|
||||
|
||||
{% if host.temperature_path %}
|
||||
"temperature": {
|
||||
"format": "{temperatureC}°C",
|
||||
"hwmon-path": "{{ host.temperature_path }}"
|
||||
},
|
||||
{% endif %}
|
||||
|
||||
"clock#utc": {
|
||||
"interval": 5,
|
||||
"format": "{:%Y-%m-%d %H:%M:%S}",
|
||||
"timezone": "UTC",
|
||||
"tooltip": false
|
||||
},
|
||||
"clock#local": {
|
||||
"interval": 5,
|
||||
"format": "{:%H:%M}",
|
||||
"tooltip": false
|
||||
}
|
||||
}
|
|
@ -1,328 +0,0 @@
|
|||
* {
|
||||
/* `otf-font-awesome` is required to be installed for icons */
|
||||
font-family: '{{ host.system_mono_font }}', 'Font Awesome 6 Free';
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
background-color: rgba(43, 48, 59, 0.5);
|
||||
border-bottom: 3px solid rgba(100, 114, 125, 0.5);
|
||||
color: #ffffff;
|
||||
transition-property: background-color;
|
||||
transition-duration: .5s;
|
||||
}
|
||||
|
||||
window#waybar.hidden {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
/*
|
||||
window#waybar.empty {
|
||||
background-color: transparent;
|
||||
}
|
||||
window#waybar.solo {
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
*/
|
||||
|
||||
window#waybar.termite {
|
||||
background-color: #3F3F3F;
|
||||
}
|
||||
|
||||
window#waybar.chromium {
|
||||
background-color: #000000;
|
||||
border: none;
|
||||
}
|
||||
|
||||
button {
|
||||
/* Use box-shadow instead of border so the text isn't offset */
|
||||
box-shadow: inset 0 -3px transparent;
|
||||
/* Avoid rounded borders under each button name */
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
|
||||
button:hover {
|
||||
background: inherit;
|
||||
box-shadow: inset 0 -3px #ffffff;
|
||||
}
|
||||
|
||||
/* you can set a style on hover for any module like this */
|
||||
#pulseaudio:hover {
|
||||
background-color: #a37800;
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
padding: 0 5px;
|
||||
background-color: transparent;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#workspaces button:hover {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
#workspaces button.focused {
|
||||
background-color: #64727D;
|
||||
box-shadow: inset 0 -3px #ffffff;
|
||||
}
|
||||
|
||||
#workspaces button.urgent {
|
||||
background-color: #eb4d4b;
|
||||
}
|
||||
|
||||
#mode {
|
||||
background-color: #64727D;
|
||||
box-shadow: inset 0 -3px #ffffff;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#battery,
|
||||
#cpu,
|
||||
#memory,
|
||||
#disk,
|
||||
#temperature,
|
||||
#backlight,
|
||||
#network,
|
||||
#pulseaudio,
|
||||
#wireplumber,
|
||||
#custom-media,
|
||||
#tray,
|
||||
#mode,
|
||||
#idle_inhibitor,
|
||||
#scratchpad,
|
||||
#power-profiles-daemon,
|
||||
#mpd {
|
||||
padding: 0 10px;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#window,
|
||||
#workspaces {
|
||||
margin: 0 4px;
|
||||
}
|
||||
|
||||
/* If workspaces is the leftmost module, omit left margin */
|
||||
.modules-left>widget:first-child>#workspaces {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
/* If workspaces is the rightmost module, omit right margin */
|
||||
.modules-right>widget:last-child>#workspaces {
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
#clock {
|
||||
background-color: #64727D;
|
||||
}
|
||||
|
||||
#battery {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#battery.charging,
|
||||
#battery.plugged {
|
||||
color: #ffffff;
|
||||
background-color: #26A65B;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
to {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
}
|
||||
|
||||
/* Using steps() instead of linear as a timing function to limit cpu usage */
|
||||
#battery.critical:not(.charging) {
|
||||
background-color: #f53c3c;
|
||||
color: #ffffff;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
animation-timing-function: steps(12);
|
||||
animation-iteration-count: infinite;
|
||||
animation-direction: alternate;
|
||||
}
|
||||
|
||||
#power-profiles-daemon {
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
#power-profiles-daemon.performance {
|
||||
background-color: #f53c3c;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#power-profiles-daemon.balanced {
|
||||
background-color: #2980b9;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
#power-profiles-daemon.power-saver {
|
||||
background-color: #2ecc71;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
label:focus {
|
||||
background-color: #000000;
|
||||
}
|
||||
|
||||
#cpu {
|
||||
background-color: #2ecc71;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#memory {
|
||||
background-color: #9b59b6;
|
||||
}
|
||||
|
||||
#disk {
|
||||
background-color: #964B00;
|
||||
}
|
||||
|
||||
#backlight {
|
||||
background-color: #90b1b1;
|
||||
}
|
||||
|
||||
#network {
|
||||
background-color: #2980b9;
|
||||
}
|
||||
|
||||
#network.disconnected {
|
||||
background-color: #f53c3c;
|
||||
}
|
||||
|
||||
#pulseaudio {
|
||||
background-color: #f1c40f;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#pulseaudio.muted {
|
||||
background-color: #90b1b1;
|
||||
color: #2a5c45;
|
||||
}
|
||||
|
||||
#wireplumber {
|
||||
background-color: #fff0f5;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
#wireplumber.muted {
|
||||
background-color: #f53c3c;
|
||||
}
|
||||
|
||||
#custom-media {
|
||||
background-color: #66cc99;
|
||||
color: #2a5c45;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
#custom-media.custom-spotify {
|
||||
background-color: #66cc99;
|
||||
}
|
||||
|
||||
#custom-media.custom-vlc {
|
||||
background-color: #ffa000;
|
||||
}
|
||||
|
||||
#temperature {
|
||||
background-color: #f0932b;
|
||||
}
|
||||
|
||||
#temperature.critical {
|
||||
background-color: #eb4d4b;
|
||||
}
|
||||
|
||||
#tray {
|
||||
background-color: #2980b9;
|
||||
}
|
||||
|
||||
#tray>.passive {
|
||||
-gtk-icon-effect: dim;
|
||||
}
|
||||
|
||||
#tray>.needs-attention {
|
||||
-gtk-icon-effect: highlight;
|
||||
background-color: #eb4d4b;
|
||||
}
|
||||
|
||||
#idle_inhibitor {
|
||||
background-color: #2d3436;
|
||||
}
|
||||
|
||||
#idle_inhibitor.activated {
|
||||
background-color: #ecf0f1;
|
||||
color: #2d3436;
|
||||
}
|
||||
|
||||
#mpd {
|
||||
background-color: #66cc99;
|
||||
color: #2a5c45;
|
||||
}
|
||||
|
||||
#mpd.disconnected {
|
||||
background-color: #f53c3c;
|
||||
}
|
||||
|
||||
#mpd.stopped {
|
||||
background-color: #90b1b1;
|
||||
}
|
||||
|
||||
#mpd.paused {
|
||||
background-color: #51a37a;
|
||||
}
|
||||
|
||||
#language {
|
||||
background: #00b093;
|
||||
color: #740864;
|
||||
padding: 0 5px;
|
||||
margin: 0 5px;
|
||||
min-width: 16px;
|
||||
}
|
||||
|
||||
#keyboard-state {
|
||||
background: #97e1ad;
|
||||
color: #000000;
|
||||
padding: 0 0px;
|
||||
margin: 0 5px;
|
||||
min-width: 16px;
|
||||
}
|
||||
|
||||
#keyboard-state>label {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
#keyboard-state>label.locked {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
#scratchpad {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
#scratchpad.empty {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#privacy {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#privacy-item {
|
||||
padding: 0 5px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#privacy-item.screenshare {
|
||||
background-color: #cf5700;
|
||||
}
|
||||
|
||||
#privacy-item.audio-in {
|
||||
background-color: #1ca000;
|
||||
}
|
||||
|
||||
#privacy-item.audio-out {
|
||||
background-color: #0069d4;
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
window {
|
||||
background-color: --wofi-color1;
|
||||
color: --wofi-color5;
|
||||
font-family: '{{ host.system_mono_font }}';
|
||||
font-family: '${host['system-mono-font']}';
|
||||
}
|
||||
|
||||
#input {
|
||||
|
@ -17,3 +17,4 @@ window {
|
|||
#entry:selected {
|
||||
background-color: --wofi-color2;
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{{ host.wpaperd_config }}
|
4
templates/.ssh/config
Normal file
4
templates/.ssh/config
Normal file
|
@ -0,0 +1,4 @@
|
|||
AddKeysToAgent confirm
|
||||
|
||||
Host *.mst.edu
|
||||
User um-ad\ajgq56
|
|
@ -1,9 +0,0 @@
|
|||
AddKeysToAgent confirm
|
||||
|
||||
Host *.mst.edu
|
||||
User um-ad\ajgq56
|
||||
|
||||
{% if host.use_jump_host %}
|
||||
Host *.flock.wg
|
||||
ProxyJump goose@reliant.gaussian.dev
|
||||
{% endif %}
|
1
templates/.vim/colors/base16.vim
Normal file
1
templates/.vim/colors/base16.vim
Normal file
|
@ -0,0 +1 @@
|
|||
${get_base16('vim')}
|
|
@ -1 +0,0 @@
|
|||
{{ get_base16('vim') }}
|
|
@ -1,46 +0,0 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import argparse
|
||||
from io import StringIO
|
||||
import subprocess
|
||||
import urllib.parse
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="""
|
||||
Fetch the wifi password and generate a QR code.
|
||||
|
||||
This program assumes that the network PSK is stored
|
||||
in the password-store, and will look for it
|
||||
at the path `wifi/<essid>`.
|
||||
""",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-H",
|
||||
"--hidden",
|
||||
action="store_true",
|
||||
help="Indicate that this network's SSID is hidden.",
|
||||
)
|
||||
parser.add_argument("essid", help="ESSID for this network")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
psk = subprocess.check_output(["pass", f"wifi/{args.essid}"], text=True).strip()
|
||||
|
||||
hidden_data = "H:true;" if args.hidden else ""
|
||||
qr_data = f"WIFI:T:WPA;S:{quote(args.essid)};{hidden_data}P:{quote(psk)};;"
|
||||
|
||||
proc = subprocess.Popen(["qrencode", "-tANSI"], stdin=subprocess.PIPE, text=True)
|
||||
proc.communicate(qr_data)
|
||||
|
||||
|
||||
PRINTABLE = [*range(0x20, 0x3B), *range(0x3C, 0x7F)]
|
||||
|
||||
|
||||
def quote(s: str) -> str:
|
||||
return urllib.parse.quote(s, safe=PRINTABLE)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Add table
Reference in a new issue