Compare commits

..

No commits in common. "main" and "plasma6" have entirely different histories.

132 changed files with 1783 additions and 6535 deletions

1
.gitignore vendored
View file

@ -2,7 +2,6 @@
# Ignore build outputs from performing a nix-build or `nix build` command
result
result-*
repl-result*
# ---> Kate
# Ignore kate's swap files

View file

@ -14,10 +14,14 @@ print-recipes:
update:
nix flake update
# Update a single input
update-input input:
nix flake lock --update-input {{input}}
@edit-secrets:
git clone ssh://forgejo@git.toast003.xyz:4222/Toast/nix-secrets.git /tmp/secrets
sed -i 's\git+ssh://forgejo@git.toast003.xyz:4222/Toast/nix-secrets\/tmp/secrets\g' flake.nix
nix flake update secrets
git clone ssh://forgejo@git.everest.sable-pancake.ts.net:4222/Toast/nix-secrets.git /tmp/secrets
sed -i 's\git+ssh://forgejo@git.everest.sable-pancake.ts.net:4222/Toast/nix-secrets\/tmp/secrets\g' flake.nix
just -q update-input secrets
echo "{{bold}}All done!"
echo "{{normal}}Remember to restore flake.nix"
echo ""

386
flake.lock generated
View file

@ -10,11 +10,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1762618334,
"narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
"lastModified": 1712079060,
"narHash": "sha256-/JdiT9t+zzjChc5qQiF+jhrVhRt8figYH29rZO7pFe4=",
"owner": "ryantm",
"repo": "agenix",
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
"rev": "1381a759b205dff7a6818733118d02253340fd5e",
"type": "github"
},
"original": {
@ -24,101 +24,64 @@
}
},
"catppuccin": {
"locked": {
"lastModified": 1713895615,
"narHash": "sha256-SVkxhcL0/IN5fNI2dqr702wXOnzktsm0LCEVGRAJQcY=",
"owner": "catppuccin",
"repo": "nix",
"rev": "a48e70a31616cb63e4794fd3465bff1835cc4246",
"type": "github"
},
"original": {
"owner": "catppuccin",
"repo": "nix",
"type": "github"
}
},
"catppuccin-vsc": {
"inputs": {
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1765990358,
"narHash": "sha256-l8x0gU8mnYaGMl+gWrsSHKBJlZWD8KXJfHTkRlFiPI0=",
"lastModified": 1713966850,
"narHash": "sha256-AHAkkTUjk86rED3pQh8i4OiSze+OHe697L0o3zhv89A=",
"owner": "catppuccin",
"repo": "nix",
"rev": "de1b60ca45a578f59f7d84c8d338b346017b2161",
"repo": "vscode",
"rev": "75d96f3ae48b249f77124688a026ca5d7eeb5fb2",
"type": "github"
},
"original": {
"owner": "catppuccin",
"repo": "nix",
"repo": "vscode",
"type": "github"
}
},
"catppuccin-konsole": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1720277724,
"narHash": "sha256-d5+ygDrNl2qBxZ5Cn4U7d836+ZHz77m6/yxTIANd9BU=",
"owner": "catppuccin",
"repo": "konsole",
"rev": "3b64040e3f4ae5afb2347e7be8a38bc3cd8c73a8",
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "catppuccin",
"repo": "konsole",
"type": "github"
}
},
"copyparty": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs-raw"
]
},
"locked": {
"lastModified": 1766045858,
"narHash": "sha256-lsbdHVSc5EB2+XgKDbeG1DjLLY5DnzlKQIPV0uQu/bQ=",
"owner": "9001",
"repo": "copyparty",
"rev": "0e6b167167eaf04036df8576f1ea96bc116ea951",
"type": "github"
},
"original": {
"owner": "9001",
"repo": "copyparty",
"type": "github"
}
},
"eza-themes": {
"flake": false,
"locked": {
"lastModified": 1765813820,
"narHash": "sha256-WcwzKm2mi/tyA+zZCpyvTdrOrZ1R1ENA3t622SGzFas=",
"owner": "eza-community",
"repo": "eza-themes",
"rev": "1239cb1dd23fa8b70865550db77701b164a53cde",
"type": "github"
},
"original": {
"owner": "eza-community",
"repo": "eza-themes",
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"locked": {
"lastModified": 1678901627,
"narHash": "sha256-U02riOqrKKzwjsxc/400XnElV+UtPUQWpANPlyazjH0=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "93a2b84fc4b70d9e089d029deacc3583435c2ed6",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
@ -127,54 +90,6 @@
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_3"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flakey-profile": {
"locked": {
"lastModified": 1712898590,
"narHash": "sha256-FhGIEU93VHAChKEXx905TSiPZKga69bWl1VB37FK//I=",
"owner": "lf-",
"repo": "flakey-profile",
"rev": "243c903fd8eadc0f63d205665a92d4df91d42d9d",
"type": "github"
},
"original": {
"owner": "lf-",
"repo": "flakey-profile",
"type": "github"
}
},
"flakey-profile_2": {
"locked": {
"lastModified": 1712898590,
"narHash": "sha256-FhGIEU93VHAChKEXx905TSiPZKga69bWl1VB37FK//I=",
"owner": "lf-",
"repo": "flakey-profile",
"rev": "243c903fd8eadc0f63d205665a92d4df91d42d9d",
"type": "github"
},
"original": {
"owner": "lf-",
"repo": "flakey-profile",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
@ -183,11 +98,11 @@
]
},
"locked": {
"lastModified": 1745494811,
"narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
"lastModified": 1703113217,
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
"type": "github"
},
"original": {
@ -203,11 +118,11 @@
]
},
"locked": {
"lastModified": 1765980955,
"narHash": "sha256-rB45jv4uwC90vM9UZ70plfvY/2Kdygs+zlQ07dGQFk4=",
"lastModified": 1714042918,
"narHash": "sha256-4AItZA3EQIiSNAxliuYEJumw/LaVfrMv84gYyrs0r3U=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "89c9508bbe9b40d36b3dc206c2483ef176f15173",
"rev": "0c5704eceefcb7bb238a958f532a86e3b59d76db",
"type": "github"
},
"original": {
@ -223,16 +138,16 @@
]
},
"locked": {
"lastModified": 1765979862,
"narHash": "sha256-/r9/1KamvbHJx6I40H4HsSXnEcBAkj46ZwibhBx9kg0=",
"lastModified": 1714043624,
"narHash": "sha256-Xn2r0Jv95TswvPlvamCC46wwNo8ALjRCMBJbGykdhcM=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "d3135ab747fd9dac250ffb90b4a7e80634eacbe9",
"rev": "86853e31dc1b62c6eeed11c667e8cdd0285d4411",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-25.11",
"ref": "release-23.11",
"repo": "home-manager",
"type": "github"
}
@ -245,11 +160,11 @@
]
},
"locked": {
"lastModified": 1766067735,
"narHash": "sha256-cRC/rOYRtZNzc5y9nTccozyo/mkI4/1eFE33Aqgs+SQ=",
"lastModified": 1714022840,
"narHash": "sha256-i6xZsf7Kvp1n/Sn3nqPY1MJQx0gf80OGQw32PA/aZd8=",
"owner": "Jovian-Experiments",
"repo": "Jovian-NixOS",
"rev": "34a16089be30f77ac9444907ec97c02b4b711896",
"rev": "94def3af1d45fe4b142beda3aa59a6a98e62ce9e",
"type": "github"
},
"original": {
@ -258,73 +173,13 @@
"type": "github"
}
},
"lix": {
"flake": false,
"locked": {
"lastModified": 1765883751,
"narHash": "sha256-clrWX/t2swPGBVs50Yegq2HK3q5bbwOt3kWMsL7JIZM=",
"rev": "fc0073f54095f15ee272621d4746eb9f40946385",
"type": "tarball",
"url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/fc0073f54095f15ee272621d4746eb9f40946385.tar.gz?rev=fc0073f54095f15ee272621d4746eb9f40946385"
},
"original": {
"type": "tarball",
"url": "https://git.lix.systems/lix-project/lix/archive/main.tar.gz"
}
},
"lix-module": {
"inputs": {
"flake-utils": "flake-utils_2",
"flakey-profile": "flakey-profile",
"lix": [
"lix"
],
"nixpkgs": [
"nixpkgs-raw"
]
},
"locked": {
"lastModified": 1764519849,
"narHash": "sha256-XnNABKfIYKSimQVvKc9FnlC2H0LurOhd9MS6l0Z67lE=",
"rev": "6c95c0b6f73f831226453fc6905c216ab634c30f",
"type": "tarball",
"url": "https://git.lix.systems/api/v1/repos/lix-project/nixos-module/archive/6c95c0b6f73f831226453fc6905c216ab634c30f.tar.gz?rev=6c95c0b6f73f831226453fc6905c216ab634c30f"
},
"original": {
"type": "tarball",
"url": "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz"
}
},
"lix-module-unstable": {
"inputs": {
"flake-utils": "flake-utils_3",
"flakey-profile": "flakey-profile_2",
"lix": [
"lix"
],
"nixpkgs": [
"nixpkgs-unstable-raw"
]
},
"locked": {
"lastModified": 1764519849,
"narHash": "sha256-XnNABKfIYKSimQVvKc9FnlC2H0LurOhd9MS6l0Z67lE=",
"rev": "6c95c0b6f73f831226453fc6905c216ab634c30f",
"type": "tarball",
"url": "https://git.lix.systems/api/v1/repos/lix-project/nixos-module/archive/6c95c0b6f73f831226453fc6905c216ab634c30f.tar.gz?rev=6c95c0b6f73f831226453fc6905c216ab634c30f"
},
"original": {
"type": "tarball",
"url": "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz"
}
},
"nix-flatpak": {
"locked": {
"lastModified": 1754777568,
"narHash": "sha256-0bBqT+3XncgF8F03RFAamw9vdf0VmaDoIJLTGkjfQZs=",
"lastModified": 1711997375,
"narHash": "sha256-KvU4gOtuFMS9Il67glRGtdNfguAINT9pCaXtvCL8uI8=",
"owner": "gmodena",
"repo": "nix-flatpak",
"rev": "62f636b87ef6050760a8cb325cadb90674d1e23e",
"rev": "45bf66f7068db79b552da864c0e87452be624d6c",
"type": "github"
},
"original": {
@ -342,11 +197,11 @@
]
},
"locked": {
"lastModified": 1729697500,
"narHash": "sha256-VFTWrbzDlZyFHHb1AlKRiD/qqCJIripXKiCSFS8fAOY=",
"lastModified": 1690328911,
"narHash": "sha256-fxtExYk+aGf2YbjeWQ8JY9/n9dwuEt+ma1eUFzF8Jeo=",
"owner": "zhaofengli",
"repo": "nix-github-actions",
"rev": "e418aeb728b6aa5ca8c5c71974e7159c2df1d8cf",
"rev": "96df4a39c52f53cb7098b923224d8ce941b64747",
"type": "github"
},
"original": {
@ -358,11 +213,11 @@
},
"nix-impermanence": {
"locked": {
"lastModified": 1737831083,
"narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
"lastModified": 1708968331,
"narHash": "sha256-VUXLaPusCBvwM3zhGbRIJVeYluh2uWuqtj4WirQ1L9Y=",
"owner": "nix-community",
"repo": "impermanence",
"rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
"rev": "a33ef102a02ce77d3e39c25197664b7a636f9c30",
"type": "github"
},
"original": {
@ -378,11 +233,11 @@
]
},
"locked": {
"lastModified": 1765267181,
"narHash": "sha256-d3NBA9zEtBu2JFMnTBqWj7Tmi7R5OikoU2ycrdhQEws=",
"lastModified": 1713869268,
"narHash": "sha256-o3CMQeu/S8/4zU0pMtYg51rd1FWdJsI2Xohzng1Ysdg=",
"owner": "Mic92",
"repo": "nix-index-database",
"rev": "82befcf7dc77c909b0f2a09f5da910ec95c5b78f",
"rev": "dcb6ac44922858ce3a5b46f77a36d6030181460c",
"type": "github"
},
"original": {
@ -398,11 +253,11 @@
]
},
"locked": {
"lastModified": 1765267181,
"narHash": "sha256-d3NBA9zEtBu2JFMnTBqWj7Tmi7R5OikoU2ycrdhQEws=",
"lastModified": 1713869268,
"narHash": "sha256-o3CMQeu/S8/4zU0pMtYg51rd1FWdJsI2Xohzng1Ysdg=",
"owner": "Mic92",
"repo": "nix-index-database",
"rev": "82befcf7dc77c909b0f2a09f5da910ec95c5b78f",
"rev": "dcb6ac44922858ce3a5b46f77a36d6030181460c",
"type": "github"
},
"original": {
@ -413,11 +268,11 @@
},
"nixos-hardware": {
"locked": {
"lastModified": 1764440730,
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
"lastModified": 1713864415,
"narHash": "sha256-/BPDMJEkrsFAFOsQWhwm31wezlgshPFlLBn34KEUdVA=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
"rev": "797f8d8082c7cc3259cba7275c699d4991b09ecc",
"type": "github"
},
"original": {
@ -429,11 +284,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1763966396,
"narHash": "sha256-6eeL1YPcY1MV3DDStIDIdy/zZCDKgHdkCmsrLJFiZf0=",
"lastModified": 1712963716,
"narHash": "sha256-WKm9CvgCldeIVvRz87iOMi8CFVB1apJlkUT4GGvA0iM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5ae3b07d8d6527c42f17c876e404993199144b6a",
"rev": "cfd6b5fc90b15709b780a5a1619695a88505a176",
"type": "github"
},
"original": {
@ -445,26 +300,26 @@
},
"nixpkgs-raw": {
"locked": {
"lastModified": 1765838191,
"narHash": "sha256-m5KWt1nOm76ILk/JSCxBM4MfK3rYY7Wq9/TZIIeGnT8=",
"lastModified": 1713995372,
"narHash": "sha256-fFE3M0vCoiSwCX02z8VF58jXFRj9enYUSTqjyHAjrds=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c6f52ebd45e5925c188d1a20119978aa4ffd5ef6",
"rev": "dd37924974b9202f8226ed5d74a252a9785aedf8",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-25.11",
"ref": "nixos-23.11",
"type": "indirect"
}
},
"nixpkgs-unstable-raw": {
"locked": {
"lastModified": 1765779637,
"narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=",
"lastModified": 1713895582,
"narHash": "sha256-cfh1hi+6muQMbi9acOlju3V1gl8BEaZBXBR9jQfQi4U=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "1306659b587dc277866c7b69eb97e5f07864d8c4",
"rev": "572af610f6151fd41c212f897c71f7056e3fb518",
"type": "github"
},
"original": {
@ -473,6 +328,21 @@
"type": "indirect"
}
},
"nur": {
"locked": {
"lastModified": 1714114197,
"narHash": "sha256-f1kMNBUgbY+2/N0YkeouGNYdL7HVsRgcQLf5zL/ayd0=",
"owner": "nix-community",
"repo": "NUR",
"rev": "10fc1b8b048fe797ada9302f700590afb457dde2",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "NUR",
"type": "github"
}
},
"plasma-manager": {
"inputs": {
"home-manager": [
@ -483,15 +353,16 @@
]
},
"locked": {
"lastModified": 1763909441,
"narHash": "sha256-56LwV51TX/FhgX+5LCG6akQ5KrOWuKgcJa+eUsRMxsc=",
"owner": "nix-community",
"lastModified": 1714390161,
"narHash": "sha256-hWPGLUGNr7IR2FT4xS0VlhTW3S6xpw0hU3LJJC3CaKo=",
"owner": "toast003",
"repo": "plasma-manager",
"rev": "b24ed4b272256dfc1cc2291f89a9821d5f9e14b4",
"rev": "d9754f6f5dcf96969ad40496326213d5344846e5",
"type": "github"
},
"original": {
"owner": "nix-community",
"owner": "toast003",
"ref": "libinput",
"repo": "plasma-manager",
"type": "github"
}
@ -500,15 +371,10 @@
"inputs": {
"agenix": "agenix",
"catppuccin": "catppuccin",
"catppuccin-konsole": "catppuccin-konsole",
"copyparty": "copyparty",
"eza-themes": "eza-themes",
"catppuccin-vsc": "catppuccin-vsc",
"home-manager": "home-manager_2",
"home-manager-unstable": "home-manager-unstable",
"jovian": "jovian",
"lix": "lix",
"lix-module": "lix-module",
"lix-module-unstable": "lix-module-unstable",
"nix-flatpak": "nix-flatpak",
"nix-impermanence": "nix-impermanence",
"nix-index-db": "nix-index-db",
@ -516,45 +382,26 @@
"nixos-hardware": "nixos-hardware",
"nixpkgs-raw": "nixpkgs-raw",
"nixpkgs-unstable-raw": "nixpkgs-unstable-raw",
"nur": "nur",
"plasma-manager": "plasma-manager",
"secrets": "secrets",
"sops-nix": "sops-nix"
"vscode-extensions": "vscode-extensions"
}
},
"secrets": {
"flake": false,
"locked": {
"lastModified": 1766143747,
"narHash": "sha256-bG4QoCZLUDrubYFuRvxiXhycBD3R+UjrzXrNZ+qRnio=",
"lastModified": 1713910881,
"narHash": "sha256-MZ1+GmZL3V3Kqe4YrxPA2W8vrF/c+f7sYOpf+jw6ESc=",
"ref": "refs/heads/main",
"rev": "8921f23861a82f0f8d706c276bc738ca72c053b1",
"revCount": 41,
"rev": "918b61f3ee194d7e67fa1d3200b64fe7741dd24a",
"revCount": 15,
"type": "git",
"url": "ssh://forgejo@git.toast003.xyz:4222/Toast/nix-secrets"
"url": "ssh://forgejo@git.everest.sable-pancake.ts.net:4222/Toast/nix-secrets"
},
"original": {
"type": "git",
"url": "ssh://forgejo@git.toast003.xyz:4222/Toast/nix-secrets"
}
},
"sops-nix": {
"inputs": {
"nixpkgs": [
"nixpkgs-unstable-raw"
]
},
"locked": {
"lastModified": 1765836173,
"narHash": "sha256-hWRYfdH2ONI7HXbqZqW8Q1y9IRbnXWvtvt/ONZovSNY=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "443a7f2e7e118c4fc63b7fae05ab3080dd0e5c63",
"type": "github"
},
"original": {
"owner": "Mic92",
"repo": "sops-nix",
"type": "github"
"url": "ssh://forgejo@git.everest.sable-pancake.ts.net:4222/Toast/nix-secrets"
}
},
"systems": {
@ -587,18 +434,25 @@
"type": "github"
}
},
"systems_3": {
"vscode-extensions": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs-unstable-raw"
]
},
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"lastModified": 1714094499,
"narHash": "sha256-SC6tm901h2tzRxd6hfzn5/bgLJ8R4ng39R7SIkg6wlo=",
"owner": "nix-community",
"repo": "nix-vscode-extensions",
"rev": "e05ff96b9f710d57d7cd60641f0273176debf222",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"owner": "nix-community",
"repo": "nix-vscode-extensions",
"type": "github"
}
}

247
flake.nix
View file

@ -3,10 +3,10 @@
inputs = {
secrets = {
url = "git+ssh://forgejo@git.toast003.xyz:4222/Toast/nix-secrets";
url = "git+ssh://forgejo@git.everest.sable-pancake.ts.net:4222/Toast/nix-secrets";
flake = false;
};
nixpkgs-raw.url = "nixpkgs/nixos-25.11";
nixpkgs-raw.url = "nixpkgs/nixos-23.11";
nixpkgs-unstable-raw.url = "nixpkgs/nixos-unstable";
agenix = {
@ -16,13 +16,9 @@
darwin.follows = ""; # Not using this on MacOS, so this doesn't pull it's dependencies
};
};
sops-nix = {
url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs-unstable-raw";
};
home-manager = {
url = "github:nix-community/home-manager/release-25.11";
url = "github:nix-community/home-manager/release-23.11";
inputs.nixpkgs.follows = "nixpkgs-raw";
};
@ -40,9 +36,6 @@
nix-impermanence.url = "github:nix-community/impermanence";
copyparty.url = "github:9001/copyparty";
copyparty.inputs.nixpkgs.follows = "nixpkgs-raw";
/*
These are the same input, just following different nixpkgs versions
This avoids some wierdness when using one that follows unstable on a stable nixpkgs
@ -58,41 +51,22 @@
};
plasma-manager = {
url = "github:nix-community/plasma-manager/";
url = "github:toast003/plasma-manager/libinput";
inputs.nixpkgs.follows = "nixpkgs-unstable-raw";
inputs.home-manager.follows = "home-manager-unstable";
};
catppuccin-vsc.url = "github:catppuccin/vscode";
vscode-extensions = {
url = "github:nix-community/nix-vscode-extensions";
inputs.nixpkgs.follows = "nixpkgs-unstable-raw";
};
nix-flatpak.url = "github:gmodena/nix-flatpak/main";
nur.url = "github:nix-community/NUR";
catppuccin.url = "github:catppuccin/nix";
lix-module = {
url = "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz";
inputs.nixpkgs.follows = "nixpkgs-raw";
inputs.lix.follows = "lix";
};
lix-module-unstable = {
url = "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz";
inputs.nixpkgs.follows = "nixpkgs-unstable-raw";
inputs.lix.follows = "lix";
};
# Non flake inputs / random things
lix = {
url = "https://git.lix.systems/lix-project/lix/archive/main.tar.gz";
flake = false;
};
eza-themes = {
url = "github:eza-community/eza-themes";
flake = false;
};
catppuccin-konsole = {
url = "github:catppuccin/konsole";
flake = false;
};
};
outputs = {...} @ inputs:
@ -103,30 +77,28 @@
nixpkgs-unstable-patched = nixpkgs-raw.legacyPackages.x86_64-linux.applyPatches {
name = "patched-nixpkgs-unstable";
src = nixpkgs-unstable-raw;
patches = [
./nixpkgs-patches/pr471291.patch
./nixpkgs-patches/revert-mangohud-update.patch
];
patches = [];
};
nixpkgs-patched = nixpkgs-raw.legacyPackages.x86_64-linux.applyPatches {
name = "patched-nixpkgs";
src = nixpkgs-raw;
patches = [
./nixpkgs-patches/0001-catppuccin-add-grub-theme.patch
./nixpkgs-patches/0002-catppuccin-add-starship-theme.patch
];
};
# https://discourse.nixos.org/t/proper-way-of-applying-patch-to-system-managed-via-flake/21073/26
nixpkgs-unstable = (import "${nixpkgs-unstable-patched}/flake.nix").outputs {self = inputs.nixpkgs-unstable-raw;};
nixpkgs = (import "${nixpkgs-patched}/flake.nix").outputs {self = inputs.nixpkgs-raw;};
nixpkgs-unstable = (import "${nixpkgs-unstable-patched}/flake.nix").outputs {self = inputs.self;};
nixpkgs = (import "${nixpkgs-patched}/flake.nix").outputs {self = inputs.self;};
in {
formatter.x86_64-linux = nixpkgs-unstable.legacyPackages.x86_64-linux.alejandra;
devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShellNoCC {
devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell {
name = "toast-devshell";
# The agenix cli is not needed to activate a configuration, so instead of installing it
# I'll just add it to de devShell, since that's the only real time I'm going to use it.
packages = with nixpkgs.legacyPackages.x86_64-linux; [
agenix.packages.x86_64-linux.default
git
nvd
nix-output-monitor
nix-diff
just
@ -136,104 +108,117 @@
export PS1="$PS1(toast-configs)> "
'';
};
overlays.default = final: prev: {
kasane-teto-cursor = final.callPackage ./pkgs/kasane-teto-cursor {};
kame-editor = final.callPackage ./pkgs/kame-editor {};
kame-tools = final.callPackage ./pkgs/kame-tools {};
rstmcpp = final.callPackage ./pkgs/rstmcpp {};
};
packages = {
x86_64-linux = with import nixpkgs-unstable-raw {
system = "x86_64-linux";
overlays = [self.overlays.default];
}; {
inherit kasane-teto-cursor kame-editor kame-tools rstmcpp;
x86_64-linux = with import nixpkgs-unstable-raw {system = "x86_64-linux";}; {
anything-sync-daemon = callPackage ./pkgs/anything-sync-daemon {};
discord-krisp-fixer = callPackage ./pkgs/discord-krisp-fixer {};
};
};
nixosConfigurations = let
mkSystems = hosts:
builtins.mapAttrs (
host: settings: let
pkgs =
if isStable
then nixpkgs
else nixpkgs-unstable;
isStable = (settings ? stable) && (settings.stable == true);
in
mkSystem host settings.modules pkgs isStable
)
hosts;
mkSystem = host: modules: pkgs: stable:
pkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
flakeSelf = self;
};
lib = import ./lib {nixpkgs = pkgs;};
modules =
[
agenix.nixosModules.default
sops-nix.nixosModules.sops
(
if stable
then home-manager
else home-manager-unstable
)
.nixosModules
.home-manager
(
if stable
then nix-index-db
else nix-index-db-unstable
)
.nixosModules
.nix-index
catppuccin.nixosModules.catppuccin
(
if stable
then lix-module
else lix-module-unstable
)
.nixosModules
.default
./roles/common
(./machines + "/${host}")
]
++ modules;
nixosConfigurations = {
Archie = nixpkgs-unstable.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
systemPkgs = inputs.nixpkgs-unstable-raw;
flakeSelf = self;
};
in
mkSystems {
Archie.modules = [
nixos-hardware.nixosModules.common-cpu-amd-zenpower
/*
I used to set up nixpkgs in the flake, but doing that made
defining overlays in modules impossible (or at least I could
not figure out how)
Also has nice side effect of making it easier to add new systems :3
*/
modules = [
agenix.nixosModules.default
home-manager-unstable.nixosModule
nix-index-db-unstable.nixosModules.nix-index
catppuccin.nixosModules.catppuccin
./roles/common
./roles/desktop
./roles/kde
./roles/gaming
./roles/school
./machines/Archie
];
SurfaceGo.modules = [
};
SurfaceGo = nixpkgs-unstable.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
systemPkgs = inputs.nixpkgs-unstable-raw;
flakeSelf = self;
};
modules = [
agenix.nixosModules.default
home-manager-unstable.nixosModule
nixos-hardware.nixosModules.microsoft-surface-go
nix-index-db-unstable.nixosModules.nix-index
catppuccin.nixosModules.catppuccin
./roles/common
./roles/desktop
./roles/kde
./machines/SurfaceGo
];
SteamDeck.modules = [
jovian.nixosModules.default
./roles/desktop
./roles/kde
./roles/gaming
];
WinMax2.modules = [
nixos-hardware.nixosModules.gpd-win-max-2-2023
./roles/desktop
./roles/kde
./roles/gaming
];
Everest = {
stable = true;
modules = [
copyparty.nixosModules.default
./roles/server
];
};
};
SteamDeck = nixpkgs-unstable.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
systemPkgs = inputs.nixpkgs-unstable-raw;
flakeSelf = self;
};
modules = [
agenix.nixosModules.default
jovian.nixosModules.default
home-manager-unstable.nixosModule
nix-index-db-unstable.nixosModules.nix-index
catppuccin.nixosModules.catppuccin
./roles/common
./roles/desktop
./roles/kde
./roles/gaming
./roles/school
./machines/SteamDeck
];
};
WinMax2 = nixpkgs-unstable.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
systemPkgs = inputs.nixpkgs-unstable-raw;
flakeSelf = self;
};
modules = [
agenix.nixosModules.default
jovian.nixosModules.default
home-manager-unstable.nixosModule
nix-index-db-unstable.nixosModules.nix-index
nixos-hardware.nixosModules.gpd-win-max-2-2023
catppuccin.nixosModules.catppuccin
./roles/common
./roles/desktop
./roles/kde
./roles/gaming
./roles/school
./machines/WinMax2
];
};
Everest = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
specialArgs = {
systemPkgs = inputs.nixpkgs-raw;
flakeSelf = self;
};
modules = [
agenix.nixosModules.default
home-manager.nixosModule
nix-index-db.nixosModules.nix-index
catppuccin.nixosModules.catppuccin
./roles/common
./roles/server
./machines/Everest
];
};
};
};
}

View file

@ -1,10 +0,0 @@
{nixpkgs}:
nixpkgs.lib.extend (final: prev: {
toast = let
importLib = file: import file {lib = final;};
in {
patches = importLib ./patches.nix;
networkManager = importLib ./networkManager.nix;
syncthing = importLib ./syncthing.nix;
};
})

View file

@ -1,23 +0,0 @@
{lib}: {
/**
Make a NetworkManager wifi profile, to be used with ensureProfiles
*/
mkWifiProfile = {
id,
ssid,
priority ? 0,
wifi-security,
}: {
connection = {
inherit id;
type = "wifi";
autoconnect-priority = priority;
};
ipv4.method = "auto";
wifi = {
mode = "infrastructure";
inherit ssid;
};
inherit wifi-security;
};
}

View file

@ -1,13 +0,0 @@
{lib}: {
/**
Get a list of patches from a path.
*/
patchesInPath = path: let
pathContents = builtins.readDir path;
filter = name: value:
(value == "regular" || value == "symlink") && lib.strings.hasSuffix ".patch" name;
filteredContents = lib.attrsets.filterAttrs filter pathContents;
patchFilenames = builtins.attrNames filteredContents;
in
builtins.map (value: lib.path.append path value) patchFilenames;
}

View file

@ -1,5 +0,0 @@
{lib}: let
data = import ./../syncthing.nix;
in {
devices = builtins.getAttr "devices" data;
}

View file

@ -14,28 +14,27 @@
# Enable support for the Xbox One wireless dongle
hardware.xone.enable = true;
boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "usbhid" "nvme" "sd_mod"];
boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod"];
boot.initrd.kernelModules = ["amdgpu"];
boot.kernelModules = ["kvm-amd"];
boot.extraModulePackages = [];
boot.extraModprobeConfig = "options snd_hda_intel power_save=0";
fileSystems."/" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=@root"];
options = ["subvol=@root" "compress=zstd"];
};
fileSystems."/nix" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=@nix"];
options = ["subvol=@nix" "compress=zstd"];
};
fileSystems."/boot" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=@boot"];
options = ["subvol=@boot" "compress=zstd"];
};
fileSystems."/boot/efi" = {
@ -54,12 +53,6 @@
fsType = config.fileSystems."/".fsType;
options = ["subvolid=5" "ro"];
};
"/mnt/hdd" = {
# device = "/dev/disk/by-id/ata-SAMSUNG_HD103SI_S1Y5J9CZA19763-part1";
label = "Archie\\x20HDD";
fsType = "bcachefs";
options = ["x-systemd.automount"];
};
"/mnt/windows" = {
device = "/dev/disk/by-uuid/B61AFDAC1AFD6A2F";
fsType = "ntfs3";
@ -69,12 +62,12 @@
"/home" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=@home"];
options = ["subvol=@home" "compress=zstd"];
};
"/persist" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=@persist"];
options = ["subvol=@persist" "compress=zstd"];
neededForBoot = true;
};
};

View file

@ -22,22 +22,18 @@
wakeOnLan.enable = true;
ipv4.addresses = [
{
address = "192.168.1.160";
address = "192.168.0.160";
prefixLength = 24;
}
];
};
# I use networkd, so I need to declare the interface for the default gateway
defaultGateway = {
address = "192.168.1.1";
address = "192.168.0.1";
interface = "eno1";
};
nameservers = ["9.9.9.9"];
};
systemd.network.wait-online.extraArgs = ["--dns"];
time.timeZone = "Europe/Madrid";
services.automatic-timezoned.enable = lib.mkForce false;
# Define a user account. Don't forget to set a password with passwd.
users.users.toast = {
@ -57,4 +53,11 @@
};
};
};
# Open ports in the firewall.
# No idea what ports 5201 and 21027 do tho
networking.firewall.allowedTCPPorts = [5201];
networking.firewall.allowedUDPPorts = [5201 21027];
# Or disable the firewall altogether.
# networking.firewall.enable = false;
}

View file

@ -23,9 +23,9 @@
options = ["compress=zstd" "subvol=@"];
};
"/nix" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
device = "/dev/disk/by-label/Everest";
fsType = "btrfs";
options = ["subvol=@nix-server"];
options = ["compress=zstd" "subvol=@nix"];
};
"/home" = {
device = "/dev/disk/by-label/Everest";
@ -37,11 +37,6 @@
fsType = "btrfs";
options = ["compress=zstd" "subvol=/" "ro"];
};
"/mnt/ssd" = {
device = "/dev/disk/by-uuid/5322c217-b87b-4150-8b4c-a8fa17a899bf";
fsType = "btrfs";
options = ["subvol=/" "ro"];
};
"/persist" = {
device = "/dev/disk/by-label/Everest";
fsType = "btrfs";
@ -51,7 +46,7 @@
};
fileSystems."/boot/efi" = {
device = "/dev/disk/by-uuid/FB87-4CBC";
device = "/dev/disk/by-label/Boot";
fsType = "vfat";
};

View file

@ -39,7 +39,7 @@
enable = true;
autoStart = true;
user = "toast";
desktopSession = "plasma";
desktopSession = "plasmawayland";
};
decky-loader = {
enable = true;

View file

@ -45,13 +45,6 @@ in {
fsType = "btrfs";
options = ["subvol=@" "compress=zstd"];
};
"btrfs_persist" = {
mountPoint = "/persist";
label = ssdLabel;
fsType = "btrfs";
options = ["subvol=@persist"];
neededForBoot = true;
};
"btrfs_boot" = {
mountPoint = "/boot";
label = ssdLabel;

View file

@ -7,19 +7,16 @@
lib,
...
}: {
# Use grub boot loader
boot = {
loader = {
systemd-boot.enable = false;
limine = {
grub = {
enable = true;
enableEditor = true;
secureBoot.enable = true;
extraConfig = ''
timeout: 3
'';
style = {
graphicalTerminal.font.scale = "2x2";
};
device = "nodev";
efiSupport = true;
# No other OS on here :P
useOSProber = false;
};
efi = {
efiSysMountPoint = config.fileSystems."efi_boot_partition".mountPoint;
@ -36,29 +33,24 @@
kernelPackages = pkgs.linuxPackages_latest;
};
catppuccin.limine.enable = true;
networking.hostName = "WinMax2"; # Define your hostname.
specialisation.noAVX512.configuration = {
# For some reason The Finals crashes on CPUs that support AVX512
boot.kernelParams = ["clearcpuid=304"];
};
# Sleep fixes
boot.kernelParams = ["rtc_cmos.use_acpi_alarm=1" "panic=5"];
boot.kernelParams = ["rtc_cmos.use_acpi_alarm=1"];
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="i2c", ATTR{name}=="GXTP7385:00", ATTR{power/wakeup}="disabled"
ACTION=="add", SUBSYSTEM=="i2c", ATTR{name}=="PNP0C50:00", ATTR{power/wakeup}="disabled"
SUBSYSTEM=="usb", ATTR{idVendor}=="2541", ATTR{idProduct}=="9711", ATTR{remove}="1"
'';
services = {
hardware.bolt.enable = true;
handheld-daemon = {
enable = true;
ui = {
enable = true;
};
user = "toast";
};
# Input plumber conflicts with hhd, and it doesn't let me use mouse mode
inputplumber.enable = lib.mkForce false;
services.handheld-daemon = {
enable = true;
user = "toast";
};
# Allow unfree packages
@ -70,6 +62,29 @@
services = {
xserver.xkb.layout = lib.mkForce "us";
displayManager.sddm.settings = {
General.GreeterEnvironment = "QT_SCREEN_SCALE_FACTORS=2";
};
};
jovian = {
# Steam Deck UI settings
steam = {
enable = true;
autoStart = false;
user = "toast";
desktopSession = "plasmawayland";
};
hardware.amd.gpu.enableBacklightControl = true;
# Need patched mesa
steamos = {
enableMesaPatches = true;
enableVendorRadv = true;
};
decky-loader = {
enable = true;
package = pkgs.decky-loader-prerelease;
};
};
# Enable bluetooth
@ -83,9 +98,23 @@
# Enable CUPS to print documents.
# services.printing.enable = true;
environment.sessionVariables = {
STEAM_FORCE_DESKTOPUI_SCALING = "2";
};
home-manager.sharedModules = [
{
programs.plasma.input.keyboard.layouts = lib.mkForce [{layout = "us";} {layout = "es";}];
# Steam's hidpi support is bugged so it needds to be hardcoded
# This bypasses that
xdg.desktopEntries = {
steam-noScaling = {
name = "Steam (No Scaling)";
exec = "env STEAM_FORCE_DESKTOPUI_SCALING=0 steam %U";
icon = "steam";
categories = ["Network" "FileTransfer" "Game"];
comment = "Application for managing and playing games on Steam";
};
};
programs.plasma.input.keyboard.layouts = lib.mkForce ["us"];
}
];
@ -129,13 +158,4 @@
# (/run/current-system/configuration.nix). This is useful in case you
# accidentally delete configuration.nix.
# system.copySystemConfiguration = true;
specialisation.bootDebug.configuration = {
boot.kernelParams = [
"systemd.debug-shell=1"
"systemd.log_level=debug"
"systemd.log_target=kmsg"
"log_buf_len=1M"
"printk.devkmsg=on"
];
};
}

View file

@ -78,10 +78,7 @@ in {
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware = {
cpu.amd = {
updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
ryzen-smu.enable = true;
};
cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
sensor.iio.bmi260.enable = true;
};
}

View file

@ -0,0 +1,49 @@
From 316d5e8f356d6817626bca5a37dd587418afc856 Mon Sep 17 00:00:00 2001
From: BlankParticle <blankparticle@gmail.com>
Date: Tue, 21 Nov 2023 18:14:15 +0530
Subject: [PATCH 1/2] catppuccin: add grub theme
---
pkgs/data/themes/catppuccin/default.nix | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/pkgs/data/themes/catppuccin/default.nix b/pkgs/data/themes/catppuccin/default.nix
index 59e030eb9e0e..e8cdb0456d17 100644
--- a/pkgs/data/themes/catppuccin/default.nix
+++ b/pkgs/data/themes/catppuccin/default.nix
@@ -1,5 +1,5 @@
let
- validThemes = [ "bat" "bottom" "btop" "hyprland" "k9s" "kvantum" "lazygit" "plymouth" "refind" "rofi" "waybar" ];
+ validThemes = [ "bat" "bottom" "btop" "grub" "hyprland" "k9s" "kvantum" "lazygit" "plymouth" "refind" "rofi" "waybar" ];
in
{ fetchFromGitHub
, lib
@@ -40,6 +40,14 @@ let
hash = "sha256-J3UezOQMDdxpflGax0rGBF/XMiKqdqZXuX4KMVGTxFk=";
};
+ grub = fetchFromGitHub {
+ name = "grub";
+ owner = "catppuccin";
+ repo = "grub";
+ rev = "v1.0.0";
+ hash = "sha256-/bSolCta8GCZ4lP0u5NVqYQ9Y3ZooYCNdTwORNvR7M0=";
+ };
+
hyprland = fetchFromGitHub {
name = "hyprland";
owner = "catppuccin";
@@ -140,6 +148,10 @@ stdenvNoCC.mkDerivation {
mkdir -p $out/bottom
cp "${sources.bottom}/themes/${variant}.toml" "$out/bottom/"
+ '' + lib.optionalString (lib.elem "grub" themeList) ''
+ mkdir -p $out/grub
+ cp -r ${sources.grub}/src/catppuccin-${variant}-grub-theme/* "$out/grub/"
+
'' + lib.optionalString (lib.elem "hyprland" themeList) ''
mkdir -p $out/hyprland
cp "${sources.hyprland}/themes/${variant}.conf" "$out/hyprland/"
--
2.42.0

View file

@ -0,0 +1,49 @@
From 93af02433861cd32221164ddb4fc03b19cbf776b Mon Sep 17 00:00:00 2001
From: Toast <39011842+toast003@users.noreply.github.com>
Date: Sat, 13 Jan 2024 18:41:51 +0100
Subject: [PATCH 2/2] catppuccin: add starship theme
---
pkgs/data/themes/catppuccin/default.nix | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/pkgs/data/themes/catppuccin/default.nix b/pkgs/data/themes/catppuccin/default.nix
index e8cdb0456d17..6ac8cc541ad3 100644
--- a/pkgs/data/themes/catppuccin/default.nix
+++ b/pkgs/data/themes/catppuccin/default.nix
@@ -1,5 +1,5 @@
let
- validThemes = [ "bat" "bottom" "btop" "grub" "hyprland" "k9s" "kvantum" "lazygit" "plymouth" "refind" "rofi" "waybar" ];
+ validThemes = [ "bat" "bottom" "btop" "grub" "hyprland" "k9s" "kvantum" "lazygit" "plymouth" "refind" "rofi" "starship" "waybar" ];
in
{ fetchFromGitHub
, lib
@@ -104,6 +104,14 @@ let
hash = "sha256-DNorfyl3C4RBclF2KDgwvQQwixpTwSRu7fIvihPN8JY=";
};
+ starship = fetchFromGitHub {
+ name = "starship";
+ owner = "catppuccin";
+ repo = "starship";
+ rev = "5629d2356f62a9f2f8efad3ff37476c19969bd4f";
+ hash = "sha256-nsRuxQFKbQkyEI4TXgvAjcroVdG+heKX5Pauq/4Ota0=";
+ };
+
waybar = fetchFromGitHub {
name = "waybar";
owner = "catppuccin";
@@ -183,6 +191,10 @@ stdenvNoCC.mkDerivation {
cp ${sources.refind}/${variant}.conf $out/refind/
cp -r ${sources.refind}/assets/${variant} $out/refind/assets/
+ '' + lib.optionalString (lib.elem "starship" themeList) ''
+ mkdir -p $out/starship
+ cp ${sources.starship}/palettes/${variant}.toml $out/starship/
+
'' + lib.optionalString (lib.elem "waybar" themeList) ''
mkdir -p $out/waybar
cp ${sources.waybar}/${variant}.css $out/waybar/
--
2.42.0

View file

@ -1,61 +0,0 @@
From ef52b16862caa43dd4abc0aedf1814796342b664 Mon Sep 17 00:00:00 2001
From: K900 <me@0upti.me>
Date: Tue, 16 Dec 2025 11:48:37 +0300
Subject: [PATCH] kdePackages.plasma-vault: refresh patch
No idea how this happened.
---
.../plasma/plasma-vault/hardcode-paths.patch | 26 +++++++++----------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/pkgs/kde/plasma/plasma-vault/hardcode-paths.patch b/pkgs/kde/plasma/plasma-vault/hardcode-paths.patch
index d8a5f4a025de3..090df77eb15b0 100644
--- a/pkgs/kde/plasma/plasma-vault/hardcode-paths.patch
+++ b/pkgs/kde/plasma/plasma-vault/hardcode-paths.patch
@@ -1,5 +1,5 @@
diff --git a/kded/engine/backends/cryfs/cryfsbackend.cpp b/kded/engine/backends/cryfs/cryfsbackend.cpp
-index f425eb3..5b8cd43 100644
+index 64138b6..5d249aa 100644
--- a/kded/engine/backends/cryfs/cryfsbackend.cpp
+++ b/kded/engine/backends/cryfs/cryfsbackend.cpp
@@ -207,7 +207,7 @@ QProcess *CryFsBackend::cryfs(const QStringList &arguments) const
@@ -44,7 +44,7 @@ index b992f6f..eb828dd 100644
QString GocryptfsBackend::getConfigFilePath(const Device &device) const
diff --git a/kded/engine/fusebackend_p.cpp b/kded/engine/fusebackend_p.cpp
-index 8763304..e6860d2 100644
+index 714b660..61d8bf5 100644
--- a/kded/engine/fusebackend_p.cpp
+++ b/kded/engine/fusebackend_p.cpp
@@ -90,7 +90,7 @@ QProcess *FuseBackend::process(const QString &executable, const QStringList &arg
@@ -57,19 +57,19 @@ index 8763304..e6860d2 100644
FutureResult<> FuseBackend::initialize(const QString &name, const Device &device, const MountPoint &mountPoint, const Vault::Payload &payload)
diff --git a/kded/engine/vault.cpp b/kded/engine/vault.cpp
-index c101079..67c8a83 100644
+index a7a4741..773b671 100644
--- a/kded/engine/vault.cpp
+++ b/kded/engine/vault.cpp
-@@ -485,7 +485,7 @@ FutureResult<> Vault::close()
- } else {
- // We want to check whether there is an application
- // that is accessing the vault
-- AsynQt::Process::getOutput(QStringLiteral("lsof"), {QStringLiteral("-t"), mountPoint().data()}) | cast<QString>() | onError([this] {
-+ AsynQt::Process::getOutput(QStringLiteral("@lsof@"), {QStringLiteral("-t"), mountPoint().data()}) | cast<QString>() | onError([this] {
- d->updateMessage(i18n("Unable to lock the vault because an application is using it"));
- }) | onSuccess([this](const QString &result) {
- // based on ksolidnotify.cpp
-@@ -538,7 +538,7 @@ FutureResult<> Vault::forceClose()
+@@ -490,7 +490,7 @@ FutureResult<> Vault::close()
+ } else {
+ // We want to check whether there is an application
+ // that is accessing the vault
+- AsynQt::Process::getOutput(QStringLiteral("lsof"), { QStringLiteral("-t"), mountPoint().data() })
++ AsynQt::Process::getOutput(QStringLiteral("@lsof@"), { QStringLiteral("-t"), mountPoint().data() })
+ | cast<QString>()
+ | onError([this] {
+ d->updateMessage(i18n("Unable to close the vault because an application is using it"));
+@@ -546,7 +546,7 @@ FutureResult<> Vault::forceClose()
using namespace AsynQt::operators;
AsynQt::await(

View file

@ -1,49 +0,0 @@
diff --git a/pkgs/tools/graphics/mangohud/default.nix b/pkgs/tools/graphics/mangohud/default.nix
index cf83d4254baa..992afd60d3cb 100644
--- a/pkgs/tools/graphics/mangohud/default.nix
+++ b/pkgs/tools/graphics/mangohud/default.nix
@@ -24,8 +24,10 @@
unzip,
wayland,
libXNVCtrl,
+ nlohmann_json,
spdlog,
libxkbcommon,
+ glew,
glfw,
libXrandr,
x11Support ? true,
@@ -93,14 +95,14 @@ let
in
stdenv.mkDerivation (finalAttrs: {
pname = "mangohud";
- version = "0.8.2";
+ version = "0.8.1";
src = fetchFromGitHub {
owner = "flightlessmango";
repo = "MangoHud";
tag = "v${finalAttrs.version}";
fetchSubmodules = true;
- hash = "sha256-BZ3R7D2zOlg69rx4y2FzzjpXuPOv913TOz9kSvRN+Wg=";
+ hash = "sha256-FvPhnOvcYE8vVB5R+ZRmuZxrC9U4GA338V7VAuUlHCE=";
};
outputs = [
@@ -188,6 +190,7 @@ stdenv.mkDerivation (finalAttrs: {
buildInputs = [
dbus
+ nlohmann_json
spdlog
]
++ lib.optional waylandSupport wayland
@@ -195,6 +198,7 @@ stdenv.mkDerivation (finalAttrs: {
++ lib.optional nvidiaSupport libXNVCtrl
++ lib.optional (x11Support || waylandSupport) libxkbcommon
++ lib.optionals mangoappSupport [
+ glew
glfw
libXrandr
];

View file

@ -0,0 +1,57 @@
{
stdenv,
lib,
fetchFromGitHub,
makeWrapper,
rsync,
gawk,
pv,
gnutar,
zstd,
util-linux,
coreutils,
gnugrep,
findutils,
}:
stdenv.mkDerivation rec {
pname = "anything-sync-daemon";
version = "6.0.0";
src = fetchFromGitHub {
owner = "graysky2";
repo = pname;
rev = "v${version}";
hash = "sha256-6nfaAMH5YgK6gimuZ8j1zWLTDOi11KIwW7Bf0Iwh7+I=";
};
patches = [./disableDaemonStopTargets.patch];
nativeBuildInputs = [makeWrapper];
postPatch = ''
substituteInPlace init/asd* \
--replace /usr/bin/anything-sync-daemon $out/bin/anything-sync-daemon
'';
enableParallelBuilding = true;
makeFlags = [
"DESTDIR=${placeholder "out"}"
"PREFIX="
"INITDIR_SYSTEMD=/lib/systemd/system"
];
installTargets = ["install-systemd-all"];
postInstall = ''
wrapProgram $out/bin/anything-sync-daemon \
--suffix PATH : ${lib.makeBinPath [rsync gawk pv gnutar zstd util-linux coreutils gnugrep findutils]}
'';
meta = with lib; {
description = "Symlinks and syncs user specified dirs to RAM";
homepage = "https://github.com/graysky2/anything-sync-daemon/";
license = lib.licenses.mit;
platforms = platforms.linux;
};
}

View file

@ -0,0 +1,23 @@
diff --git a/Makefile b/Makefile
index ddf2d73..827ea8f 100644
--- a/Makefile
+++ b/Makefile
@@ -31,17 +31,7 @@ common/$(PN): Makefile common/$(PN).in
help: install
-stop-asd:
-ifneq ($(PREFIX), /usr)
- sudo -E asd unsync
-endif
-
-disable-systemd:
-ifeq ($(PREFIX), /usr)
- systemctl stop asd asd-resync || /bin/true
-endif
-
-install-bin: stop-asd disable-systemd common/$(PN)
+install-bin: common/$(PN)
$(Q)echo -e '\033[1;32mInstalling main script...\033[0m'
$(INSTALL_DIR) "$(DESTDIR)$(BINDIR)"
$(INSTALL_PROGRAM) common/$(PN) "$(DESTDIR)$(BINDIR)/$(PN)"

17
pkgs/discord-krisp-fixer Normal file
View file

@ -0,0 +1,17 @@
{ writeShellApplication
, rizin
, discord
}:
writeShellApplication rec {
name = "discord-krisp-fixer";
runtimeInputs = [ rizin ];
text = ''
discord_version="${discord.version}"
file="$HOME/.config/discord/$discord_version/modules/discord_krisp/discord_krisp.node"
addr=$(rz-find -x '4881ec00010000' "$file" | head -n1)
rizin -q -w -c "s $addr + 0x30 ; wao nop" "$file"
'';
}

View file

@ -1,59 +0,0 @@
{
lib,
stdenv,
fetchFromGitLab,
qt6,
portaudio,
kame-tools,
vgmstream,
rstmcpp,
}:
stdenv.mkDerivation rec {
name = "kame-editor";
version = "1.4.1";
src = fetchFromGitLab {
owner = "beelzy";
repo = name;
# tag = version;
rev = "82c9c445644b133b6d0ce3529e65b1a3df83c804";
hash = "sha256-V2nMvVIjFRM8++XQ9tkE2OiZzCvdrg0jK69HM+ZIVyA=";
};
postPatch = ''
substituteInPlace kame-editor.pro \
--replace-fail "/usr/local/bin/" "$out/bin"
'';
buildInputs = [
qt6.qtbase
portaudio
];
qtWrapperArgs = [
"--prefix PATH : ${
lib.makeBinPath [
kame-tools
vgmstream
rstmcpp
]
}"
];
nativeBuildInputs = [
qt6.qmake
qt6.wrapQtAppsHook
];
postBuild = ''
bash ./buildicons.sh
'';
postInstall = ''
mkdir -p $out/share/icons/hicolor
mkdir -p $out/share/applications
cp kame-editor.desktop $out/share/applications
cp -r icons/. $out/share/icons/hicolor
'';
}

View file

@ -1,29 +0,0 @@
{
stdenv,
fetchFromGitLab,
zip,
}:
stdenv.mkDerivation rec {
name = "kame-tools";
version = "a1fe47cc";
src = fetchFromGitLab {
owner = "beelzy";
repo = name;
rev = version;
fetchSubmodules = true;
hash = "sha256-ETl5f8M4OJPFB7NEq2mVuMm4RhBtAbMzlrvGHD14zXw=";
};
postPatch = ''
substituteInPlace buildtools/make_base \
--replace-fail "/usr/local/bin" "$out/bin"
'';
installPhase = ''
mkdir -p $out/bin
cp output/linux-x86_64/* $out/bin/
'';
nativeBuildInputs = [zip];
}

View file

@ -1,18 +0,0 @@
{
stdenvNoCC,
fetchzip,
}:
stdenvNoCC.mkDerivation {
name = "kasane-teto-cursors";
src = fetchzip {
url = "http://dl.everest.tailscale/Kasane%20Teto%20Cursor%20-%20by%20wobb.zip";
hash = "sha256-4neZqApkK6hwufLTilUtPmgzyBih7onSdSZ9lezQbIU=";
};
dontBuild = true;
installPhase = ''
mkdir -p $out/share/icons
cp -dr --no-preserve='ownership' $src/Linux/Kasane\ Teto $out/share/icons
'';
}

View file

@ -1,21 +0,0 @@
{
stdenv,
fetchFromGitLab,
}:
stdenv.mkDerivation rec {
name = "rstmcpp";
version = "fe8bee01";
src = fetchFromGitLab {
owner = "beelzy";
repo = name;
rev = version;
fetchSubmodules = true;
hash = "sha256-T9mxTBj/eykvbBkbmEKTUFldtBp3cJgWAbeu44SwxiM=";
};
installPhase = ''
mkdir -p $out/bin
cp rstmcpp $out/bin
'';
}

View file

@ -5,6 +5,7 @@
flakeSelf,
...
}: {
imports = [flakeSelf.inputs.nur.nixosModules.nur];
environment = {
# As of the 1st of May 2023, the default packages are nano, perl, rsync and strace
# I don't need any of them, so I just empty the list
@ -18,8 +19,6 @@
cleanOnBoot = !config.boot.tmp.useTmpfs;
};
environment.localBinInPath = lib.mkDefault true;
# Set up zram
zramSwap = {
enable = true;
@ -46,23 +45,6 @@
boot.supportedFilesystems = ["nfs"];
security.pki.certificates = [
# Caddy
''
-----BEGIN CERTIFICATE-----
MIIBqTCCAU+gAwIBAgIQceh0ZUBNrOmqLVsDr+2HBjAKBggqhkjOPQQDAjAzMTEw
LwYDVQQDEyhDYWRkeSAoRXZlcmVzdCkgbG9jYWwgQ0EgLSAyMDI0IEVDQyBSb290
MB4XDTI0MDcxODAwMDEwM1oXDTM0MDUyNzAwMDEwM1owMzExMC8GA1UEAxMoQ2Fk
ZHkgKEV2ZXJlc3QpIGxvY2FsIENBIC0gMjAyNCBFQ0MgUm9vdDBZMBMGByqGSM49
AgEGCCqGSM49AwEHA0IABJjrY8x6iDXncxG8exwLyaEq8N0XnCIbga8PVYiz3VLS
07++i0Dey9k68ag6KUZICfc8dX1uZ6/ozUZb4YO3xCSjRTBDMA4GA1UdDwEB/wQE
AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEBMB0GA1UdDgQWBBTQAqZS9KeiAr9mSPV9
RIJbSvRsTzAKBggqhkjOPQQDAgNIADBFAiBIgHrD2cUfNEctVx0WzHb0cLAsrK4Q
3QbyxPLyenR+dAIhAMOIAyxlKKKvAJMOzAg0r+csSVRdP1YHsHiE7U1GeHWx
-----END CERTIFICATE-----
''
];
# Set up localisation
i18n = {
defaultLocale = "en_US.UTF-8";
@ -84,26 +66,19 @@
};
};
services = {
fstrim.enable = true;
fwupd.enable = true;
};
services.fwupd.enable = true;
# Set up my user
users.mutableUsers = false;
users.users.toast = {
isNormalUser = true;
description = "Toast";
extraGroups = ["wheel"];
hashedPasswordFile = config.sops.secrets.toast.path;
};
# Set up time zone.
time.timeZone = lib.mkDefault "Europe/Madrid";
services.automatic-timezoned.enable = true;
time.timeZone = "Europe/Madrid";
nixpkgs.overlays = [
flakeSelf.outputs.overlays.default
(
final: prev: {
catppuccin = prev.catppuccin.override {
@ -120,29 +95,16 @@
)
];
catppuccin = {
flavor = "mocha";
accent = "mauve";
};
programs.iotop.enable = true;
catppuccin.flavour = "mocha";
home-manager = {
backupFileExtension = "hm-backup";
useGlobalPkgs = true;
verbose = true;
sharedModules = with flakeSelf; [
inputs.catppuccin.homeModules.catppuccin
inputs.sops-nix.homeManagerModules.sops
];
sharedModules = [flakeSelf.inputs.catppuccin.homeManagerModules.catppuccin];
users.toast = {osConfig, ...}: {
catppuccin.flavor = osConfig.catppuccin.flavor;
catppuccin.accent = osConfig.catppuccin.accent;
home.stateVersion = "25.05";
manual = {
manpages.enable = true;
html.enable = true;
};
catppuccin.flavour = osConfig.catppuccin.flavour;
home.stateVersion = "23.11";
xdg = {
enable = true;
userDirs = {
@ -151,7 +113,6 @@
publicShare = null; # Disable the public folder
};
};
systemd.user.startServices = true;
};
};
@ -161,16 +122,8 @@
"/persist/id_host"
];
};
sops = {
age.sshKeyPaths = ["/persist/id_host"];
defaultSopsFile = "${flakeSelf.inputs.secrets}/${config.networking.hostName}.yaml";
secrets.toast = {
sopsFile = "${flakeSelf.inputs.secrets}/passwd.yaml";
neededForUsers = true;
};
};
catppuccin.grub.enable = true;
boot.loader.grub.catppuccin.enable = true;
/*
I used to keep the host keys in the repo as a secret, but since I use the
@ -181,12 +134,9 @@
*/
system = {
stateVersion = "25.05";
stateVersion = "23.11";
# Nix on nixos 23.05 does not have dirtyRev
configurationRevision = flakeSelf.sourceInfo.rev or flakeSelf.sourceInfo.dirtyRev or "dirty";
nixos.variant_id = lib.mkDefault (lib.strings.toLower config.networking.hostName);
};
image.modules.iso = {
system.nixos.variant_id = "${lib.strings.toLower config.networking.hostName}-iso";
nixos.variant_id = lib.strings.toLower config.networking.hostName;
};
}

View file

@ -1,20 +1,14 @@
{...}: {
home-manager.users.toast = {
catppuccin.atuin.enable = true;
programs.atuin = {
enable = true;
settings = {
enter_accept = true;
workspaces = true;
filter_mode = "workspace";
style = "auto";
inline_height = 0;
stats = {
common_prefix = [
"sudo"
","
];
};
home-manager.users.toast.programs.atuin = {
enable = true;
settings = {
enter_accept = false;
workspaces = true;
stats = {
common_prefix = [
"sudo"
","
];
};
};
};

View file

@ -1,8 +1,8 @@
{...}: {
home-manager = {
users.toast = {
programs.bat.enable = true;
catppuccin.bat.enable = true;
users.toast.programs.bat = {
enable = true;
catppuccin.enable = true;
};
};
}

View file

@ -1,8 +1,10 @@
{...}: {
home-manager = {
users.toast = {
catppuccin.btop.enable = true;
programs.btop.enable = true;
programs.btop = {
enable = true;
catppuccin.enable = true;
};
};
};
}

View file

@ -2,6 +2,7 @@
imports = [
./htop.nix
./nix.nix
./micro.nix
./nix-index.nix
./command-not-found.nix
./comma.nix
@ -13,8 +14,6 @@
./helix.nix
./direnv.nix
./atuin.nix
./fish.nix
./eza.nix
];
# Some programs dont have a programs.*.enable option, so I install their package here
environment.systemPackages = with pkgs; [

View file

@ -1,10 +1,8 @@
{...}: {
home-manager.users.toast = {
programs.direnv = {
programs.direnv = {
enable = true;
nix-direnv = {
enable = true;
nix-direnv = {
enable = true;
};
};
};
}

View file

@ -1,20 +0,0 @@
{
flakeSelf,
config,
...
}: {
home-manager = {
users.toast = {
programs.eza = {
enable = true;
enableBashIntegration = true;
git = true;
icons = "auto";
extraOptions = [
"--group"
];
};
xdg.configFile."eza/theme.yml".source = "${flakeSelf.inputs.eza-themes}/themes/catppuccin.yml";
};
};
}

View file

@ -1,10 +0,0 @@
{...}: {
programs.fish = {
enable = true;
};
home-manager.users.toast = {
catppuccin.fish.enable = true;
programs.fish.enable = true;
};
}

View file

@ -1,25 +1,23 @@
{...}: {
programs.ssh.knownHosts = {
"[git.toast003.xyz]:4222".publicKey = ''
"[git.everest.sable-pancake.ts.net]:4222".publicKey = ''
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKoUcWx56NZ3kqydN3d0gLNz6SlBm1ArkHhqR9Fwd8qs
'';
};
home-manager.users.toast = {
programs.git = {
enable = true;
settings = {
user.name = "toast";
user.email = "toast003@tutamail.com";
userName = "Toast";
userEmail = "toast003@tutamail.com";
delta = {
enable = true;
catppuccin.enable = true;
};
extraConfig = {
init.defaultBranch = "main";
diff.colorMoved = "default";
commit.verbose = "true";
};
};
programs.delta = {
enable = true;
enableGitIntegration = true;
};
catppuccin.delta.enable = true;
};
}

View file

@ -3,20 +3,18 @@
config,
...
}: {
programs.nano.enable = false;
home-manager.users.toast = {
catppuccin.helix = {
enable = true;
useItalics = true;
};
programs.helix = {
enable = true;
defaultEditor = true;
extraPackages = with pkgs; [
nixpkgs-fmt
nil
taplo
];
catppuccin = {
enable = true;
useItalics = true;
};
settings = {
editor = {
mouse = true;
@ -29,8 +27,6 @@
select = "Select";
};
indent-guides.render = true;
end-of-line-diagnostics = "hint";
inline-diagnostics.cursor-line = "warning";
};
};
languages = {

View file

@ -0,0 +1,14 @@
{...}: {
home-manager = {
users.toast = {...}: {
programs.micro = {
enable = true;
settings = {
clipboard = "internal";
indentchar = "|";
softwrap = true;
};
};
};
};
}

View file

@ -1,4 +1,5 @@
{
systemPkgs,
config,
lib,
flakeSelf,
@ -19,8 +20,6 @@
'';
};
system.tools.nixos-option.enable = false;
nix = {
settings = {
auto-optimise-store = true;
@ -57,6 +56,11 @@
type = "github";
};
};
# Write the system's nixpkgs into the registry to avoid mixing nixpkgs versions
# https://dataswamp.org/~solene/2022-07-20-nixos-flakes-command-sync-with-system.html
system.flake = systemPkgs;
};
# I removed this in the past since I thought that I didn't need it, but turns out comma does :)
nixPath = ["nixpkgs=${systemPkgs}"];
};
}

View file

@ -1,31 +1,61 @@
{...}: {
{
pkgs,
lib,
...
}:
with lib;
with builtins; let
catppuccinFlavour = "mocha";
catppuccinStarship = pkgs.catppuccin + /starship/${catppuccinFlavour}.toml;
presets = {
nerdFontSymbols = pkgs.fetchurl {
url = "https://starship.rs/presets/toml/nerd-font-symbols.toml";
hash = "sha256-JKX+DKY4IPQwNj3znkhMUReNqbKBxdJyBZW+WCdKwuU=";
};
};
# -------------------------------- F U N C T I O N S --------------------------------
/*
Gonna be honest, I have no idea how this works, although it seems to work
Stolen from https://gist.github.com/pdalpra/daf339f59288201a6c8ba7dc84e9060e
*/
# Takes a list of attrSets and merges them
mergeAllAttrSets = attrsSets:
foldl' recursiveUpdate {} attrsSets;
# Reads a TOML file and parses it
readTomlPreset = file: (fromTOML (readFile file));
in {
programs.starship = {
enable = true;
presets = [
"nerd-font-symbols"
settings = mergeAllAttrSets [
(readTomlPreset presets.nerdFontSymbols)
(readTomlPreset catppuccinStarship)
{
nix_shell = {
disabled = false;
heuristic = true;
};
os = {
disabled = false;
};
directory = {
disabled = false;
truncation_length = 6;
truncation_symbol = ".../";
};
palette = "catppuccin_${catppuccinFlavour}";
}
];
settings = {
nix_shell = {
disabled = false;
heuristic = true;
};
os = {
disabled = false;
};
directory = {
disabled = false;
truncation_length = 6;
truncation_symbol = ".../";
};
};
};
# The catppuccin module only works for home-manager, so this
# sets up starship with home-manager using the system config
# home-manager.users.toast = {osConfig, ...}: {
# programs.starship = {
# enable = false;
# catppuccin.enable = true;
# settings = osConfig.programs.starship.settings;
# };
# };
home-manager.users.toast = {osConfig, ...}: {
programs.starship = {
enable = true;
catppuccin.enable = true;
settings = osConfig.programs.starship.settings;
};
};
}

View file

@ -1,6 +1,23 @@
{config, ...}: {
services.avahi = {
enable = true;
{config, ...}: let
old = {
nssmdns = true;
};
new = {
nssmdns4 = true;
};
in {
/*
NixOS 24.05 changed the option for mnds to be able to turn on/off IPv6
23.11 doesn't support this, so I need to use the conditional to be able to
use the same config for both
*/
services.avahi =
{
enable = true;
}
// (
if config.system.nixos.release == "23.11"
then old
else new
);
}

View file

@ -3,6 +3,5 @@
./avahi.nix
./tailscale.nix
./syncthing.nix
./kmscon.nix
];
}

View file

@ -1,29 +0,0 @@
{pkgs, ...}: {
services.kmscon = {
enable = true;
useXkbConfig = true;
fonts = [
{
name = "JetBrains Mono Nerd Font";
package = pkgs.nerd-fonts.jetbrains-mono;
}
];
extraConfig = ''
term=xterm-256color
font-size=10
'';
package = pkgs.kmscon.overrideAttrs (old: {
patches =
old.patches
++ [
# https://github.com/kmscon/kmscon/issues/133
(
pkgs.fetchpatch {
url = "https://github.com/Aetf/kmscon/pull/135.patch";
hash = "sha256-hJrKkONdQmz9gGMXbk11+4MF8Vn4guE3Bl1Ni6SGDw4=";
}
)
];
});
};
}

View file

@ -1,6 +1,5 @@
{
config,
lib,
flakeSelf,
...
}: let
@ -23,7 +22,32 @@ in {
urAccepted = 3;
};
# Set up devices and folders common to every device
devices = lib.toast.syncthing.devices;
devices = {
"phone" = {
name = "Xiaomi Redmi Note 10 Pro";
id = "K7KNZ5V-XREUADL-CROQXPV-6AA4H65-2VUD34Z-VQWKJ6S-LWWW4EE-XPNEZQ6";
};
"pc" = {
name = "Archie";
id = "NJPX754-64AQNP3-7GZFIRZ-W2EDRJQ-27ORWYM-X5YXEXQ-ERRTRTQ-BSYD4AY";
};
"steamdeck" = {
name = "Steam Deck";
id = "DNFEGEA-PDEVW5A-O5VBVQK-IUXI7J5-MAHCQAG-2JLEFFM-DSXB6AS-TX6ZHAN";
};
"server" = {
name = "Everest";
id = "2GXFZJZ-CF56ER2-SISBGOF-VNXJIG5-GQC6ECA-NHCHAPX-677RSJT-RI5POAZ";
};
"surface" = {
name = "Surface Go";
id = "HTVSF3O-AHY3TNH-BLVSEGK-HRRSMHC-H5LJWVF-NDKGM6O-ATWZALC-YXNV2Q4";
};
"winmax2" = {
name = "Win Max 2";
id = "X2NILRM-ADRBQ23-AFREAZA-62GVFDF-UVMPR4L-KGHMUNY-BJ2C3CQ-RBT43QS";
};
};
folders = {
"passwords" = {
label = "KeePassXC Passwords";
@ -33,8 +57,4 @@ in {
};
};
};
networking.firewall = {
allowedTCPPorts = [22000];
allowedUDPPorts = [22000 21027];
};
}

View file

@ -8,28 +8,10 @@
services.xserver.enable = true;
nix = {
daemonIOSchedClass = "idle";
daemonCPUSchedPolicy = "idle";
};
# Set up fonts
fonts.packages = with pkgs.nerd-fonts; [
hack
jetbrains-mono
# Japanese fonts
pkgs.noto-fonts-cjk-sans
pkgs.noto-fonts-cjk-serif
fonts.packages = [
(pkgs.nerdfonts.override {fonts = ["Hack" "JetBrainsMono"];})
];
# Already use electron apps (discord) so this only adds 20 mb more
environment.systemPackages = [pkgs.tetrio-desktop];
hardware.keyboard.qmk.enable = true;
home-manager.users.toast.home.packages = [pkgs.qmk];
home-manager.users.toast.xdg.autostart.enable = true;
boot.plymouth.enable = true;
}

View file

@ -2,14 +2,12 @@
imports = [
./discord.nix
./firefox.nix
./micro.nix
./keepassxc.nix
./jamesdsp.nix
./vscode.nix
./git.nix
./ssh.nix
./appimage.nix
./mpv.nix
./sysdvr-qt.nix
./spotify.nix
./distrobox.nix
];
}

View file

@ -1,59 +1,44 @@
{pkgs, ...}: let
{
pkgs,
lib,
...
}: let
discordOverlay = _self: super: {
discord = super.discord.override {
withOpenASAR = true;
withVencord = true;
};
# Update some stuff while I wait for nixpkgs
/*
vencord = super.vencord.overrideAttrs rec {
version = "522fdcd";
src = pkgs.fetchFromGitHub {
owner = "Vendicated";
repo = "Vencord";
rev = "522fdcd";
#rev = "v${version}";
hash = "sha256-9G7FNL4pHaaLachzJmeAol0WpNUj533K2FNa7DH0eBM=";
};
};
*/
};
in {
nixpkgs.overlays = [discordOverlay];
home-manager.users.toast = {
catppuccin.vesktop.enable = true;
programs.vesktop = {
enable = true;
settings = {
arRPC = true;
minimizeToTray = true;
discordBranch = "stable";
customTitleBar = true;
spellCheckLanguages = ["en-US" "en" "es"];
enableMenu = false;
};
vencord = {
settings = {
plugins = {
BetterGifPicker.enabled = true;
BetterSettings.enabled = true;
CallTimer.enabled = true;
ClearURLs.enabled = true;
FakeNitro.enabled = true;
FixSpotifyEmbeds.enabled = true;
FixYoutubeEmbeds.enabled = true;
FriendsSince.enabled = true;
iLoveSpam.enabled = true;
LoadingQuotes = {
enabled = true;
enableDiscordPresetQuotes = true;
};
MessageClickActions.enabled = true;
MessageLinkEmbeds.enabled = true;
MessageLogger.enabled = true;
Moyai = {
enabled = true;
volume = 1;
quality = "HD";
};
OpenInApp.enabled = true;
petpet.enabled = true;
PlatformIndicators.enabled = true;
ShowHiddenChannels.enabled = true;
ShowHiddenThings.enabled = true;
SpotifyControls.enabled = true;
Translate.enabled = true;
YoutubeAdblock.enabled = true;
};
};
};
stock-discord = _self: super: {
discord = super.discord.override {
withOpenASAR = false;
withVencord = false;
};
};
in {
# Sometimes discord breaks after updates, and launching it stock once fixes it
specialisation.stockDiscord.configuration = {
nixpkgs.overlays = lib.mkAfter [stock-discord];
};
nixpkgs.overlays = [discordOverlay];
home-manager.users.toast = {
home.packages = with pkgs; [
discord
vesktop
];
};
}

View file

@ -1,28 +0,0 @@
{...}: {
virtualisation.podman = {
# Due to limitations with home-manager, podman has to be available system wide
enable = true;
};
home-manager.users.toast = {
programs.distrobox = {
enable = true;
containers = {
uav = {
image = "quay.io/toolbx/ubuntu-toolbox:24.04";
# additional_packages = "lsb-release dmidecode git";
additional_packages = "git";
init_hooks = [
"git clone https://github.com/PX4/PX4-Autopilot.git --recursive /tmp/px4"
"cd /tmp/px4/Tools/setup/"
# The install scripts wants to add things to .bashrc, so it errors out
# This removes the line that does that
"sed -i '181d' ubuntu.sh"
"bash ubuntu.sh"
"rm -rf /tmp/px4 --one-file-system"
];
entry = true;
};
};
};
};
}

View file

@ -1,147 +1,55 @@
{lib, ...}: {
home-manager.sharedModules = [
{
# System wide firefox settings
programs.firefox = {
enable = true;
policies = {
DisableTelemetry = true;
GenerativeAI = {
Chatbot = false;
LinkPreviews = false;
TabGroups = false;
Locked = true;
};
# You need these for Spotify
EncryptedMediaExtensions.Enabled = true;
ExtensionSettings = {
# TODO: Install extensions the NUR instead of from AMO
"uBlock0@raymondhill.net" = {
installation_mode = "force_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
};
# Decentraleyes
"jid1-BoFifL9Vbdl2zQ@jetpack" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/decentraleyes/latest.xpi";
};
"jid1-MnnxcxisBPnSXQ@jetpack" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
};
# Uninstall undeclared extensions
"*" = {
installation_mode = "blocked";
blocked_install_message = "Extensions are managed by home-manager";
};
};
Preferences = {
# Enable video hardware acceleration
"media.ffmpeg.vaapi.enabled" = {
Value = true;
Status = "default";
};
"dom.security.https_only_mode" = {
Value = true;
Status = "locked";
};
"browser.ml.chat.page" = {
Value = false;
Status = "Locked";
};
};
PromptForDownloadLocation = true;
# I use an external password manager, so the built in one just bothers me
PasswordManagerEnabled = false;
Permissions = {
Autoplay = {
Allow = [
"https://www.youtube.com"
"https://sync-tube.de"
];
Default = "block-audio-video";
};
};
FirefoxHome.SponsoredTopSites = false;
# System wide firefox settings
programs.firefox = {
enable = true;
policies = {
"DisablePocket" = true;
"DisableTelemetry" = true;
# You need these for Spotify
"EncryptedMediaExtensions" = {"Enabled" = true;};
"ExtensionSettings" = {
# TODO: Install extensions the NUR instead of from AMO
"uBlock0@raymondhill.net" = {
"installation_mode" = "force_installed";
"install_url" = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
};
# Decentraleyes
"jid1-BoFifL9Vbdl2zQ@jetpack" = {
"installation_mode" = "normal_installed";
"install_url" = "https://addons.mozilla.org/firefox/downloads/latest/decentraleyes/latest.xpi";
};
"jid1-MnnxcxisBPnSXQ@jetpack" = {
"installation_mode" = "normal_installed";
"install_url" = "https://addons.mozilla.org/firefox/downloads/latest/privacy-badger17/latest.xpi";
};
# Uninstall the kde plasma integration extension if KDE is not installed
"plasma-browser-integration@kde.org"."installation_mode" = lib.mkDefault "blocked";
};
}
];
# Per-user settings
home-manager.users.toast = {
programs.firefox.policies = {
DisablePocket = true;
ExtensionSettings = {
"sponsorBlocker@ajay.app" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/sponsorblock/latest.xpi";
"Preferences" = {
# Enable video hardware acceleration
"media.ffmpeg.vaapi.enabled" = {
"Value" = true;
"Status" = "default";
};
"@testpilot-containers" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/multi-account-containers/latest.xpi";
"dom.security.https_only_mode" = {
"Value" = true;
"Status" = "locked";
};
"{5cce4ab5-3d47-41b9-af5e-8203eea05245}" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/control-panel-for-twitter/latest.xpi";
};
};
Preferences = {
"general.smoothScroll.msdPhysics.enabled" = {
Value = true;
Status = "default";
};
"browser.ctrlTab.sortByRecentlyUsed" = {
Value = true;
Status = "default";
};
# This should be set automatically, but it isn't for some reason
"extensions.webextensions.ExtensionStorageIDB.enabled" = {
Value = false;
Status = "locked";
"Value" = true;
"Status" = "default";
};
};
};
programs.firefox.profiles = {
personal = {
name = "Personal";
id = 0;
isDefault = true;
containersForce = true;
containers = {
work = {
name = "Work";
id = 1;
icon = "briefcase";
color = "green";
};
};
extensions.force = true;
extensions.settings = {
"@testpilot-containers".settings = {
onboarding-stage = 8;
"siteContainerMap@@_teams.microsoft.com" = {
userContextId = "1";
neverAsk = false;
identityMacAddonUUID = "b50e5b1e-6f3b-4245-8eac-5654d889156e";
};
"siteContainerMap@@_outlook.office.com" = {
userContextId = "1";
neverAsk = false;
identityMacAddonUUID = "b50e5b1e-6f3b-4245-8eac-5654d889156e";
};
};
# Control panel for twitter
"{5cce4ab5-3d47-41b9-af5e-8203eea05245}".settings = {
hideForYouTimeline = false;
alwaysUseLatestTweets = false;
retweets = "ignore";
restoreOtherInteractionLinks = true;
navBaseFontSize = false;
followButtonStyle = "themed";
hideSidebarContent = true;
};
"PromptForDownloadLocation" = true;
# I use an external password manager, so the built in one just bothers me
"PasswordManagerEnabled" = false;
"Permissions" = {
"Autoplay" = {
"Allow" = ["https://www.youtube.com"];
"Default" = "block-audio-video";
};
};
"FirefoxHome" = {"SponsoredTopSites" = false;};
};
};
}

View file

@ -1,7 +1,18 @@
{pkgs, ...}: {
{
pkgs,
lib,
...
}: {
home-manager.users.toast = {
programs.git = {
package = pkgs.gitFull;
extraConfig = {
cola = {
icontheme = lib.mkDefault "dark";
};
};
};
home.packages = [pkgs.git-cola];
};
}

View file

@ -1,7 +1,3 @@
{pkgs, ...}: {
home-manager.users.toast = {
home.packages = with pkgs; [
jamesdsp
];
};
users.users.toast.packages = [pkgs.jamesdsp];
}

View file

@ -1,32 +1,61 @@
{pkgs, ...}: {
{lib, ...}: let
kpxcSettings = lib.generators.toINI {} {
General = {
# Not sure what changing this does, I'll leave it alone
ConfigVersion = 2;
MinimizeAfterUnlock = true;
AutoSaveAfterEveryChange = false;
};
GUI = {
ApplicationTheme = "classic";
MinimizeOnStartup = false;
MinimizeOnClose = true;
MinimizeToTray = true;
ShowTrayIcon = true;
# 0 is icons, 1 is text, 2 is text next to icons, 3 is text under icons, and 4 is follow style
ToolButtonStyle = 0; # Would choose 4 but it's too big for a small window
# monochrome-light, monochrome-dark or colorful
TrayIconAppearance = "monochrome-light";
};
Security = {
HideNotes = true;
IconDownloadFallback = true;
};
SSHAgent.Enabled = true;
};
in {
home-manager = {
extraSpecialArgs = {kpxcSettings = kpxcSettings;};
users.toast = {
programs.keepassxc = {
enable = true;
autostart = true;
settings = {
General = {
# Not sure what changing this does, I'll leave it alone
ConfigVersion = 2;
MinimizeAfterUnlock = true;
AutoSaveAfterEveryChange = false;
};
GUI = {
ApplicationTheme = "classic";
MinimizeOnStartup = false;
MinimizeOnClose = true;
MinimizeToTray = true;
ShowTrayIcon = true;
# 0 is icons, 1 is text, 2 is text next to icons, 3 is text under icons, and 4 is follow style
ToolButtonStyle = 0; # Would choose 4 but it's too big for a small window
# monochrome-light, monochrome-dark or colorful
TrayIconAppearance = "monochrome-light";
};
Security = {
HideNotes = true;
IconDownloadFallback = true;
};
SSHAgent.Enabled = true;
pkgs,
kpxcSettings,
...
}: {
# No module for KeePassXC config :(
home = {
packages = [pkgs.keepassxc];
file = {
".config/keepassxc/keepassxc.ini".text = kpxcSettings;
# For some reason the autostart .desktop is not the same as the regular one
".config/autostart/org.keepassxc.KeePassXC.desktop".text = ''
[Desktop Entry]
Name=KeePassXC
GenericName=Password Manager
Exec=keepassxc
TryExec=keepassxc
Icon=keepassxc
StartupWMClass=keepassxc
StartupNotify=true
Terminal=false
Type=Application
Version=1.0
Categories=Utility;Security;Qt;
MimeType=application/x-keepass2;
X-GNOME-Autostart-enabled=true
X-GNOME-Autostart-Delay=2
X-KDE-autostart-after=panel
X-LXQt-Need-Tray=true
'';
};
};
};

View file

@ -0,0 +1,18 @@
{lib, ...}: {
home-manager = {
users.toast = {pkgs, ...}: {
programs.micro = {
enable = true;
settings = {
# Use xclip/wl-clipboard for copying and pasting
clipboard = lib.mkForce "external";
};
};
/*
On a kde wayland session micro uses xsel or xclip instead of wl-clipboard
which doesn't work, so I only install wl-clipboard here to make micro use it
*/
home.packages = with pkgs; [wl-clipboard];
};
};
}

View file

@ -1,24 +0,0 @@
{pkgs, ...}: {
nixpkgs.overlays = [
(
final: prev: {
mpv-unwrapped = prev.mpv-unwrapped.override {
cddaSupport = true;
};
}
)
];
home-manager.users.toast = {
programs.mpv = {
enable = true;
scripts = with pkgs.mpvScripts; [
mpris
];
config = {
hwdec = "auto";
cache = true;
cdda-speed = "8";
};
};
};
}

View file

@ -1,5 +0,0 @@
{pkgs, ...}: {
home-manager.users.toast = {
home.packages = [pkgs.spotify];
};
}

View file

@ -2,7 +2,7 @@
programs.ssh.knownHosts = {
everest = {
hostNames = [
"everest.tailscale"
"everest.sable-pancake.ts.net"
"toast003.xyz"
];
publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAqfABZKnF5YYGZTOKuT7m+sOnUqBQSvLke9c3JDsF5s";
@ -12,18 +12,10 @@
home-manager.users.toast = {
programs.ssh = {
enable = true;
enableDefaultConfig = false;
matchBlocks = {
"everest" = {
host = "toast003.xyz";
hostname = "toast003.xyz";
forwardAgent = true;
sendEnv = ["COLORTERM"];
port = 69;
};
"everest-tailscale" = {
host = "everest";
hostname = "everest.tailscale";
hostname = "everest.sable-pancake.ts.net";
forwardAgent = true;
sendEnv = ["COLORTERM"];
};

View file

@ -1,8 +0,0 @@
{...}: {
services.udev.extraRules = ''
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", ATTRS{idProduct}=="4ee0", MODE="0666"
'';
home-manager.users.toast.services.flatpak = {
packages = ["io.github.parnassius.SysDVR-Qt"];
};
}

View file

@ -0,0 +1,44 @@
{
pkgs,
flakeSelf,
...
}: let
inputs = flakeSelf.inputs;
in {
nixpkgs.overlays = [inputs.catppuccin-vsc.overlays.default];
home-manager.users.toast = {
home.packages = with pkgs; [
nixpkgs-fmt
];
programs.vscode = {
enable = true;
package = pkgs.vscodium;
mutableExtensionsDir = false;
extensions = with inputs.vscode-extensions.extensions.x86_64-linux.open-vsx; [
jnoortheen.nix-ide
(pkgs.catppuccin-vsc.override {
workbenchMode = "flat";
extraBordersEnabled = true;
})
catppuccin.catppuccin-vsc-icons
waderyan.gitblame
];
userSettings = {
# VSCode doesn't like nested settings
# https://stackoverflow.com/questions/74134436/is-it-possible-to-express-settings-in-vs-codes-settings-json-where-each-dot-sep
# TODO: write a function that unnests settings
"workbench.colorTheme" = "Catppuccin Mocha";
"workbench.iconTheme" = "catppuccin-mocha";
"editor.fontFamily" = "JetBrainsMono Nerd Font";
"editor.semanticHighlighting.enabled" = true;
"nix.enableLanguageServer" = true;
"nix.serverPath" = "${pkgs.nil}/bin/nil";
"nix.serverSettings" = {
"nil"."formatting"."command" = ["nixpkgs-fmt"];
};
"terminal.integrated.minimumContrastRatio" = 1;
"window.titleBarStyle" = "custom";
};
};
};
}

View file

@ -6,6 +6,5 @@
./pipewire.nix
./printing.nix
./networkmanager.nix
./tailscale.nix
];
}

View file

@ -1,51 +1,54 @@
{
config,
lib,
flakeSelf,
...
}: let
tailscaleName = config.services.tailscale.interfaceName;
in {
sops.secrets.wifiPasswords = {
sopsFile = "${flakeSelf.inputs.secrets}/wifi-passwords.env";
format = "dotenv";
age.secrets = {
wifiPasswords.file = "${flakeSelf.inputs.secrets}/wifi-passwords.age";
};
networking.networkmanager = {
enable = true;
unmanaged = [
"interface-name:${tailscaleName}"
];
wifi.macAddress = "random";
ensureProfiles = {
environmentFiles = [config.sops.secrets.wifiPasswords.path];
profiles = with lib.toast.networkManager; {
"4g-modem" = mkWifiProfile {
id = "4G Modem";
priority = 5;
ssid = "TP-Link_CCB4";
environmentFiles = [config.age.secrets.wifiPasswords.path];
profiles = {
"4g-modem" = {
connection = {
id = "4G Modem";
type = "wifi";
};
ipv4.method = "auto";
wifi = {
mode = "infrastructure";
ssid = "TP-Link_CCB4";
};
wifi-security = {
auth-alg = "open";
key-mgmt = "wpa-psk";
psk = "$MODEM";
};
};
phone = mkWifiProfile {
id = "Phone";
priority = 5;
ssid = "Redmi Note 10 Pro_5197";
phone = {
connection = {
id = "Phone";
type = "wifi";
};
ipv4.method = "auto";
wifi = {
mode = "infrastructure";
ssid = "Redmi Note 10 Pro_5197";
};
wifi-security = {
auth-alg = "open";
key-mgmt = "sae";
psk = "$PHONE";
};
};
home = mkWifiProfile {
id = "Home";
ssid = "MOVISTAR-WIFI6-DC98";
wifi-security = {
key-mgmt = "sae";
psk = "$HOME";
};
};
};
};
};

View file

@ -1,57 +1,23 @@
{config, ...}: {
services.syncthing = {
# enable = true;
# user = "toast";
# group = "users";
# dataDir = config.users.users.toast.home;
enable = true;
user = "toast";
group = "users";
dataDir = config.users.users.toast.home;
settings.folders."passwords".path = "~/Documents/Passwords";
};
age.secrets = {
syncthingCert = {
owner = "toast";
group = "users";
};
syncthingKey = {
owner = "toast";
group = "users";
};
};
home-manager.users.toast = {
osConfig,
lib,
...
}: let
systemConfig = osConfig.services.syncthing;
missingOptions = [
"all_proxy"
"configDir"
"dataDir"
"databaseDir"
"declarative"
"devices"
"folders"
"extraFlags"
"user"
"group"
"systemService"
"openDefaultPorts"
"options"
"relay"
"useInotify"
"guiPasswordFile"
];
removeMissingOptions = rawOptions: (
# lib.attrsets.filterAttrs (n: v: n == "all_proxy") rawOptions
builtins.removeAttrs rawOptions missingOptions
);
in {
services.syncthing =
removeMissingOptions systemConfig
// {
enable = true;
# Renamed options
allProxy = systemConfig.all_proxy;
extraOptions = systemConfig.extraFlags;
};
};
# Allow regular users to stop syncthing
# https://stackoverflow.com/questions/61480914/using-policykit-to-allow-non-root-users-to-start-and-stop-a-service
security.polkit.extraConfig = ''
polkit.addRule(function(action, subject) {
if (
action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "syncthing.service" &&
subject.user == "${config.services.syncthing.user}"
)
{
return polkit.Result.YES;
}
})
'';
}

View file

@ -1,16 +0,0 @@
{pkgs, ...}: {
home-manager.users.toast = {
services.tailscale-systray = {
enable = true;
package = pkgs.tailscale.overrideAttrs {
postPatch = ''
substituteInPlace client/systray/logo.go --replace-fail \
"color.NRGBA{0, 0, 0, 255}" "color.NRGBA{0, 0, 0, 0}"
'';
# Only use this for the tray, so no testing is needed
# Makes the build last a lot less too
doCheck = false;
};
};
};
}

View file

@ -1,16 +1,6 @@
{pkgs, ...}: {
{...}: {
imports = [
./programs
./services
];
system.replaceDependencies.replacements = [
{
oldDependency = pkgs.sdl3;
newDependency = pkgs.sdl3.overrideAttrs {
patches = [
./sdl-keychron-blacklist.patch
];
};
}
];
}

View file

@ -1,18 +0,0 @@
{pkgs, ...}: {
# nixpkgs.overlays = [
# (
# final: prev: {
# azahar = prev.azahar.overrideAttrs (old: {
# version = "2120.3";
# src = final.fetchzip {
# url = "https://github.com/azahar-emu/azahar/releases/download/2120.3/azahar-unified-source-20250414-00e3bbb.tar.xz";
# hash = "sha256-3QKicmpmWDM7x9GDJ8sxm2Xu+0Yfho4LkSWMp+ixzRk=";
# };
# });
# }
# )
# ];
home-manager.users.toast = {
home.packages = [pkgs.azahar];
};
}

View file

@ -1,7 +0,0 @@
{pkgs, ...}: {
home-manager.users.toast = {
home = {
packages = [pkgs.cemu];
};
};
}

View file

@ -5,8 +5,6 @@
./rpcs3.nix
./retroarch.nix
./pcsx2.nix
./cemu.nix
./azahar.nix
];
environment.systemPackages = with pkgs; [
heroic

View file

@ -3,113 +3,100 @@
lib,
...
}: let
ps2-isos = pkgs.symlinkJoin {
name = "ps2-isos";
paths = [
(pkgs.fetchzip {
url = "https://myrient.erista.me/files/Redump/Sony%20-%20PlayStation%202/007%20-%20Nightfire%20%28USA%29.zip";
hash = "sha256-66Ey0SqC3Tk02Af+xR6rpxYSkO0n83NWYPCt4M3CUWo=";
})
];
};
compressed-ps2-isos = pkgs.runCommand "compressed-ps2-isos" {} ''
mkdir $out
cd ${ps2-isos}
for file in ./*
do
${pkgs.mame-tools}/bin/chdman createdvd -i "$file" -o "$out/''${file%.iso}.chd"
done
'';
pcsx2-bios = pkgs.fetchzip {
url = "https://myrient.erista.me/files/Redump/Sony%20-%20PlayStation%202%20-%20BIOS%20Images%20%28DoM%20Version%29/ps2-0200a-20040614.zip";
url = "https://myrient.erista.me/files/Redump/Sony%20-%20PlayStation%202%20-%20BIOS%20Images/ps2-0200a-20040614.zip";
hash = "sha256-wMvswgmsKl+cJl49VlVW84tvU5Jzd+2dl07SOiUDtwA=";
};
toPcsx2INI = lib.generators.toINI {listsAsDuplicateKeys = true;};
in {
home-manager.users.toast = {
home.packages = with pkgs; [
pcsx2
];
home = {
packages = with pkgs; [
pcsx2
];
file."Games/Isos/PS2".source = compressed-ps2-isos;
};
xdg.configFile = {
#PCSX2 silently overwrites the symlink so I need to force it's creation
"PCSX2/inis/PCSX2.ini".force = true;
"PCSX2/inis/PCSX2.ini".text = toPcsx2INI {
UI = {
SettingsVersion = 1;
# Use the system theme
Theme = "";
HideMouseCursor = true;
};
Folders = {
Bios = "/home/toast/.local/share/PCSX2/bios";
};
GameList.RecursivePaths = [
"/home/toast/Games/PS2/"
];
"EmuCore/GS" = {
dithering_ps2 = 1;
upscale_multiplier = 2;
};
EmuCore = {
EnableDiscordPresence = true;
EnableFastBoot = true;
McdFolderAutoManage = false;
};
"PCSX2/inis/PCSX2.ini".text =
lib.generators.toINI {
listsAsDuplicateKeys = true;
} {
UI = {
SettingsVersion = 1;
# Use the system theme
Theme = "";
HideMouseCursor = true;
};
Folders = {
Bios = "/home/toast/.local/share/PCSX2/bios";
};
GameList.RecursivePaths = [
"/home/toast/Games/Isos/PS2/"
];
"EmuCore/GS".dithering_ps2 = 1;
EmuCore = {
EnableDiscordPresence = true;
EnableFastBoot = true;
McdFolderAutoManage = false;
};
MemoryCards.Slot1_Filename = "MemoryCard1.ps2";
MemoryCards.Slot1_Filename = "MemoryCard1.ps2";
# Controller settings
Pad1 = {
Up = "SDL-0/DPadUp";
Right = "SDL-0/DPadRight";
Down = "SDL-0/DPadDown";
Left = "SDL-0/DPadLeft";
Triangle = "SDL-0/Y";
Circle = "SDL-0/B";
Cross = "SDL-0/A";
Square = "SDL-0/X";
Select = "SDL-0/Back";
Start = "SDL-0/Start";
L1 = "SDL-0/LeftShoulder";
L2 = "SDL-0/+LeftTrigger";
R1 = "SDL-0/RightShoulder";
R2 = "SDL-0/+RightTrigger";
L3 = "SDL-0/LeftStick";
R3 = "SDL-0/RightStick";
Analog = "SDL-0/Guide";
LUp = "SDL-0/-LeftY";
LRight = "SDL-0/+LeftX";
LDown = "SDL-0/+LeftY";
LLeft = "SDL-0/-LeftX";
RUp = "SDL-0/-RightY";
RRight = "SDL-0/+RightX";
RDown = "SDL-0/+RightY";
RLeft = "SDL-0/-RightX";
LargeMotor = "SDL-0/LargeMotor";
SmallMotor = "SDL-0/SmallMotor";
# Controller settings
Pad1 = {
Up = "SDL-0/DPadUp";
Right = "SDL-0/DPadRight";
Down = "SDL-0/DPadDown";
Left = "SDL-0/DPadLeft";
Triangle = "SDL-0/Y";
Circle = "SDL-0/B";
Cross = "SDL-0/A";
Square = "SDL-0/X";
Select = "SDL-0/Back";
Start = "SDL-0/Start";
L1 = "SDL-0/LeftShoulder";
L2 = "SDL-0/+LeftTrigger";
R1 = "SDL-0/RightShoulder";
R2 = "SDL-0/+RightTrigger";
L3 = "SDL-0/LeftStick";
R3 = "SDL-0/RightStick";
Analog = "SDL-0/Guide";
LUp = "SDL-0/-LeftY";
LRight = "SDL-0/+LeftX";
LDown = "SDL-0/+LeftY";
LLeft = "SDL-0/-LeftX";
RUp = "SDL-0/-RightY";
RRight = "SDL-0/+RightX";
RDown = "SDL-0/+RightY";
RLeft = "SDL-0/-RightX";
LargeMotor = "SDL-0/LargeMotor";
SmallMotor = "SDL-0/SmallMotor";
};
};
# Default hotkeys
Hotkeys = {
ToggleFullscreen = "Keyboard/Alt & Keyboard/Return";
CycleAspectRatio = "Keyboard/F6";
CycleInterlaceMode = "Keyboard/F5";
CycleMipmapMode = "Keyboard/Insert";
GSDumpMultiFrame = "Keyboard/Control & Keyboard/Shift & Keyboard/F8";
Screenshot = "Keyboard/F8";
GSDumpSingleFrame = "Keyboard/Shift & Keyboard/F8";
ToggleSoftwareRendering = "Keyboard/F9";
ZoomIn = "Keyboard/Control & Keyboard/Plus";
ZoomOut = "Keyboard/Control & Keyboard/Minus";
InputRecToggleMode = "Keyboard/Shift & Keyboard/R";
LoadStateFromSlot = "Keyboard/F3";
SaveStateToSlot = "Keyboard/F1";
NextSaveStateSlot = "Keyboard/F2";
PreviousSaveStateSlot = "Keyboard/Shift & Keyboard/F2";
OpenPauseMenu = "Keyboard/Escape";
ToggleFrameLimit = "Keyboard/F4";
TogglePause = "Keyboard/Space";
ToggleSlowMotion = "Keyboard/Shift & Keyboard/Backtab";
ToggleTurbo = "Keyboard/Tab";
HoldTurbo = "Keyboard/Period";
};
};
# 007 nightfire
"PCSX2/gamesettings/SLUS-20579_5B86BB62.ini".text = toPcsx2INI {
"PCSX2/gamesettings/SLUS-20579_5B86BB62.ini".text = lib.generators.toINI {} {
"EmuCore/GS".AspectRatio = "16:9";
};
"PCSX2/gamesettings/SLUS-21050_BEBF8793.ini".text = toPcsx2INI {
"EmuCore/GS".AspectRatio = "16:9";
Patches.Enable = [
"60 FPS for Crashes"
"60 FPS for Menus"
"Progressive Scan"
"MPH to KPH"
"Extra Particles While Driving"
];
};
};
xdg.dataFile = {
# I would prefer to use symlinkJoin like I do for the ISOs, but
@ -119,23 +106,4 @@ in {
'';
};
};
# Syncthing
services.syncthing.settings.folders."pcsx2" = {
label = "PCSX2";
id = "qcdsp-qaaej";
devices = ["steamdeck" "server" "pc" "winmax2"];
path = "~/.config/PCSX2";
};
home-manager.users.toast.xdg.configFile = {
"PCSX2/.stignore".text = ''
cache
bios
gamesettings
inis/PCSX2.ini*
inis/debuggersettings
inputprofiles
logs
'';
};
}

View file

@ -1,9 +1,27 @@
{pkgs, ...}: {
{pkgs, ...}: let
snes-roms = [
# ActRaiser
(pkgs.fetchzip {
url = "https://myrient.erista.me/files/No-Intro/Nintendo%20-%20Super%20Nintendo%20Entertainment%20System/ActRaiser%20%28USA%29.zip";
hash = "sha256-yxIL5Pqlp8xsx7wvNO1MlB8ffDjS0xpE+yrEfMj61As=";
})
# Kirby Super Star
(pkgs.fetchzip {
url = "https://myrient.erista.me/files/No-Intro/Nintendo%20-%20Super%20Nintendo%20Entertainment%20System/Kirby%20Super%20Star%20%28USA%29.zip";
hash = "sha256-NX5OjCthf4ZiAhamclRBRk8GiMjZX3JLeShm8sQdDfc=";
})
# Super Mario Kart
(pkgs.fetchzip {
url = "https://myrient.erista.me/files/No-Intro/Nintendo%20-%20Super%20Nintendo%20Entertainment%20System/Super%20Mario%20Kart%20%28USA%29.zip";
hash = "sha256-RLBxPBmBrXCuPdnWE07KamBNgGJ5IntQVUPeij+2HUI=";
})
];
in {
home-manager.users.toast = {
home = {
packages = [
(
pkgs.wrapRetroArch {
pkgs.retroarch.override {
cores = with pkgs.libretro; [
snes9x
];
@ -44,6 +62,15 @@
}
)
];
file."Games/Roms/SNES/" = {
onChange = ''
${pkgs.retroarch}/bin/retroarch --scan "/home/toast/Games/Roms/SNES"
'';
source = pkgs.symlinkJoin {
name = "snes-roms";
paths = [snes-roms];
};
};
};
# Retroarch is dumb since it doesn't generate some folders (but it does for others)
systemd.user.tmpfiles.rules = [
@ -51,28 +78,6 @@
"d /%h/.local/share/retroarch/saves"
"d /%h/.local/share/retroarch/states"
];
systemd.user.paths = {
snes-roms = {
Unit.Description = "Monitor SNES rom path for changes";
Path = {
PathChanged = "/%h/Games/SNES";
Unit = "update-retroarch-library.service";
};
Install.WantedBy = ["default.target"];
};
};
systemd.user.services.update-retroarch-library = {
Service = {
Type = "oneshot";
ExecStart = pkgs.writeShellScript "scan-snes-games" ''
${pkgs.libnotify}/bin/notify-send -a RetroArch \
-i retroarch \
"SNES games changed!" \
"Scanning $TRIGGER_PATH..."
${pkgs.retroarch}/bin/retroarch --scan "/home/toast/Games/SNES"
'';
};
};
};
# Sync saves and some other stuff

View file

@ -1,7 +1,12 @@
{pkgs, ...}: {
environment.systemPackages = with pkgs; [
rpcs3
{config, ...}: {
environment.systemPackages = with config; [
nur.repos.ataraxiasjel.rpcs3
];
# Compiling RPCS3 takes quite a while
nix.settings = {
substituters = ["https://ataraxiadev-foss.cachix.org"];
trusted-public-keys = ["ataraxiadev-foss.cachix.org-1:ws/jmPRUF5R8TkirnV1b525lP9F/uTBsz2KraV61058="];
};
# Increase the memory lock limit
security.pam.loginLimits = [

View file

@ -5,7 +5,6 @@
}: {
programs.steam = {
enable = true;
localNetworkGameTransfers.openFirewall = true;
# Doubt that I'll use it, but I'll enable it anyways
remotePlay.openFirewall = true;
@ -20,15 +19,14 @@
then true
else false;
# Celeste mod manager
home-manager.users.toast = {
systemd.user.tmpfiles.rules = [
"r '/%h/.local/share/applications/Steam Linux Runtime *.desktop'"
"r '/%h/.local/share/applications/Proton *.desktop'"
];
services.flatpak.packages = [
# Celeste mod manager
"io.github.everestapi.Olympus"
];
home.packages = [pkgs.sgdboop];
};
}

View file

@ -1,13 +0,0 @@
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 5ce36de86..37bf5ca85 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -281,6 +281,8 @@ static Uint32 initial_blacklist_devices[] = {
MAKE_VIDPID(0x3297, 0x1969), // Moonlander MK1 Keyboard
MAKE_VIDPID(0x3434, 0x0211), // Keychron K1 Pro System Control
MAKE_VIDPID(0x04f2, 0xa13c), // HP Deluxe Webcam KQ246AA
+ MAKE_VIDPID(0x3434, 0x0353), // Keychron V5 System Control
+ MAKE_VIDPID(0x3434, 0xd030), // Keychron Link
};
static SDL_vidpid_list blacklist_devices = {
SDL_HINT_JOYSTICK_BLACKLIST_DEVICES, 0, 0, NULL,

View file

@ -8,27 +8,9 @@
"steam-201810" = {
label = "Wolfenstein The New Order Saves";
id = "laxxf-t2wmy";
devices = ["steamdeck" "server" "pc" "winmax2"];
devices = ["steamdeck" "server" "pc"];
path = "~/.local/share/Steam/steamapps/compatdata/201810/pfx/drive_c/users/steamuser/Saved Games/MachineGames/Wolfenstein The New Order/";
};
"project-diva-mods" = {
label = "Project Diva Mods";
id = "7pscj-6egww";
devices = ["steamdeck" "server" "pc" "winmax2"];
path = "~/.local/share/Steam/steamapps/common/Hatsune Miku Project DIVA Mega Mix Plus/mods/";
};
"project-eden-saves" = {
label = "Project Eden saves";
id = "xa3qx-3ax5k";
devices = ["server" "pc" "winmax2" "steamdeck"];
path = "~/.local/share/Steam/steamapps/compatdata/1761390/pfx/drive_c/users/steamuser/AppData/Roaming/EDEN/";
};
"games" = {
label = "Games";
id = "mwzph-gf2df";
devices = ["server" "pc" "winmax2" "steamdeck"];
path = "~/Games";
};
};
home-manager.users.toast.home.file."steam-201810-ignore" = {
target = ".local/share/Steam/steamapps/compatdata/201810/pfx/drive_c/users/steamuser/Saved Games/MachineGames/Wolfenstein The New Order/.stignore";

View file

@ -3,6 +3,5 @@
./plasma.nix
./sddm.nix
./programs
./patches
];
}

View file

@ -0,0 +1,191 @@
diff --git a/share/color-schemes/BreezeClassic.colors b/share/color-schemes/BreezeClassicTint.colors
similarity index 70%
rename from share/color-schemes/BreezeClassic.colors
rename to share/color-schemes/BreezeClassicTint.colors
index 8dbc299..d64e300 100644
--- a/share/color-schemes/BreezeClassic.colors
+++ b/share/color-schemes/BreezeClassicTint.colors
@@ -103,48 +103,12 @@ ForegroundPositive=46,204,113
ForegroundVisited=61,174,230
[General]
-ColorScheme=BreezeClassic
-Name=Breeze Classic
-Name[ar]=نسيم التقليدي
-Name[az]=Breeze klassik
-Name[bg]=Breeze Класически
-Name[ca]=Brisa clàssica
-Name[ca@valencia]=Brisa clàssica
-Name[cs]=Breeze Classic
-Name[da]=Breeze Classic
-Name[de]=Breeze Klassisch
-Name[el]=Breeze κλασικό
-Name[en_GB]=Breeze Classic
-Name[es]=Brisa clásico
-Name[eu]=Breeze klasikoa
-Name[fi]=Perinteinen Breeze
-Name[fr]=Breeze classique
-Name[gl]=Brisa clásica
-Name[hi]=ब्रीज़ क्लासिक
-Name[hu]=Breeze Classic
-Name[ia]=Brisa Classic
-Name[id]=Breeze Klasik
-Name[it]=Brezza classico
-Name[ja]=Breeze クラシック
-Name[ka]=Breeze კლასიკური
-Name[ko]=Breeze 고전
-Name[nl]=Breeze Classic
-Name[nn]=Breeze klassisk
-Name[pl]=Klasyczna Bryza
-Name[pt]=Brisa Clássica
-Name[pt_BR]=Breeze Classic
-Name[ro]=Briză, clasic
-Name[ru]=Breeze, классический вариант
-Name[sk]=Klasický vánok
-Name[sl]=Sapica, klasična
-Name[sv]=Breeze klassisk
-Name[tr]=Esinti Klasik
-Name[uk]=Класична Breeze
-Name[x-test]=xxBreeze Classicxx
-Name[zh_CN]=Breeze 微风经典
-Name[zh_TW]=Breeze Classic
+ColorScheme=BreezeClassicTint
+Name=Breeze Classic (Tint)
accentActiveTitlebar=true
accentInactiveTitlebar=false
+TintFactor=0.2
+TitlebarIsAccentColored=true
shadeSortColumn=true
[KDE]
diff --git a/share/color-schemes/BreezeDark.colors b/share/color-schemes/BreezeDarkTint.colors
similarity index 71%
rename from share/color-schemes/BreezeDark.colors
rename to share/color-schemes/BreezeDarkTint.colors
index fc1fcb0..a97a552 100644
--- a/share/color-schemes/BreezeDark.colors
+++ b/share/color-schemes/BreezeDarkTint.colors
@@ -131,57 +131,10 @@ ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[General]
-ColorScheme=BreezeDark
-Name=Breeze Dark
-Name[ar]=نسيم داكن
-Name[az]=Breeze - Tünd
-Name[bg]=Breeze Тъмен
-Name[bs]=Breeze tamna
-Name[ca]=Brisa fosca
-Name[ca@valencia]=Brisa fosca
-Name[cs]=Breeze Tmavé
-Name[da]=Breeze Dark
-Name[de]=Breeze Dunkel
-Name[el]=Breeze σκούρο
-Name[en_GB]=Breeze Dark
-Name[es]=Brisa oscuro
-Name[et]=Breeze tume
-Name[eu]=Breeze iluna
-Name[fi]=Tumma Breeze
-Name[fr]=Brise sombre
-Name[gl]=Brisa escura
-Name[he]=Breeze Dark
-Name[hi]=ब्रीज़ गहरा
-Name[hu]=Breeze Dark
-Name[ia]=Brisa obscure
-Name[id]=Breeze Gelap
-Name[it]=Brezza scuro
-Name[ja]=Breeze ダーク
-Name[ka]=Breeze მუქი
-Name[ko]=어두운 Breeze
-Name[lt]=Breeze tamsus
-Name[nb]=Breeze mørk
-Name[nl]=Breeze Dark
-Name[nn]=Breeze mørk
-Name[pa]=ਬਰੀਜ਼ ਗੂੜ੍ਹਾ
-Name[pl]=Ciemna Bryza
-Name[pt]=Brisa Escura
-Name[pt_BR]=Breeze Dark
-Name[ro]=Briză, întunecat
-Name[ru]=Breeze, тёмный вариант
-Name[sk]=Tmavý vánok
-Name[sl]=Sapica, temna
-Name[sr]=Поветарац тамни
-Name[sr@ijekavian]=Поветарац тамни
-Name[sr@ijekavianlatin]=Povetarac tamni
-Name[sr@latin]=Povetarac tamni
-Name[sv]=Breeze mörk
-Name[tg]=Насими торик
-Name[tr]=Esinti Koyu
-Name[uk]=Темна Breeze
-Name[x-test]=xxBreeze Darkxx
-Name[zh_CN]=Breeze 微风深色
-Name[zh_TW]=Breeze Dark
+ColorScheme=BreezeDarkTint
+Name=Breeze Dark (Tint)
+TintFactor=0.2
+TitlebarIsAccentColored=true
shadeSortColumn=true
[KDE]
diff --git a/share/color-schemes/BreezeLight.colors b/share/color-schemes/BreezeLightTint.colors
similarity index 75%
rename from share/color-schemes/BreezeLight.colors
rename to share/color-schemes/BreezeLightTint.colors
index 5bfdc22..223509c 100644
--- a/share/color-schemes/BreezeLight.colors
+++ b/share/color-schemes/BreezeLightTint.colors
@@ -131,50 +131,10 @@ ForegroundPositive=39,174,96
ForegroundVisited=155,89,182
[General]
-ColorScheme=BreezeLight
-Name=Breeze Light
-Name[ar]=نسيم فاتح
-Name[az]=Breeze - İşıqlı
-Name[bg]=Breeze Светъл
-Name[ca]=Brisa clara
-Name[ca@valencia]=Brisa clara
-Name[cs]=Breeze Světlé
-Name[da]=Breeze Light
-Name[de]=Breeze Hell
-Name[el]=Breeze φωτεινό
-Name[en_GB]=Breeze Light
-Name[es]=Brisa claro
-Name[et]=Breeze hele
-Name[eu]=Breeze argia
-Name[fi]=Vaalea Breeze
-Name[fr]=Brise clair
-Name[gl]=Brisa clara
-Name[hi]=ब्रीज़ हलका
-Name[hu]=Breeze Light
-Name[ia]=Brisa Ligier
-Name[id]=Breeze Terang
-Name[it]=Brezza chiaro
-Name[ja]=Breeze ライト
-Name[ka]=Breeze ღია
-Name[ko]=밝은 Breeze
-Name[lt]=Breeze šviesus
-Name[nl]=Breeze Light
-Name[nn]=Breeze lys
-Name[pa]=ਬਰੀਜ਼ ਹਲਕਾ
-Name[pl]=Jasna Bryza
-Name[pt]=Brisa Clara
-Name[pt_BR]=Breeze Light
-Name[ro]=Briză, luminos
-Name[ru]=Breeze, светлый вариант
-Name[sk]=Svetlý vánok
-Name[sl]=Sapica, svetla
-Name[sv]=Breeze ljus
-Name[tg]=Насими сабук
-Name[tr]=Esinti Açık
-Name[uk]=Світла Breeze
-Name[x-test]=xxBreeze Lightxx
-Name[zh_CN]=Breeze 微风浅色
-Name[zh_TW]=Breeze Light
+ColorScheme=BreezeLightTint
+Name=Breeze Light (Tint)
+TintFactor=0.2
+TitlebarIsAccentColored=true
shadeSortColumn=true
[KDE]

View file

@ -1,29 +0,0 @@
{lib, ...}: let
rootDirs = builtins.readDir ./.;
removeFiles = lib.attrsets.filterAttrs (n: v: v == "directory") rootDirs;
programsToPatch = builtins.attrNames removeFiles;
bigOverlay = final: prev:
lib.attrsets.mergeAttrsList (
lib.lists.forEach programsToPatch (
program: let
unpatchedProgram = prev."${program}";
newPatches = lib.toast.patches.patchesInPath (lib.path.append ./. program);
in {
"${program}" = unpatchedProgram.overrideAttrs {
version = "${unpatchedProgram.version}-patched";
__intentionallyOverridingVersion = true;
patches = unpatchedProgram.patches ++ newPatches;
};
}
)
);
in {
nixpkgs.overlays = [
(
final: prev: {
kdePackages = prev.kdePackages.overrideScope bigOverlay;
}
)
];
}

View file

@ -1,6 +0,0 @@
Plasma 6.6.0:
Pr 3256 https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3256
Pr 3259 https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3259
Pr 3269 https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3269
Pr 3356 https://invent.kde.org/plasma/plasma-desktop/-/merge_requests/3356

View file

@ -1,94 +0,0 @@
From 79d010f4bcdb19d5a19d222dd3c3cb581fde891d Mon Sep 17 00:00:00 2001
From: David Redondo <kde@david-redondo.de>
Date: Fri, 17 Oct 2025 15:15:51 +0200
Subject: [PATCH] applets/taskmanager: Allow changing a tasks volume by
scrolling
FEATURE:510668
FIXED-IN:6.6
---
.../package/contents/config/main.xml | 1 +
.../package/contents/ui/ConfigBehavior.qml | 3 ++-
.../package/contents/ui/MouseHandler.qml | 20 +++++++++++++++++++
3 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/applets/taskmanager/package/contents/config/main.xml b/applets/taskmanager/package/contents/config/main.xml
index f71a7a8457..8c3b68785b 100644
--- a/applets/taskmanager/package/contents/config/main.xml
+++ b/applets/taskmanager/package/contents/config/main.xml
@@ -90,6 +90,7 @@
<choice name="None"/>
<choice name="AllTask"/>
<choice name="TaskOnly"/>
+ <choice name="AdjustVolume"/>
</choices>
<default>0</default>
</entry>
diff --git a/applets/taskmanager/package/contents/ui/ConfigBehavior.qml b/applets/taskmanager/package/contents/ui/ConfigBehavior.qml
index 2c0dc19154..73357e9dcd 100644
--- a/applets/taskmanager/package/contents/ui/ConfigBehavior.qml
+++ b/applets/taskmanager/package/contents/ui/ConfigBehavior.qml
@@ -202,13 +202,14 @@ KCMUtils.SimpleKCM {
QQC2.ComboBox {
id: wheelEnabled
- Kirigami.FormData.label: i18nc("@label:listbox Part of a sentence: 'Scrolling behavior does nothing/cycles through tasks/cycles through the selected task's windows'", "Scrolling behavior:")
+ Kirigami.FormData.label: i18nc("@label:listbox Part of a sentence: 'Scrolling behavior does nothing/cycles through tasks/cycles through the selected task's windows/adjusts the hovered tasks volume''", "Scrolling behavior:")
Layout.fillWidth: true
Layout.minimumWidth: Kirigami.Units.gridUnit * 14
model: [
i18nc("@item:inlistbox Part of a sentence: 'Scrolling behavior does nothing'", "Does nothing"),
i18nc("@item:inlistbox Part of a sentence: 'Scrolling behavior cycles through all tasks'", "Cycles through all tasks"),
i18nc("@item:inlistbox Part of a sentence: 'Scrolling behavior cycles through the hovered task's windows'", "Cycles through the hovered tasks windows"),
+ i18nc("@item:inlistbox Part of a sentence: 'Scrolling behavior adjusts the hovered tasks volume'", "Adjusts the hovered tasks volume"),
]
}
diff --git a/applets/taskmanager/package/contents/ui/MouseHandler.qml b/applets/taskmanager/package/contents/ui/MouseHandler.qml
index cf2362835a..3f8d703d73 100644
--- a/applets/taskmanager/package/contents/ui/MouseHandler.qml
+++ b/applets/taskmanager/package/contents/ui/MouseHandler.qml
@@ -8,6 +8,7 @@ import QtQuick
import org.kde.taskmanager as TaskManager
import org.kde.plasma.plasmoid
+import org.kde.plasma.private.volume as PlasmaPa
import "code/tools.js" as TaskTools
@@ -157,6 +158,10 @@ DropArea {
}
}
+ PlasmaPa.GlobalConfig {
+ id: plasmaPaConfig
+ }
+
WheelHandler {
id: wheelHandler
@@ -179,6 +184,21 @@ DropArea {
increment--;
}
const anchor = dropArea.target.childAt(event.x, event.y);
+ if (Plasmoid.configuration.wheelEnabled === 3) {
+ const loudest = anchor?.audioStreams?.reduce((loudest, stream) => Math.max(loudest, stream.volume), 0)
+ const step = (pulseAudio.item.normalVolume - pulseAudio.item.minimalVolume) * plasmaPaConfig.volumeStep / 100;
+ anchor?.audioStreams?.forEach((stream) => {
+ let delta = step * increment;
+ if (loudest > 0) {
+ delta *= stream.volume / loudest;
+ }
+ const volume = stream.volume + delta;
+ console.log(volume, Math.max(pulseAudio.item.minimalVolume, Math.min(volume, pulseAudio.item.normalVolume)));
+ stream.model.Volume = Math.max(pulseAudio.item.minimalVolume, Math.min(volume, pulseAudio.item.normalVolume));
+ stream.model.Muted = volume === 0
+ })
+ return;
+ }
while (increment !== 0) {
TaskTools.activateNextPrevTask(anchor, increment < 0, Plasmoid.configuration.wheelSkipMinimized, Plasmoid.configuration.wheelEnabled, tasks);
increment += (increment < 0) ? 1 : -1;
--
GitLab

View file

@ -1,78 +0,0 @@
From 57885ba4ec524bdc1c1326228f27c1c3a3561bba Mon Sep 17 00:00:00 2001
From: Nate Graham <nate@kde.org>
Date: Tue, 21 Oct 2025 13:39:40 -0600
Subject: [PATCH] applets/kickoff: add spacing between non-switch-on-hover
category items
Otherwise, their highlight effects touch, and it looks bad.
To avoid blowing up the layout as a result of this change, slightly
decrease the height of these category list items too, which also reduces
some code complexity.
BUG: 508985
FIXED-IN: 6.6.0
---
applets/kickoff/ApplicationsPage.qml | 1 +
applets/kickoff/KickoffListDelegate.qml | 9 ---------
applets/kickoff/KickoffListView.qml | 5 +++++
3 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/applets/kickoff/ApplicationsPage.qml b/applets/kickoff/ApplicationsPage.qml
index c2baa75b52..fe8d6eaafb 100644
--- a/applets/kickoff/ApplicationsPage.qml
+++ b/applets/kickoff/ApplicationsPage.qml
@@ -20,6 +20,7 @@ BasePage {
id: sideBar
focus: true // needed for Loaders
model: kickoff.rootModel
+ showingCategories: true
// needed otherwise app displayed at top-level will show a first character as group.
section.property: ""
delegate: KickoffListDelegate {
diff --git a/applets/kickoff/KickoffListDelegate.qml b/applets/kickoff/KickoffListDelegate.qml
index b1f8afb3ce..02bfcfcacd 100644
--- a/applets/kickoff/KickoffListDelegate.qml
+++ b/applets/kickoff/KickoffListDelegate.qml
@@ -72,15 +72,6 @@ AbstractKickoffItemDelegate {
id: label
Layout.fillWidth: !descriptionLabel.visible
Layout.maximumWidth: root.width - root.leftPadding - root.rightPadding - icon.width - row.spacing
- Layout.preferredHeight: {
- if (root.isCategoryListItem) {
- return root.compact ? implicitHeight : Math.round(implicitHeight * 1.5);
- }
- if (!root.compact && !descriptionLabel.visible) {
- return implicitHeight + descriptionLabel.implicitHeight
- }
- return implicitHeight;
- }
text: root.text
textFormat: root.isMultilineText ? Text.StyledText : Text.PlainText
elide: Text.ElideRight
diff --git a/applets/kickoff/KickoffListView.qml b/applets/kickoff/KickoffListView.qml
index c7787493e0..382d146428 100644
--- a/applets/kickoff/KickoffListView.qml
+++ b/applets/kickoff/KickoffListView.qml
@@ -33,6 +33,7 @@ EmptyPage {
property alias section: view.section
property alias highlight: view.highlight
property alias view: view
+ property bool showingCategories: false
property bool mainContentView: false
property bool hasSectionView: false
@@ -144,6 +145,10 @@ EmptyPage {
width: view.availableWidth
}
+ // Without switch-on-hover, it's possible for the selected category and the hovered category to be adjacent.
+ // When this happens, their highlights tuoch and look ungly without some artificial spacing added.
+ spacing: root.showingCategories && !Plasmoid.configuration.switchCategoryOnHover ? Kirigami.Units.smallSpacing : 0
+
section {
property: "group"
criteria: ViewSection.FullString
--
GitLab

View file

@ -1,66 +0,0 @@
From a63fce38f285b59407c24f44639023d41b5d3ca9 Mon Sep 17 00:00:00 2001
From: Nate Graham <nate@kde.org>
Date: Thu, 30 Oct 2025 20:01:32 -0600
Subject: [PATCH] applets/kickoff: add separation between Places page list
items too
Missed in 57885ba4ec524bdc1c1326228f27c1c3a3561bba
BUG: 508985
FIXED-IN: 6.6.0
---
applets/kickoff/ApplicationsPage.qml | 2 +-
applets/kickoff/KickoffListView.qml | 4 ++--
applets/kickoff/PlacesPage.qml | 1 +
3 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/applets/kickoff/ApplicationsPage.qml b/applets/kickoff/ApplicationsPage.qml
index fe8d6eaafb..206ddd958d 100644
--- a/applets/kickoff/ApplicationsPage.qml
+++ b/applets/kickoff/ApplicationsPage.qml
@@ -20,7 +20,7 @@ BasePage {
id: sideBar
focus: true // needed for Loaders
model: kickoff.rootModel
- showingCategories: true
+ isSidebar: true
// needed otherwise app displayed at top-level will show a first character as group.
section.property: ""
delegate: KickoffListDelegate {
diff --git a/applets/kickoff/KickoffListView.qml b/applets/kickoff/KickoffListView.qml
index 382d146428..2d67bd59b7 100644
--- a/applets/kickoff/KickoffListView.qml
+++ b/applets/kickoff/KickoffListView.qml
@@ -33,7 +33,7 @@ EmptyPage {
property alias section: view.section
property alias highlight: view.highlight
property alias view: view
- property bool showingCategories: false
+ property bool isSidebar: false
property bool mainContentView: false
property bool hasSectionView: false
@@ -147,7 +147,7 @@ EmptyPage {
// Without switch-on-hover, it's possible for the selected category and the hovered category to be adjacent.
// When this happens, their highlights tuoch and look ungly without some artificial spacing added.
- spacing: root.showingCategories && !Plasmoid.configuration.switchCategoryOnHover ? Kirigami.Units.smallSpacing : 0
+ spacing: root.isSidebar && !Plasmoid.configuration.switchCategoryOnHover ? Kirigami.Units.smallSpacing : 0
section {
property: "group"
diff --git a/applets/kickoff/PlacesPage.qml b/applets/kickoff/PlacesPage.qml
index ff92f535e4..7f81096834 100644
--- a/applets/kickoff/PlacesPage.qml
+++ b/applets/kickoff/PlacesPage.qml
@@ -19,6 +19,7 @@ BasePage {
id: sideBar
focus: true // needed for Loaders
model: placesCategoryModel
+ isSidebar: true
delegate: KickoffListDelegate {
url: ""
description: ""
--
GitLab

View file

@ -1,37 +0,0 @@
From 04c747a41d8c01248c7baeec5c852c2298f76fc3 Mon Sep 17 00:00:00 2001
From: Christoph Wolk <cwo.kde@posteo.net>
Date: Mon, 1 Dec 2025 14:36:09 +0100
Subject: [PATCH] applets/kickoff: also close when triggering from footer menu
Kickoff already closes when one of the power/session buttons from the
menu is pressed, but the same does not happen if the same action is
shown in the overflow menu.
Instead, also close kickoff in that case.
CCBUG: 508725
---
applets/kickoff/LeaveButtons.qml | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/applets/kickoff/LeaveButtons.qml b/applets/kickoff/LeaveButtons.qml
index c9a14dc3254..acf83639341 100644
--- a/applets/kickoff/LeaveButtons.qml
+++ b/applets/kickoff/LeaveButtons.qml
@@ -214,7 +214,12 @@ RowLayout {
text: model.display
icon: model.decoration
- onClicked: filteredMenuItemsModel.trigger(index)
+ onClicked: {
+ filteredMenuItemsModel.trigger(index)
+ if (kickoff.hideOnWindowDeactivate) {
+ kickoff.expanded = false;
+ }
+ }
}
onObjectAdded: (index, object) => contextMenu.addMenuItem(object)
onObjectRemoved: (index, object) => contextMenu.removeMenuItem(object)
--
GitLab

View file

@ -1,5 +0,0 @@
Pr 462 https://invent.kde.org/plasma/spectacle/-/merge_requests/462
Pr 487 https://invent.kde.org/plasma/spectacle/-/merge_requests/487
Plasma 6.6.0:
Pr 493 https://invent.kde.org/plasma/spectacle/-/merge_requests/493

File diff suppressed because it is too large Load diff

View file

@ -1,704 +0,0 @@
From d72a6fcb76053139ea709d7b1a4f45aa430a066d Mon Sep 17 00:00:00 2001
From: Jhair Paris <dev@jhairparis.com>
Date: Sat, 8 Nov 2025 17:32:20 -0500
Subject: [PATCH 1/4] Enhance OCR language settings management and
synchronization
- Improved signal handling in OcrLanguageSelector to prevent unnecessary updates.
- Added config sync suspension functionality in OcrManager to manage settings changes.
- Adjusted SettingsDialog to ensure proper synchronization of OCR configurations.
---
src/Gui/SettingsDialog/GeneralOptionsPage.cpp | 7 +-
src/Gui/SettingsDialog/GeneralOptionsPage.h | 4 +-
.../SettingsDialog/OcrLanguageSelector.cpp | 132 ++++++++----------
src/Gui/SettingsDialog/OcrLanguageSelector.h | 7 +-
src/Gui/SettingsDialog/SettingsDialog.cpp | 25 +++-
src/Gui/SettingsDialog/SettingsDialog.h | 1 +
src/OcrManager.cpp | 25 ++++
src/OcrManager.h | 3 +
8 files changed, 117 insertions(+), 87 deletions(-)
diff --git a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
index f6be13d56..ae0a997c3 100644
--- a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
+++ b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
@@ -10,7 +10,6 @@
#include "OcrLanguageSelector.h"
#include "OcrManager.h"
-#include "settings.h"
#include "ui_GeneralOptions.h"
#include <KLocalizedString>
@@ -49,7 +48,7 @@ GeneralOptionsPage::GeneralOptionsPage(QWidget *parent)
GeneralOptionsPage::~GeneralOptionsPage() = default;
-void GeneralOptionsPage::refreshOcrLanguageSettings()
+void GeneralOptionsPage::refreshOcrLanguageSettings(bool rebuildSelector)
{
OcrManager *ocrManager = OcrManager::instance();
@@ -62,7 +61,9 @@ void GeneralOptionsPage::refreshOcrLanguageSettings()
m_ui->ocrLanguageScrollArea->setVisible(true);
m_ui->ocrUnavailableWidget->setVisible(false);
- m_ocrLanguageSelector->refresh();
+ if (rebuildSelector) {
+ m_ocrLanguageSelector->refresh();
+ }
}
}
diff --git a/src/Gui/SettingsDialog/GeneralOptionsPage.h b/src/Gui/SettingsDialog/GeneralOptionsPage.h
index a3a5cb17d..bbb6d79a8 100644
--- a/src/Gui/SettingsDialog/GeneralOptionsPage.h
+++ b/src/Gui/SettingsDialog/GeneralOptionsPage.h
@@ -20,8 +20,8 @@ class GeneralOptionsPage : public QWidget
public:
explicit GeneralOptionsPage(QWidget *parent = nullptr);
~GeneralOptionsPage() override;
-
- void refreshOcrLanguageSettings();
+
+ void refreshOcrLanguageSettings(bool rebuildSelector = true);
/**
* @brief Get direct access to the OCR language selector widget
diff --git a/src/Gui/SettingsDialog/OcrLanguageSelector.cpp b/src/Gui/SettingsDialog/OcrLanguageSelector.cpp
index d1d809323..815b4c707 100644
--- a/src/Gui/SettingsDialog/OcrLanguageSelector.cpp
+++ b/src/Gui/SettingsDialog/OcrLanguageSelector.cpp
@@ -12,6 +12,7 @@
#include <KLocalizedString>
#include <QCheckBox>
+#include <QSignalBlocker>
#include <QVBoxLayout>
using namespace Qt::Literals::StringLiterals;
@@ -19,7 +20,6 @@ using namespace Qt::Literals::StringLiterals;
OcrLanguageSelector::OcrLanguageSelector(QWidget *parent)
: QWidget(parent)
, m_layout(new QVBoxLayout(this))
- , m_blockSignals(false)
, m_ocrManager(OcrManager::instance())
{
m_layout->setContentsMargins(0, 0, 0, 0);
@@ -46,15 +46,14 @@ QStringList OcrLanguageSelector::selectedLanguages() const
void OcrLanguageSelector::setSelectedLanguages(const QStringList &languages)
{
- m_blockSignals = true;
+ QSignalBlocker blocker(this);
for (QCheckBox *checkbox : m_languageCheckboxes) {
const QString langCode = checkbox->property("languageCode").toString();
+ QSignalBlocker checkboxBlocker(checkbox);
checkbox->setChecked(languages.contains(langCode));
}
- m_blockSignals = false;
-
enforceSelectionLimits();
}
@@ -67,18 +66,11 @@ bool OcrLanguageSelector::isDefault() const
return false;
}
- // Check if it's English (preferred default)
- for (const QCheckBox *checkbox : m_languageCheckboxes) {
- if (checkbox->property("languageCode").toString() == u"eng"_s) {
- // English is available, so default is English
- return current.contains(u"eng"_s);
- }
- }
+ QCheckBox *defaultCheckbox = findDefaultCheckbox();
- // English not available, default is the first available language
- if (!m_languageCheckboxes.isEmpty()) {
- QString firstLangCode = m_languageCheckboxes.first()->property("languageCode").toString();
- return current.contains(firstLangCode);
+ if (defaultCheckbox) {
+ QString defaultLangCode = defaultCheckbox->property("languageCode").toString();
+ return current.contains(defaultLangCode);
}
return false;
@@ -91,36 +83,28 @@ bool OcrLanguageSelector::hasChanges() const
void OcrLanguageSelector::applyDefaults()
{
- if (!m_languageCheckboxes.isEmpty()) {
- m_blockSignals = true;
-
- for (QCheckBox *checkbox : m_languageCheckboxes) {
- checkbox->setChecked(false);
- }
+ if (m_languageCheckboxes.isEmpty()) {
+ return;
+ }
- // Try to select English first
- bool foundDefault = false;
- for (QCheckBox *checkbox : m_languageCheckboxes) {
- if (checkbox->property("languageCode").toString() == u"eng"_s) {
- checkbox->setChecked(true);
- foundDefault = true;
- break;
- }
- }
+ QSignalBlocker blocker(this);
- // If English not available, select first language
- if (!foundDefault) {
- m_languageCheckboxes.first()->setChecked(true);
- }
+ QCheckBox *defaultCheckbox = findDefaultCheckbox();
- m_blockSignals = false;
+ for (QCheckBox *checkbox : m_languageCheckboxes) {
+ QSignalBlocker checkboxBlocker(checkbox);
+ checkbox->setChecked(checkbox == defaultCheckbox);
+ }
- const QStringList selected = selectedLanguages();
- Settings::setOcrLanguages(selected);
+ const int selectedCount = defaultCheckbox ? 1 : 0;
+ updateCheckboxEnabledStates(selectedCount);
- // Emit signal to notify changes
- Q_EMIT selectedLanguagesChanged(selected);
+ QStringList selected;
+ if (defaultCheckbox) {
+ selected.append(defaultCheckbox->property("languageCode").toString());
}
+
+ Q_EMIT selectedLanguagesChanged(selected);
}
void OcrLanguageSelector::refresh()
@@ -142,13 +126,17 @@ void OcrLanguageSelector::updateWidgets()
void OcrLanguageSelector::onLanguageCheckboxChanged()
{
- if (m_blockSignals) {
- return;
- }
-
enforceSelectionLimits();
- const QStringList selected = selectedLanguages();
+ QStringList selected;
+ selected.reserve(OcrManager::MAX_OCR_LANGUAGES);
+
+ for (QCheckBox *checkbox : m_languageCheckboxes) {
+ if (checkbox->isChecked()) {
+ selected.append(checkbox->property("languageCode").toString());
+ }
+ }
+
Q_EMIT selectedLanguagesChanged(selected);
}
@@ -167,21 +155,20 @@ void OcrLanguageSelector::setupLanguageCheckboxes()
}
m_languageCheckboxes.clear();
- m_availableLanguages.clear();
if (!m_ocrManager || !m_ocrManager->isAvailable()) {
qCWarning(SPECTACLE_LOG) << "OCR is not available; language selector will remain empty.";
return;
}
- m_availableLanguages = m_ocrManager->availableLanguagesWithNames();
+ const QMap<QString, QString> availableLanguages = m_ocrManager->availableLanguagesWithNames();
- if (m_availableLanguages.isEmpty()) {
+ if (availableLanguages.isEmpty()) {
qCWarning(SPECTACLE_LOG) << "No OCR language data available.";
return;
}
- for (auto it = m_availableLanguages.cbegin(); it != m_availableLanguages.cend(); ++it) {
+ for (auto it = availableLanguages.cbegin(); it != availableLanguages.cend(); ++it) {
const QString &langCode = it.key();
if (langCode == u"osd"_s) {
continue;
@@ -208,64 +195,57 @@ void OcrLanguageSelector::setupLanguageCheckboxes()
void OcrLanguageSelector::enforceSelectionLimits()
{
- const QStringList selected = selectedLanguages();
- const int count = selected.size();
+ int selectedCount = 0;
+
+ for (QCheckBox *checkbox : m_languageCheckboxes) {
+ if (checkbox->isChecked()) {
+ ++selectedCount;
+ }
+ }
- if (count > OcrManager::MAX_OCR_LANGUAGES) { // Max languages for performance
+ if (selectedCount > OcrManager::MAX_OCR_LANGUAGES) {
for (int i = m_languageCheckboxes.size() - 1; i >= 0; --i) {
QCheckBox *checkbox = m_languageCheckboxes[i];
if (checkbox->isChecked()) {
- blockSignalsAndSetChecked(checkbox, false);
+ QSignalBlocker blocker(checkbox);
+ checkbox->setChecked(false);
+ --selectedCount;
break;
}
}
}
- updateCheckboxEnabledStates();
+ updateCheckboxEnabledStates(selectedCount);
- if (selectedLanguages().size() == 0 && !m_languageCheckboxes.isEmpty()) {
+ if (selectedCount == 0 && !m_languageCheckboxes.isEmpty()) {
applyDefaults();
}
}
-QString OcrLanguageSelector::getDefaultLanguageCode() const
+QCheckBox *OcrLanguageSelector::findDefaultCheckbox() const
{
if (m_languageCheckboxes.isEmpty()) {
- return QString();
+ return nullptr;
}
// Try English first
- for (const QCheckBox *checkbox : m_languageCheckboxes) {
+ for (QCheckBox *checkbox : m_languageCheckboxes) {
if (checkbox->property("languageCode").toString() == u"eng"_s) {
- return u"eng"_s;
+ return checkbox;
}
}
// Fallback to first available
- return m_languageCheckboxes.first()->property("languageCode").toString();
+ return m_languageCheckboxes.first();
}
-void OcrLanguageSelector::updateCheckboxEnabledStates()
+void OcrLanguageSelector::updateCheckboxEnabledStates(int selectedCount)
{
- const QStringList selected = selectedLanguages();
- const int count = selected.size();
+ const bool enableUnchecked = selectedCount < OcrManager::MAX_OCR_LANGUAGES;
- // If we have max languages selected, disable all unchecked checkboxes
- // If we have less than max, enable all checkboxes
for (QCheckBox *checkbox : m_languageCheckboxes) {
- if (checkbox->isChecked()) {
- checkbox->setEnabled(true);
- } else {
- checkbox->setEnabled(count < OcrManager::MAX_OCR_LANGUAGES);
- }
+ checkbox->setEnabled(checkbox->isChecked() || enableUnchecked);
}
}
-void OcrLanguageSelector::blockSignalsAndSetChecked(QCheckBox *checkbox, bool checked)
-{
- m_blockSignals = true;
- checkbox->setChecked(checked);
- m_blockSignals = false;
-}
-
#include "moc_OcrLanguageSelector.cpp"
\ No newline at end of file
diff --git a/src/Gui/SettingsDialog/OcrLanguageSelector.h b/src/Gui/SettingsDialog/OcrLanguageSelector.h
index 59b1a3d42..e938e06fa 100644
--- a/src/Gui/SettingsDialog/OcrLanguageSelector.h
+++ b/src/Gui/SettingsDialog/OcrLanguageSelector.h
@@ -96,14 +96,11 @@ private Q_SLOTS:
private:
void setupLanguageCheckboxes();
void enforceSelectionLimits();
- void updateCheckboxEnabledStates();
- QString getDefaultLanguageCode() const;
- void blockSignalsAndSetChecked(QCheckBox *checkbox, bool checked);
+ void updateCheckboxEnabledStates(int selectedCount);
+ QCheckBox *findDefaultCheckbox() const;
QVBoxLayout *m_layout;
QList<QCheckBox *> m_languageCheckboxes;
- QMap<QString, QString> m_availableLanguages; // code -> display name
- bool m_blockSignals;
OcrManager *m_ocrManager;
};
diff --git a/src/Gui/SettingsDialog/SettingsDialog.cpp b/src/Gui/SettingsDialog/SettingsDialog.cpp
index 532bfd3c3..696636685 100644
--- a/src/Gui/SettingsDialog/SettingsDialog.cpp
+++ b/src/Gui/SettingsDialog/SettingsDialog.cpp
@@ -11,6 +11,7 @@
#include "GeneralOptionsPage.h"
#include "ImageSaveOptionsPage.h"
#include "OcrLanguageSelector.h"
+#include "OcrManager.h"
#include "ShortcutsOptionsPage.h"
#include "VideoSaveOptionsPage.h"
#include "settings.h"
@@ -46,6 +47,16 @@ SettingsDialog::SettingsDialog(QWidget *parent)
connect(this, &KConfigDialog::currentPageChanged, this, &SettingsDialog::updateButtons);
}
+SettingsDialog::~SettingsDialog()
+{
+ // Ensure OCR config sync is resumed
+ if (OcrManager *ocrManager = OcrManager::instance()) {
+ if (ocrManager->isConfigSyncSuspended()) {
+ ocrManager->setConfigSyncSuspended(false);
+ }
+ }
+}
+
QSize SettingsDialog::sizeHint() const
{
// Avoid having pages that need to be scrolled,
@@ -91,6 +102,10 @@ void SettingsDialog::updateSettings()
m_shortcutsPage->saveChanges();
m_generalPage->ocrLanguageSelector()->saveSettings();
+
+ if (OcrManager *ocrManager = OcrManager::instance()) {
+ ocrManager->setConfigSyncSuspended(false);
+ }
}
void SettingsDialog::updateWidgets()
@@ -100,15 +115,23 @@ void SettingsDialog::updateWidgets()
m_generalPage->ocrLanguageSelector()->updateWidgets();
m_generalPage->refreshOcrLanguageSettings();
+
+ if (OcrManager *ocrManager = OcrManager::instance()) {
+ ocrManager->setConfigSyncSuspended(false);
+ }
}
void SettingsDialog::updateWidgetsDefault()
{
+ if (OcrManager *ocrManager = OcrManager::instance()) {
+ ocrManager->setConfigSyncSuspended(true);
+ }
+
KConfigDialog::updateWidgetsDefault();
m_shortcutsPage->defaults();
m_generalPage->ocrLanguageSelector()->applyDefaults();
- m_generalPage->refreshOcrLanguageSettings();
+ m_generalPage->refreshOcrLanguageSettings(false);
}
#include "moc_SettingsDialog.cpp"
diff --git a/src/Gui/SettingsDialog/SettingsDialog.h b/src/Gui/SettingsDialog/SettingsDialog.h
index 50f6d85bf..64281dd09 100644
--- a/src/Gui/SettingsDialog/SettingsDialog.h
+++ b/src/Gui/SettingsDialog/SettingsDialog.h
@@ -20,6 +20,7 @@ class SettingsDialog : public KConfigDialog
public:
explicit SettingsDialog(QWidget *parent = nullptr);
+ ~SettingsDialog() override;
protected:
QSize sizeHint() const override;
diff --git a/src/OcrManager.cpp b/src/OcrManager.cpp
index 1d09db8ef..56d467993 100644
--- a/src/OcrManager.cpp
+++ b/src/OcrManager.cpp
@@ -56,6 +56,9 @@ OcrManager::OcrManager(QObject *parent)
m_workerThread->start();
connect(Settings::self(), &Settings::ocrLanguagesChanged, this, [this]() {
+ if (m_configSyncSuspended) {
+ return;
+ }
const QStringList newLanguages = Settings::ocrLanguages();
const QString combinedLanguages = newLanguages.join(u"+"_s);
if (combinedLanguages != m_currentLanguageCode) {
@@ -150,6 +153,28 @@ QString OcrManager::currentLanguageCode() const
return m_currentLanguageCode;
}
+void OcrManager::setConfigSyncSuspended(bool suspended)
+{
+ if (m_configSyncSuspended == suspended) {
+ return;
+ }
+
+ m_configSyncSuspended = suspended;
+
+ // On resume, apply any changes made to Settings
+ if (!m_configSyncSuspended) {
+ const QStringList settingsLanguages = Settings::ocrLanguages();
+ if (settingsLanguages != m_configuredLanguages) {
+ setLanguagesByCode(settingsLanguages);
+ }
+ }
+}
+
+bool OcrManager::isConfigSyncSuspended() const
+{
+ return m_configSyncSuspended;
+}
+
void OcrManager::recognizeText(const QImage &image)
{
#ifdef HAVE_TESSERACT_OCR
diff --git a/src/OcrManager.h b/src/OcrManager.h
index c71505b3e..37f490600 100644
--- a/src/OcrManager.h
+++ b/src/OcrManager.h
@@ -98,6 +98,8 @@ public:
* @return Current language code (e.g., "eng", "spa")
*/
QString currentLanguageCode() const;
+ void setConfigSyncSuspended(bool suspended);
+ bool isConfigSyncSuspended() const;
public Q_SLOTS:
/**
@@ -169,6 +171,7 @@ private:
bool m_shouldRestoreToConfigured;
QStringList m_availableLanguages;
QMap<QString, QString> m_languageNames;
+ bool m_configSyncSuspended = false;
bool m_initialized;
private:
--
GitLab
From 642600410714c783515f2416a9be08ef3406b0d9 Mon Sep 17 00:00:00 2001
From: Jhair Paris <dev@jhairparis.com>
Date: Sat, 8 Nov 2025 21:30:41 -0500
Subject: [PATCH 2/4] Fix flickering in settings dialog during OCR
initialization
---
src/Gui/SettingsDialog/GeneralOptionsPage.cpp | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
index ae0a997c3..adfc045e6 100644
--- a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
+++ b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp
@@ -38,7 +38,7 @@ GeneralOptionsPage::GeneralOptionsPage(QWidget *parent)
connect(m_ocrLanguageSelector, &OcrLanguageSelector::selectedLanguagesChanged, this, &GeneralOptionsPage::ocrLanguageChanged);
- refreshOcrLanguageSettings();
+ refreshOcrLanguageSettings(false);
//On Wayland we can't programmatically raise and focus the window so we have to hide the option
if (KWindowSystem::isPlatformWayland() || qstrcmp(qgetenv("XDG_SESSION_TYPE").constData(), "wayland") == 0) {
@@ -51,8 +51,9 @@ GeneralOptionsPage::~GeneralOptionsPage() = default;
void GeneralOptionsPage::refreshOcrLanguageSettings(bool rebuildSelector)
{
OcrManager *ocrManager = OcrManager::instance();
-
- if (!ocrManager->isAvailable()) {
+ const bool ocrAvailable = ocrManager->isAvailable();
+
+ if (!ocrAvailable) {
m_ui->ocrLanguageLabel->setVisible(false);
m_ui->ocrLanguageScrollArea->setVisible(false);
m_ui->ocrUnavailableWidget->setVisible(true);
@@ -60,10 +61,10 @@ void GeneralOptionsPage::refreshOcrLanguageSettings(bool rebuildSelector)
m_ui->ocrLanguageLabel->setVisible(true);
m_ui->ocrLanguageScrollArea->setVisible(true);
m_ui->ocrUnavailableWidget->setVisible(false);
+ }
- if (rebuildSelector) {
- m_ocrLanguageSelector->refresh();
- }
+ if (ocrAvailable && rebuildSelector) {
+ m_ocrLanguageSelector->refresh();
}
}
--
GitLab
From 6c6d95f3fd87ff70f8c1d25786a5a7f047e9d74f Mon Sep 17 00:00:00 2001
From: Jhair Paris <dev@jhairparis.com>
Date: Sat, 8 Nov 2025 21:51:05 -0500
Subject: [PATCH 3/4] Improve OCR language handling in settings dialog
---
src/Gui/SettingsDialog/SettingsDialog.cpp | 24 ++++++++++++++++++-----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/src/Gui/SettingsDialog/SettingsDialog.cpp b/src/Gui/SettingsDialog/SettingsDialog.cpp
index 696636685..0bfab8bb9 100644
--- a/src/Gui/SettingsDialog/SettingsDialog.cpp
+++ b/src/Gui/SettingsDialog/SettingsDialog.cpp
@@ -88,12 +88,20 @@ void SettingsDialog::showEvent(QShowEvent *event)
bool SettingsDialog::hasChanged()
{
- return m_shortcutsPage->isModified() || m_generalPage->ocrLanguageSelector()->hasChanges() || KConfigDialog::hasChanged();
+ bool ocrHasChanges = false;
+ if (OcrManager::instance()->isAvailable()) {
+ ocrHasChanges = m_generalPage->ocrLanguageSelector()->hasChanges();
+ }
+ return m_shortcutsPage->isModified() || ocrHasChanges || KConfigDialog::hasChanged();
}
bool SettingsDialog::isDefault()
{
- return currentPage()->name() != i18n("Shortcuts") && m_generalPage->ocrLanguageSelector()->isDefault() && KConfigDialog::isDefault();
+ bool ocrIsDefault = true;
+ if (OcrManager::instance()->isAvailable()) {
+ ocrIsDefault = m_generalPage->ocrLanguageSelector()->isDefault();
+ }
+ return currentPage()->name() != i18n("Shortcuts") && ocrIsDefault && KConfigDialog::isDefault();
}
void SettingsDialog::updateSettings()
@@ -101,7 +109,9 @@ void SettingsDialog::updateSettings()
KConfigDialog::updateSettings();
m_shortcutsPage->saveChanges();
- m_generalPage->ocrLanguageSelector()->saveSettings();
+ if (OcrManager::instance()->isAvailable()) {
+ m_generalPage->ocrLanguageSelector()->saveSettings();
+ }
if (OcrManager *ocrManager = OcrManager::instance()) {
ocrManager->setConfigSyncSuspended(false);
@@ -113,7 +123,9 @@ void SettingsDialog::updateWidgets()
KConfigDialog::updateWidgets();
m_shortcutsPage->resetChanges();
- m_generalPage->ocrLanguageSelector()->updateWidgets();
+ if (OcrManager::instance()->isAvailable()) {
+ m_generalPage->ocrLanguageSelector()->updateWidgets();
+ }
m_generalPage->refreshOcrLanguageSettings();
if (OcrManager *ocrManager = OcrManager::instance()) {
@@ -130,7 +142,9 @@ void SettingsDialog::updateWidgetsDefault()
KConfigDialog::updateWidgetsDefault();
m_shortcutsPage->defaults();
- m_generalPage->ocrLanguageSelector()->applyDefaults();
+ if (OcrManager::instance()->isAvailable()) {
+ m_generalPage->ocrLanguageSelector()->applyDefaults();
+ }
m_generalPage->refreshOcrLanguageSettings(false);
}
--
GitLab
From 174b4a4a10e2c42fa28eb361cd4b6a833af60dc7 Mon Sep 17 00:00:00 2001
From: Jhair Paris <dev@jhairparis.com>
Date: Mon, 10 Nov 2025 22:10:51 -0500
Subject: [PATCH 4/4] Remove Tesseract language pack validation test and
simplify OCR support check
---
CMakeLists.txt | 24 ++----------------------
cmake/tesseract_test.cpp | 40 ----------------------------------------
2 files changed, 2 insertions(+), 62 deletions(-)
delete mode 100644 cmake/tesseract_test.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ea44e71d4..2adf8a9ac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,28 +96,8 @@ if(PkgConfig_FOUND)
pkg_check_modules(TESSERACT tesseract)
if(TESSERACT_FOUND)
- # Test if Tesseract has usable language packs
- try_run(
- TESSERACT_TEST_RUN_RESULT
- TESSERACT_TEST_COMPILE_RESULT
- ${CMAKE_CURRENT_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/tesseract_test.cpp
- LINK_LIBRARIES ${TESSERACT_LIBRARIES}
- CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${TESSERACT_INCLUDE_DIRS}"
- COMPILE_OUTPUT_VARIABLE TESSERACT_COMPILE_OUTPUT
- RUN_OUTPUT_VARIABLE TESSERACT_RUN_OUTPUT
- )
-
- if(TESSERACT_TEST_COMPILE_RESULT AND TESSERACT_TEST_RUN_RESULT EQUAL 0)
- message(STATUS "Tesseract OCR support enabled")
- message(STATUS "${TESSERACT_RUN_OUTPUT}")
- set(HAVE_TESSERACT_OCR TRUE)
- else()
- message(WARNING "Tesseract library found but no usable language packs detected")
- message(WARNING "${TESSERACT_RUN_OUTPUT}")
- message(WARNING "OCR functionality will be disabled. Install language data packages (e.g., tesseract-ocr-eng)")
- set(HAVE_TESSERACT_OCR FALSE)
- endif()
+ message(STATUS "Tesseract OCR support enabled")
+ set(HAVE_TESSERACT_OCR TRUE)
else()
message(STATUS "Tesseract not found - OCR functionality disabled")
set(HAVE_TESSERACT_OCR FALSE)
diff --git a/cmake/tesseract_test.cpp b/cmake/tesseract_test.cpp
deleted file mode 100644
index 4ebae9779..000000000
--- a/cmake/tesseract_test.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <iostream>
-#include <string>
-#include <tesseract/baseapi.h>
-#include <vector>
-
-int main()
-{
- tesseract::TessBaseAPI api;
-
- if (api.Init(nullptr, nullptr) != 0) {
- std::cerr << "Failed to initialize Tesseract" << std::endl;
- return 1;
- }
-
- std::vector<std::string> languages;
- api.GetAvailableLanguagesAsVector(&languages);
-
- // Filter out 'osd' as it's not a usable language for OCR
- std::vector<std::string> usableLanguages;
- for (const auto &lang : languages) {
- if (lang != "osd") {
- usableLanguages.push_back(lang);
- }
- }
-
- if (usableLanguages.empty()) {
- std::cerr << "No usable Tesseract language packs found. Install language data files (e.g., tesseract-ocr-eng)" << std::endl;
- return 1;
- }
-
- std::cout << "Found " << usableLanguages.size() << " Tesseract language pack(s): ";
- for (size_t i = 0; i < usableLanguages.size(); ++i) {
- std::cout << usableLanguages[i];
- if (i < usableLanguages.size() - 1)
- std::cout << ", ";
- }
- std::cout << std::endl;
-
- return 0;
-}
--
GitLab

View file

@ -1,129 +0,0 @@
From 49c615c1989d9fcfce7ed1be805538a9dca6a8a8 Mon Sep 17 00:00:00 2001
From: Taras Oleksyn <taras.oleksyn@gmail.com>
Date: Sat, 29 Nov 2025 10:17:28 +0200
Subject: [PATCH] Add cancel button to capture window to improve touchscreen
usability
BUG: 490980
---
src/CMakeLists.txt | 1 +
src/Gui/CancelAction.qml | 11 +++++++++++
src/Gui/CaptureOverlay.qml | 14 ++++++++++++++
src/Gui/CaptureWindow.cpp | 5 +++++
src/Gui/CaptureWindow.h | 1 +
src/PlasmaVersion.h | 2 +-
6 files changed, 33 insertions(+), 1 deletion(-)
create mode 100644 src/Gui/CancelAction.qml
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 23fc4f483..f4957bda7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -158,6 +158,7 @@ qt_target_qml_sources(spectacle
Gui/AnnotationOptionsToolBarContents.qml
Gui/AnnotationsToolBarContents.qml
Gui/ButtonGrid.qml
+ Gui/CancelAction.qml
Gui/CaptureModeButtonsColumn.qml
Gui/CaptureOptions.qml
Gui/CaptureOverlay.qml
diff --git a/src/Gui/CancelAction.qml b/src/Gui/CancelAction.qml
new file mode 100644
index 000000000..74bf54816
--- /dev/null
+++ b/src/Gui/CancelAction.qml
@@ -0,0 +1,11 @@
+/* SPDX-FileCopyrightText: 2025 Noah Davis <noahadvs@gmail.com>
+ * SPDX-License-Identifier: LGPL-2.0-or-later
+ */
+
+import QtQuick.Templates as T
+
+T.Action {
+ icon.name: "dialog-cancel"
+ text: i18nc("@action cancel selection", "Cancel")
+ onTriggered: contextWindow.cancel()
+}
diff --git a/src/Gui/CaptureOverlay.qml b/src/Gui/CaptureOverlay.qml
index e5089934d..5c15d9939 100644
--- a/src/Gui/CaptureOverlay.qml
+++ b/src/Gui/CaptureOverlay.qml
@@ -491,6 +491,11 @@ MouseArea {
visible: action.enabled
action: AcceptAction {}
}
+ ToolButton {
+ display: TtToolButton.TextBesideIcon
+ visible: action.enabled
+ action: CancelAction {}
+ }
ToolButton {
display: TtToolButton.IconOnly
visible: action.enabled
@@ -527,6 +532,10 @@ MouseArea {
visible: action.enabled
action: AcceptAction {}
}
+ ToolButton {
+ visible: action.enabled
+ action: CancelAction {}
+ }
ToolButton {
visible: action.enabled
action: SaveAction {}
@@ -560,6 +569,11 @@ MouseArea {
visible: action.enabled
action: RecordAction {}
}
+ ToolButton {
+ display: TtToolButton.TextBesideIcon
+ visible: action.enabled
+ action: CancelAction {}
+ }
}
}
diff --git a/src/Gui/CaptureWindow.cpp b/src/Gui/CaptureWindow.cpp
index cb8ce97ab..c263d1b45 100644
--- a/src/Gui/CaptureWindow.cpp
+++ b/src/Gui/CaptureWindow.cpp
@@ -129,6 +129,11 @@ bool CaptureWindow::accept()
return SelectionEditor::instance()->acceptSelection();
}
+void CaptureWindow::cancel()
+{
+ SpectacleCore::instance()->cancelScreenshot();
+}
+
void CaptureWindow::save()
{
SelectionEditor::instance()->acceptSelection(ExportManager::Save | ExportManager::UserAction);
diff --git a/src/Gui/CaptureWindow.h b/src/Gui/CaptureWindow.h
index b5e87a834..0d50aac90 100644
--- a/src/Gui/CaptureWindow.h
+++ b/src/Gui/CaptureWindow.h
@@ -34,6 +34,7 @@ public:
public Q_SLOTS:
bool accept();
+ void cancel();
void save() override;
void saveAs() override;
void copyImage() override;
diff --git a/src/PlasmaVersion.h b/src/PlasmaVersion.h
index 08502c895..9518da62b 100644
--- a/src/PlasmaVersion.h
+++ b/src/PlasmaVersion.h
@@ -15,7 +15,7 @@ public:
static quint32 get();
/**
- * Use this for plasama versions the same way you'd use QT_VERSION_CHECK()
+ * Use this for plasma versions the same way you'd use QT_VERSION_CHECK()
*/
static quint32 check(quint8 major, quint8 minor, quint8 patch);
--
GitLab

View file

@ -43,19 +43,40 @@ in {
programs.dconf.enable = true;
# Install the plasma default configs
environment.systemPackages = with pkgs.kdePackages; [
plasmaDefaults
plasma-thunderbolt
plasma-vault
];
# Allows controlling brightness on external monitors
hardware.i2c.enable = true;
environment.systemPackages = [plasmaDefaults];
# Plasma configs should be on all users
home-manager.sharedModules = [
(
{config, ...}: let
gtk2rc = "${config.xdg.configHome}/gtk-2.0/gtkrc";
in {
gtk.gtk2.configLocation = gtk2rc;
# Kde has an annoying habit of overwriting the gtk2 config file
home.file."${gtk2rc}".force = true;
}
)
{
imports = [flakeSelf.inputs.plasma-manager.homeModules.plasma-manager];
imports = [flakeSelf.inputs.plasma-manager.homeManagerModules.plasma-manager];
gtk = {
enable = true;
# Most apps are dark, so a white cursor is easier to spot
cursorTheme = {
package = pkgs.kdePackages.breeze;
name = "Breeze_Light";
};
iconTheme = {
package = pkgs.kdePackages.breeze-icons;
name = "breeze-dark";
};
theme = {
package = pkgs.kdePackages.breeze-gtk;
name = "Breeze";
};
# Gtk2 doesn't have a dark mode, so I just tell gtk 3 and 4 to use the dark variant
gtk3.extraConfig.gtk-application-prefer-dark-theme = true;
gtk4.extraConfig.gtk-application-prefer-dark-theme = true;
};
home.packages = [
(
pkgs.catppuccin-kde.override {
@ -69,68 +90,60 @@ in {
enable = true;
workspace = {
clickItemTo = "select";
cursor.theme = "Breeze_Light";
cursorTheme = "Breeze_Light";
iconTheme = "breeze-dark";
lookAndFeel = "Catppuccin-Mocha-Mauve";
theme = "default";
colorScheme = "CatppuccinMochaMauve";
};
kwin = {
titlebarButtons = {
left = ["on-all-desktops" "keep-above-windows"];
right = ["minimize" "maximize" "close"];
};
virtualDesktops = {
rows = 1;
number = 2;
};
};
input = {
keyboard = {
layouts = [{layout = "es";}];
layouts = ["es"];
numlockOnStartup = "off";
};
mice = let
settings = {
enable = true;
accelerationProfile = "none";
};
mice = [
{
productId = "d030";
vendorId = "3434";
name = "Keychron Keychron Link ";
}
{
productId = "d03f";
vendorId = "3434";
name = "Keychron Keychron M6 ";
}
{
productId = "d03f";
vendorId = "3434";
name = "Keychron M6 Mouse";
}
];
in
lib.lists.forEach mice (miceInfo: miceInfo // settings);
};
panels = [
{
location = "bottom";
height = 44;
floating = true;
widgets = [
{
kickoff = {
icon = "nix-snowflake-white";
settings.General.switchCategoryOnHover = true;
};
name = "org.kde.plasma.kickoff";
config.General.icon = "nix-snowflake-white";
}
"org.kde.plasma.pager"
"org.kde.plasma.icontasks"
"org.kde.plasma.marginsseparator"
"org.kde.plasma.systemtray"
{
digitalClock = {
time.showSeconds = "always";
};
name = "org.kde.plasma.digitalclock";
config.Appearance.showSeconds = "true";
}
"org.kde.plasma.showdesktop"
];
}
];
shortcuts = {
"kwin" = {
"Switch One Desktop to the Left" = ["Meta+Ctrl+Left"];
"Switch One Desktop to the Right" = ["Meta+Ctrl+Right"];
};
};
configFile = {
"kwinrc" = {
"org.kde.kdecoration2"."BorderSize".value = "None";
"TabBox"."LayoutName".value = "thumbnail_grid";
};
"kdeglobals"."General"."AccentColor".value = null;
"auroraerc"."CatppuccinMocha-Classic"."ButtonSize".value = 0;
"plasmanotifyrc"."Notifications"."NormalAlwaysOnTop".value = true;

View file

@ -1,16 +0,0 @@
{lib, ...}: {
home-manager.users.toast = {
programs.plasma.configFile = {
"baloofilerc"."General" = {
"exclude folders".shellExpand = true;
"exclude folders".value = with lib.strings;
concatStrings (
intersperse "," [
"$HOME/Documents/Repos"
"$HOME/Documents/Android"
]
);
};
};
};
}

View file

@ -1,17 +1,13 @@
{pkgs, ...}: {
{...}: {
imports = [
./kate.nix
./firefox.nix
./skanpage.nix
# Neochat depends on olm which is unsafe now
# ./neochat.nix
./neochat.nix
./konsole.nix
./kwin.nix
./baloo.nix
./spectacle.nix
./git.nix
];
# Enable the kde partition manager
programs.partition-manager.enable = true;
programs.steam.extraPackages = [pkgs.kdePackages.breeze];
}

View file

@ -1,35 +1,30 @@
{pkgs, ...}: {
home-manager.sharedModules = [
{
# KDE specific firefox settings
programs.firefox = {
nativeMessagingHosts = [pkgs.kdePackages.plasma-browser-integration];
policies = {
ExtensionSettings = {
# TODO: Install extensions the NUR instead of from AMO
"plasma-browser-integration@kde.org" = {
installation_mode = "normal_installed";
install_url = "https://addons.mozilla.org/firefox/downloads/latest/plasma-integration/latest.xpi";
};
};
Preferences = {
# Make firefox use the kde file picker
"widget.use-xdg-desktop-portal.file-picker" = {
Value = 1;
Status = "default";
};
/*
https://wiki.archlinux.org/title/Firefox#KDE_integration tells me to enable this,
but strangely enough doing so makes firefox ask to be set as the default browser
every time you start it up, so I'll disable it
*/
"widget.use-xdg-desktop-portal.mime-handler" = {
Value = 0;
Status = "default";
};
};
{...}: {
# KDE specific firefox settings
programs.firefox = {
policies = {
"ExtensionSettings" = {
# TODO: Install extensions the NUR instead of from AMO
"plasma-browser-integration@kde.org" = {
"installation_mode" = "normal_installed";
"install_url" = "https://addons.mozilla.org/firefox/downloads/latest/plasma-integration/latest.xpi";
};
};
}
];
"Preferences" = {
# Make firefox use the kde file picker
"widget.use-xdg-desktop-portal.file-picker" = {
"Value" = 1;
"Status" = "default";
};
/*
https://wiki.archlinux.org/title/Firefox#KDE_integration tells me to enable this,
but strangely enough doing so makes firefox ask to be set as the default browser
every time you start it up, so I'll disable it
*/
"widget.use-xdg-desktop-portal.mime-handler" = {
"Value" = 0;
"Status" = "default";
};
};
};
};
}

View file

@ -0,0 +1,11 @@
{...}: {
home-manager.users.toast = {
programs.git = {
extraConfig = {
cola = {
terminal = "konsole";
};
};
};
};
}

View file

@ -1,5 +1,5 @@
{pkgs, ...}: {
environment.systemPackages = [pkgs.kdePackages.kate];
environment.systemPackages = [pkgs.kate];
# Use kwrite to open text files, and kate if I'm developing stuff
xdg.mime.defaultApplications = {

View file

@ -1,5 +1,13 @@
{flakeSelf, ...}: let
catppuccinKonsole = "${flakeSelf.inputs.catppuccin-konsole}/themes/catppuccin-mocha.colorscheme";
{pkgs, ...}: let
catppuccinKonsole =
pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "konsole";
# Latest commit is 7d86b8a1e56e58f6b5649cdaac543a573ac194ca
rev = "main";
hash = "sha256-EwSJMTxnaj2UlNJm1t6znnatfzgm1awIQQUF3VPfCTM=";
}
+ /Catppuccin-Mocha.colorscheme;
in {
home-manager.users.toast = {
xdg.dataFile = {

View file

@ -1,33 +0,0 @@
{pkgs, ...}: {
environment.plasma6.excludePackages = [pkgs.kdePackages.kwin-x11];
environment.variables = {
KWIN_WAYLAND_SUPPORT_XX_PIP_V1 = 1;
KWIN_USE_OVERLAYS = 1;
};
home-manager.users.toast = {
programs.plasma = {
kwin = {
titlebarButtons = {
left = ["on-all-desktops" "keep-above-windows"];
right = ["minimize" "maximize" "close"];
};
virtualDesktops = {
rows = 1;
number = 2;
};
};
configFile = {
"kwinrc" = {
"org.kde.kdecoration2"."BorderSize".value = "None";
"TabBox"."LayoutName".value = "thumbnail_grid";
};
};
shortcuts = {
"kwin" = {
"Switch One Desktop to the Left" = ["Meta+Ctrl+Left"];
"Switch One Desktop to the Right" = ["Meta+Ctrl+Right"];
};
};
};
};
}

View file

@ -6,7 +6,7 @@
}: {
# Only install skanpage if scanning is set up
config = lib.mkIf config.hardware.sane.enable {
environment.systemPackages = [pkgs.kdePackages.skanpage];
environment.systemPackages = [pkgs.skanpage];
};
# environment.systemPackages = if config.hardware.sane.enable == true then [ pkgs.skanpage ] else [];
}

View file

@ -1,24 +0,0 @@
{...}: {
nixpkgs.overlays = [
(
final: prev: {
kdePackages = prev.kdePackages.overrideScope (
kFinal: kPrev: {
# Needed for OCR
spectacle = kPrev.spectacle.overrideAttrs (old: {
nativeBuildInputs = old.nativeBuildInputs ++ [final.pkg-config];
buildInputs = with final;
old.buildInputs
++ [
tesseract
leptonica
libarchive
curl
];
});
}
);
}
)
];
}

View file

@ -1,8 +1,10 @@
{
lib,
config,
pkgs,
...
}: let
currentTheme = config.services.displayManager.sddm.theme;
sddm-sugar-candy = pkgs.stdenv.mkDerivation {
pname = "sddm-sugar-candy";
version = "master";
@ -28,18 +30,13 @@
customcfg = pkgs.stdenv.mkDerivation {
name = "sddm-theme-customizer";
dontUnpack = true;
installPhase = let
config = lib.generators.toINI {} {
# Add the custom config here
General = {
background = "${pkgs.kdePackages.breeze}/share/wallpapers/Next/contents/images_dark/5120x2880.png";
};
};
in ''
# TODO: generate theme.conf.user outside of installPhase
installPhase = ''
runHook preInstall
mkdir -p $out/share/sddm/themes/breeze/
echo "${config}" >> $out/share/sddm/themes/breeze/theme.conf.user
mkdir -p $out/share/sddm/themes/${currentTheme}/
echo "[General]
background = ${pkgs.plasma-workspace-wallpapers}/share/wallpapers/MilkyWay/contents/images/5120x2880.png" >> $out/share/sddm/themes/${currentTheme}/theme.conf.user
runHook postInstall
'';
@ -48,15 +45,12 @@ in {
# Enable SDDM.
services.displayManager.sddm = {
enable = true;
wayland.enable = true;
# theme = "sugar-candy";
settings = {
General = {Numlock = "off";};
Theme = {CursorTheme = "Breeze_Light";};
Theme = {CursorTheme = "Breeze_Snow";};
};
};
# Sugar candy doesn't seem to work on qt6 :(
# environment.systemPackages = [sddm-sugar-candy customcfg];
environment.systemPackages = [customcfg];
}

6
roles/school/default.nix Normal file
View file

@ -0,0 +1,6 @@
{...}: {
imports = [
./services
./programs
];
}

View file

@ -0,0 +1,13 @@
{pkgs, ...}: {
imports = [
./virtualbox.nix
./jetbrains.nix
./vscode.nix
./helix.nix
./unity.nix
];
environment.systemPackages = with pkgs; [
dia
];
}

View file

@ -0,0 +1,10 @@
{pkgs, ...}: {
home-manager.users.toast = {
programs.helix = {
extraPackages = with pkgs; [
nodePackages.typescript-language-server
omnisharp-roslyn
];
};
};
}

View file

@ -0,0 +1,19 @@
{pkgs, ...}:
with pkgs; {
environment.systemPackages = with jetbrains; [
idea-ultimate
scenebuilder
datagrip
];
home-manager.users.toast = {
/*
If you use programs.java.enable intellij picks up the jdk package directly, which is not ideal
This adds the jdks I want to use to a directory intellij expects jdks to be
*/
home.file.".jdks/jdk8".source = "${pkgs.jdk8}/lib/openjdk";
home.file.".jdks/jdk17".source = let
jdk17 = pkgs.jdk17.override {enableJavaFX = true;};
in "${jdk17}/lib/openjdk";
};
}

View file

@ -0,0 +1,8 @@
{pkgs, ...}: {
home-manager.users.toast = {
home.packages = with pkgs; [
unityhub
jetbrains.rider
];
};
}

Some files were not shown because too many files have changed in this diff Show more