diff --git a/.bash_profile b/.bash_profile new file mode 100644 index 0000000..e69de29 diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..e69de29 diff --git a/.claude/agents b/.claude/agents new file mode 100644 index 0000000..e69de29 diff --git a/.claude/commands b/.claude/commands new file mode 100644 index 0000000..e69de29 diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..e69de29 diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 5918ed1..8bef185 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -21,7 +21,16 @@ "Bash(nix-build:*)", "Bash(direnv version:*)", "Bash(nix:*)", - "WebFetch(domain:devenv.sh)" + "WebFetch(domain:devenv.sh)", + "WebFetch(domain:discourse.nixos.org)", + "Bash(curl:*)", + "WebFetch(domain:quickshell.org)", + "WebFetch(domain:www.tonybtw.com)", + "Bash(systemctl:*)", + "Bash(darkman get:*)", + "Bash(dconf read:*)", + "Bash(journalctl:*)", + "Bash(hyprctl:*)" ] }, "sandbox": { diff --git a/.claude/skills b/.claude/skills new file mode 100644 index 0000000..e69de29 diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 0000000..e69de29 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/.idea b/.idea new file mode 100644 index 0000000..e69de29 diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..e69de29 diff --git a/.profile b/.profile new file mode 100644 index 0000000..e69de29 diff --git a/.ripgreprc b/.ripgreprc new file mode 100644 index 0000000..e69de29 diff --git a/.vscode b/.vscode new file mode 100644 index 0000000..e69de29 diff --git a/.zprofile b/.zprofile new file mode 100644 index 0000000..e69de29 diff --git a/.zshrc b/.zshrc new file mode 100644 index 0000000..e69de29 diff --git a/HEAD b/HEAD new file mode 100644 index 0000000..e69de29 diff --git a/config b/config new file mode 100644 index 0000000..e69de29 diff --git a/flake.lock b/flake.lock index 2645fa8..01b8ff7 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,38 @@ { "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770895474, + "narHash": "sha256-JBcrq1Y0uw87VZdYsByVbv+GBuT6ECaCNb9txLX9UuU=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "a494d50d32b5567956b558437ceaa58a380712f7", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, "base16-schemes": { "flake": false, "locked": { @@ -35,6 +68,31 @@ "type": "github" } }, + "elephant": { + "inputs": { + "nixpkgs": [ + "walker", + "nixpkgs" + ], + "systems": [ + "walker", + "systems" + ] + }, + "locked": { + "lastModified": 1768551400, + "narHash": "sha256-mlHlHW8qLcHm42J1M34HLXLW+Rw8jsLkLdjSvIYlhjw=", + "owner": "abenz1267", + "repo": "elephant", + "rev": "f230c43ae94231c2db754f84a4f31cf76721a28a", + "type": "github" + }, + "original": { + "owner": "abenz1267", + "repo": "elephant", + "type": "github" + } + }, "ethui": { "inputs": { "nixpkgs": "nixpkgs_2", @@ -56,6 +114,22 @@ "type": "github" } }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -112,7 +186,7 @@ }, "flake-utils_3": { "inputs": { - "systems": "systems_4" + "systems": "systems_6" }, "locked": { "lastModified": 1731533236, @@ -147,13 +221,35 @@ "type": "github" } }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "hardware": { "locked": { - "lastModified": 1771169962, - "narHash": "sha256-qpt3IhiY7L3Xf4XZn+k7m70BJwC0geUunoXDBHCBr84=", + "lastModified": 1771171797, + "narHash": "sha256-ngIarpog/Hv5r9M1YyvsaaSUBCqtWqHl6pibq6n2ppo=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "cd8c113bddb3805583c1419de1dcdde63254d34e", + "rev": "531af1dbaee7cfdd7aed1e595ce418b7e2e99a80", "type": "github" }, "original": { @@ -204,13 +300,233 @@ "type": "github" } }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1753964049, + "narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770511807, + "narHash": "sha256-suKmSbSk34uPOJDTg/GbPrKEJutzK08vj0VoTvAFBCA=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "7c75487edd43a71b61adb01cae8326d277aab683", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprgraphics": "hyprgraphics", + "hyprland-guiutils": "hyprland-guiutils", + "hyprland-protocols": "hyprland-protocols", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "hyprwire": "hyprwire", + "nixpkgs": "nixpkgs_5", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems_3", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1771177803, + "narHash": "sha256-7HNX0Dy6liSZo8H/Od3JTPIH2gs+yuXKvf5kIkgJqI8=", + "ref": "refs/heads/main", + "rev": "6716b8a0e32b1adf68cd158ea38acec73f3fc22e", + "revCount": 6893, + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" + }, + "original": { + "submodules": true, + "type": "git", + "url": "https://github.com/hyprwm/Hyprland" + } + }, + "hyprland-guiutils": { + "inputs": { + "aquamarine": [ + "hyprland", + "aquamarine" + ], + "hyprgraphics": [ + "hyprland", + "hyprgraphics" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprtoolkit": "hyprtoolkit", + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1767023960, + "narHash": "sha256-R2HgtVS1G3KSIKAQ77aOZ+Q0HituOmPgXW9nBNkpp3Q=", + "owner": "hyprwm", + "repo": "hyprland-guiutils", + "rev": "c2e906261142f5dd1ee0bfc44abba23e2754c660", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-guiutils", + "type": "github" + } + }, + "hyprland-plugins": { + "inputs": { + "hyprland": [ + "hyprland" + ], + "nixpkgs": [ + "hyprland-plugins", + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland-plugins", + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770899531, + "narHash": "sha256-UBrWjh0DR8db60aLNkTnZTJ9F4kWK0Y7rUDNJC88W7A=", + "owner": "hyprwm", + "repo": "hyprland-plugins", + "rev": "e03c34ccd51280a44ea6d1f5c040cd81ecca25ed", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-plugins", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1765214753, + "narHash": "sha256-P9zdGXOzToJJgu5sVjv7oeOGPIIwrd9hAUAP3PsmBBs=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "3f3860b869014c00e8b9e0528c7b4ddc335c21ab", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1767983607, + "narHash": "sha256-8C2co8NYfR4oMOUEsPROOJ9JHrv9/ktbJJ6X1WsTbXc=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "d4037379e6057246b408bbcf796cf3e9838af5b2", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprlang_2": { "inputs": { "nixpkgs": [ "rose-pine-hyprcursor", "nixpkgs" ], - "systems": "systems_5" + "systems": "systems_7" }, "locked": { "lastModified": 1709914708, @@ -226,6 +542,158 @@ "type": "github" } }, + "hyprspace": { + "inputs": { + "hyprland": [ + "hyprland" + ], + "systems": "systems_4" + }, + "locked": { + "lastModified": 1767871242, + "narHash": "sha256-Gge7LY1lrPc2knDnyw8GBQ2sxRPzM7W2T6jNG1HY5bA=", + "owner": "KZDKM", + "repo": "Hyprspace", + "rev": "bcd969224ffeb6266c6618c192949461135eef38", + "type": "github" + }, + "original": { + "owner": "KZDKM", + "repo": "Hyprspace", + "type": "github" + } + }, + "hyprtoolkit": { + "inputs": { + "aquamarine": [ + "hyprland", + "hyprland-guiutils", + "aquamarine" + ], + "hyprgraphics": [ + "hyprland", + "hyprland-guiutils", + "hyprgraphics" + ], + "hyprlang": [ + "hyprland", + "hyprland-guiutils", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprland-guiutils", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprland-guiutils", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "hyprland-guiutils", + "nixpkgs" + ], + "systems": [ + "hyprland", + "hyprland-guiutils", + "systems" + ] + }, + "locked": { + "lastModified": 1764592794, + "narHash": "sha256-7CcO+wbTJ1L1NBQHierHzheQGPWwkIQug/w+fhTAVuU=", + "owner": "hyprwm", + "repo": "hyprtoolkit", + "rev": "5cfe0743f0e608e1462972303778d8a0859ee63e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprtoolkit", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770139857, + "narHash": "sha256-bCqxcXjavgz5KBJ/1CBLqnagMMf9JvU1m9HmYVASKoc=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "9038eec033843c289b06b83557a381a2648d8fa5", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770501770, + "narHash": "sha256-NWRM6+YxTRv+bT9yvlhhJ2iLae1B1pNH3mAL5wi2rlQ=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "0bd8b6cde9ec27d48aad9e5b4deefb3746909d40", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "hyprwire": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1770203293, + "narHash": "sha256-PR/KER+yiHabFC/h1Wjb+9fR2Uy0lWM3Qld7jPVaWkk=", + "owner": "hyprwm", + "repo": "hyprwire", + "rev": "37bc90eed02b0c8b5a77a0b00867baf3005cfb98", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwire", + "type": "github" + } + }, "nix-colors": { "inputs": { "base16-schemes": "base16-schemes", @@ -276,6 +744,22 @@ "type": "github" } }, + "nixpkgs_10": { + "locked": { + "lastModified": 1771008912, + "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "a82ccc39b39b621151d6732718e3e250109076fa", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_2": { "locked": { "lastModified": 1752480373, @@ -323,6 +807,22 @@ } }, "nixpkgs_5": { + "locked": { + "lastModified": 1770841267, + "narHash": "sha256-9xejG0KoqsoKEGp2kVbXRlEYtFFcDTHjidiuX8hGO44=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ec7c70d12ce2fc37cb92aff673dcdca89d187bae", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_6": { "locked": { "lastModified": 1771008912, "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", @@ -338,7 +838,7 @@ "type": "github" } }, - "nixpkgs_6": { + "nixpkgs_7": { "locked": { "lastModified": 1770380644, "narHash": "sha256-P7dWMHRUWG5m4G+06jDyThXO7kwSk46C1kgjEWcybkE=", @@ -354,7 +854,7 @@ "type": "github" } }, - "nixpkgs_7": { + "nixpkgs_8": { "locked": { "lastModified": 1710272261, "narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=", @@ -370,17 +870,17 @@ "type": "github" } }, - "nixpkgs_8": { + "nixpkgs_9": { "locked": { - "lastModified": 1771008912, - "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", - "owner": "nixos", + "lastModified": 1768564909, + "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "a82ccc39b39b621151d6732718e3e250109076fa", + "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f", "type": "github" }, "original": { - "owner": "nixos", + "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -389,8 +889,8 @@ "nixvim": { "inputs": { "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs_6", - "systems": "systems_3" + "nixpkgs": "nixpkgs_7", + "systems": "systems_5" }, "locked": { "lastModified": 1771135771, @@ -409,11 +909,11 @@ "nvchad-starter": { "flake": false, "locked": { - "lastModified": 1770223222, - "narHash": "sha256-K79DeMiFAf3hrV6FTmsYVZoN0trzCpMWqLM2r3QJInA=", + "lastModified": 1771259985, + "narHash": "sha256-WDAH2Rn5udhULSMV76g6qj8WUZNKKtQJwn6SiqZmIfU=", "owner": "naps62", "repo": "nvchad-starter", - "rev": "578bd4076e922ee558005b2bc1a789351652c9d1", + "rev": "a16bb42a45a02836c449d88f78f823de81be6971", "type": "github" }, "original": { @@ -446,6 +946,49 @@ "type": "github" } }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770726378, + "narHash": "sha256-kck+vIbGOaM/dHea7aTBxdFYpeUl/jHOy5W3eyRvVx8=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "5eaaedde414f6eb1aea8b8525c466dc37bba95ae", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "quickshell": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1770693276, + "narHash": "sha256-ngXnN5YXu+f45+QGYNN/VEBMQmcBCYGRCqwaK8cxY1s=", + "ref": "refs/heads/master", + "rev": "dacfa9de829ac7cb173825f593236bf2c21f637e", + "revCount": 735, + "type": "git", + "url": "https://git.outfoxxed.me/outfoxxed/quickshell" + }, + "original": { + "type": "git", + "url": "https://git.outfoxxed.me/outfoxxed/quickshell" + } + }, "root": { "inputs": { "claude-code": "claude-code", @@ -453,21 +996,26 @@ "foundry": "foundry", "hardware": "hardware", "home-manager": "home-manager", + "hyprland": "hyprland", + "hyprland-plugins": "hyprland-plugins", + "hyprspace": "hyprspace", "nix-colors": "nix-colors", - "nixpkgs": "nixpkgs_5", + "nixpkgs": "nixpkgs_6", "nixvim": "nixvim", "nvchad-starter": "nvchad-starter", "nvchad4nix": "nvchad4nix", + "quickshell": "quickshell", "rose-pine-hyprcursor": "rose-pine-hyprcursor", - "systems": "systems_7", + "systems": "systems_9", "utils": "utils_3", + "walker": "walker", "zen-browser": "zen-browser" } }, "rose-pine-hyprcursor": { "inputs": { - "hyprlang": "hyprlang", - "nixpkgs": "nixpkgs_7", + "hyprlang": "hyprlang_2", + "nixpkgs": "nixpkgs_8", "utils": "utils_2" }, "locked": { @@ -517,6 +1065,36 @@ "type": "github" } }, + "systems_10": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_11": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "systems_2": { "locked": { "lastModified": 1681028828, @@ -534,35 +1112,20 @@ }, "systems_3": { "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", "type": "github" }, "original": { "owner": "nix-systems", - "repo": "default", + "repo": "default-linux", "type": "github" } }, "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_5": { "locked": { "lastModified": 1689347949, "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", @@ -577,6 +1140,21 @@ "type": "github" } }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "systems_6": { "locked": { "lastModified": 1681028828, @@ -622,6 +1200,21 @@ "type": "github" } }, + "systems_9": { + "locked": { + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", + "owner": "nix-systems", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default-linux", + "type": "github" + } + }, "utils": { "inputs": { "systems": "systems_2" @@ -642,7 +1235,7 @@ }, "utils_2": { "inputs": { - "systems": "systems_6" + "systems": "systems_8" }, "locked": { "lastModified": 1710146030, @@ -660,7 +1253,7 @@ }, "utils_3": { "inputs": { - "systems": "systems_8" + "systems": "systems_10" }, "locked": { "lastModified": 1731533236, @@ -676,17 +1269,78 @@ "type": "github" } }, + "walker": { + "inputs": { + "elephant": "elephant", + "nixpkgs": "nixpkgs_9", + "systems": "systems_11" + }, + "locked": { + "lastModified": 1771062828, + "narHash": "sha256-y1jBFFO0u+V21y3YldHZozrDwVJVrdC+o3c4M8/rasU=", + "owner": "abenz1267", + "repo": "walker", + "rev": "19b1104585305e0806b842af341630f72038a4b9", + "type": "github" + }, + "original": { + "owner": "abenz1267", + "repo": "walker", + "type": "github" + } + }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1761431178, + "narHash": "sha256-xzjC1CV3+wpUQKNF+GnadnkeGUCJX+vgaWIZsnz9tzI=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "4b8801228ff958d028f588f0c2b911dbf32297f9", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + }, "zen-browser": { "inputs": { "home-manager": "home-manager_2", - "nixpkgs": "nixpkgs_8" + "nixpkgs": "nixpkgs_10" }, "locked": { - "lastModified": 1771131295, - "narHash": "sha256-3Z7RKjuifcB6Hkjrk8gNOXAqEv5+ubc/J9lLoKD7pv4=", + "lastModified": 1771222275, + "narHash": "sha256-df+Un2QnDj95MQxmsnopCtSy/meWO2RDHuMGAqq3nlc=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "e983cc5e47483742b61e0c53cfe9a9314628086f", + "rev": "a20f5d0c6454b5b24a497afb280427c9af33a0be", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index e248533..392b598 100644 --- a/flake.nix +++ b/flake.nix @@ -34,6 +34,24 @@ rose-pine-hyprcursor.url = "github:ndom91/rose-pine-hyprcursor"; zen-browser.url = "github:0xc000022070/zen-browser-flake"; ethui.url = "github:ethui/ethui/nix"; + hyprland = { + type = "git"; + url = "https://github.com/hyprwm/Hyprland"; + submodules = true; + }; + hyprland-plugins = { + url = "github:hyprwm/hyprland-plugins"; + inputs.hyprland.follows = "hyprland"; + }; + hyprspace = { + url = "github:KZDKM/Hyprspace"; + inputs.hyprland.follows = "hyprland"; + }; + quickshell = { + url = "git+https://git.outfoxxed.me/outfoxxed/quickshell"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + walker.url = "github:abenz1267/walker"; claude-code.url = "github:sadjow/claude-code-nix"; }; diff --git a/home/arrakis/default.nix b/home/arrakis/default.nix index da3655a..fdc8474 100644 --- a/home/arrakis/default.nix +++ b/home/arrakis/default.nix @@ -14,19 +14,23 @@ ../common/programs/desktop ../common/programs/zen-browser.nix ../common/programs/hyprland - ../common/programs/i3.nix ../common/programs/kitty ../common/programs/syncthing.nix ../common/programs/unity.nix ../common/programs/ethui.nix ../common/programs/gpg.nix ../common/features/xdg.nix + ../common/features/downloads-cleanup.nix ../common/programs/3d.nix ../common/features/bluetooth.nix ./monitors.nix ]; wayland.windowManager.hyprland.settings = { + exec-once = [ + "hyprctl setcursor Nordzy-cursors 32" + ]; + workspace = [ "1, monitor:DP-3" "2, monitor:eDP-1" @@ -42,14 +46,6 @@ ]; }; - programs.hyprpanel.settings.bar.layouts = { - "0" = { - right = [ - "battery" - ]; - }; - }; - home = { username = lib.mkDefault "naps62"; stateVersion = lib.mkDefault "24.05"; diff --git a/home/common/features/downloads-cleanup.nix b/home/common/features/downloads-cleanup.nix new file mode 100644 index 0000000..2e759d7 --- /dev/null +++ b/home/common/features/downloads-cleanup.nix @@ -0,0 +1,64 @@ +{ pkgs, config, lib, ... }: + +let + downloadsDir = "${config.home.homeDirectory}/downloads"; + # Age in days after which files should be deleted + maxAge = 30; +in +{ + systemd.user.services.downloads-cleanup = { + Unit = { + Description = "Clean old files from downloads subdirectories"; + }; + + Service = { + Type = "oneshot"; + ExecStart = "${pkgs.writeShellScript "downloads-cleanup" '' + set -euo pipefail + + echo "Starting downloads cleanup..." + echo "Cleaning files older than ${toString maxAge} days from ${downloadsDir}/*/ (including hidden files)" + + # Find and delete files older than maxAge days in subdirectories of downloads + # -mindepth 2 ensures we only look inside subdirectories, not in downloads/ itself + # -type f ensures we only delete files, not directories + # This includes hidden files and directories + if [ -d "${downloadsDir}" ]; then + ${pkgs.findutils}/bin/find "${downloadsDir}" \ + -mindepth 2 \ + -type f \ + -mtime +${toString maxAge} \ + -print \ + -delete 2>/dev/null || true + + # Also remove empty directories (including hidden ones) + ${pkgs.findutils}/bin/find "${downloadsDir}" \ + -mindepth 2 \ + -type d \ + -empty \ + -print \ + -delete 2>/dev/null || true + + echo "Cleanup completed successfully" + else + echo "Downloads directory does not exist, skipping cleanup" + fi + ''}"; + }; + }; + + systemd.user.timers.downloads-cleanup = { + Unit = { + Description = "Timer for downloads cleanup"; + }; + + Timer = { + OnCalendar = "daily"; + Persistent = true; + }; + + Install = { + WantedBy = [ "timers.target" ]; + }; + }; +} diff --git a/home/common/programs/desktop/darkman.nix b/home/common/programs/desktop/darkman.nix index 7cb7e39..1b8dd4e 100644 --- a/home/common/programs/desktop/darkman.nix +++ b/home/common/programs/desktop/darkman.nix @@ -13,6 +13,17 @@ ${pkgs.dconf}/bin/dconf write \ /org/gnome/desktop/interface/gtk-theme "'Orchis-Dark-Compact'" ''; + cursor-theme = '' + ${pkgs.dconf}/bin/dconf write \ + /org/gnome/desktop/interface/cursor-theme "'Nordzy-cursors'" + + # Set environment variables for current session + export HYPRCURSOR_THEME="Nordzy-cursors" + export XCURSOR_THEME="Nordzy-cursors" + + # Update Hyprland cursor theme + ${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-cursors 42 + ''; }; lightModeScripts = { gtk-theme = '' @@ -21,10 +32,23 @@ ${pkgs.dconf}/bin/dconf write \ /org/gnome/desktop/interface/gtk-theme "'Orchis-Compact'" ''; + cursor-theme = '' + ${pkgs.dconf}/bin/dconf write \ + /org/gnome/desktop/interface/cursor-theme "'Nordzy-white'" + + # Set environment variables for current session + export HYPRCURSOR_THEME="Nordzy-white" + export XCURSOR_THEME="Nordzy-white" + + # Update Hyprland cursor theme + ${pkgs.hyprland}/bin/hyprctl setcursor Nordzy-white 42 + ''; }; }; xdg.configFile."darkman/config.yaml".text = '' - usegeoclue: true + lat: 41.55 + lng: -8.42 + dbusserver: true ''; } diff --git a/home/common/programs/hyprland/cursor.nix b/home/common/programs/hyprland/cursor.nix index eb03648..edfa2c4 100644 --- a/home/common/programs/hyprland/cursor.nix +++ b/home/common/programs/hyprland/cursor.nix @@ -1,14 +1,16 @@ { pkgs, inputs, ... }: +let + nordzy-cursors = pkgs.callPackage ../../../../pkgs/nordzy-cursors/package.nix { }; +in { - home.packages = with pkgs; [ - rose-pine-cursor - inputs.rose-pine-hyprcursor.packages.${pkgs.stdenv.hostPlatform.system}.default + home.packages = [ + nordzy-cursors ]; home.sessionVariables = { - HYPRCURSOR_THEME = "BreezeX-RosePine-Linux"; + HYPRCURSOR_THEME = "Nordzy-cursors"; # Dark variant (default) HYPRCURSOR_SIZE = 32; - XCURSOR_THEME = "BreezeX-RosePine-Linux"; + XCURSOR_THEME = "Nordzy-cursors"; XCURSOR_SIZE = 32; }; diff --git a/home/common/programs/hyprland/default.nix b/home/common/programs/hyprland/default.nix index 76357b0..3762e40 100644 --- a/home/common/programs/hyprland/default.nix +++ b/home/common/programs/hyprland/default.nix @@ -1,12 +1,19 @@ -{ config, pkgs, ... }: +{ + config, + inputs, + pkgs, + ... +}: let rofiLaunchers = import ../../../pkgs/rofi-launchers/package.nix { }; in { imports = [ ./rofi.nix + ./walker.nix ./cursor.nix - ./hyprpanel.nix + ./waybar.nix + ./quickshell.nix ]; home.packages = with pkgs; [ @@ -25,7 +32,34 @@ in wayland.windowManager.hyprland = { enable = true; + package = null; + portalPackage = null; + plugins = [ + inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprexpo + inputs.hyprland-plugins.packages.${pkgs.stdenv.hostPlatform.system}.hyprfocus + # inputs.hyprspace.packages.${pkgs.stdenv.hostPlatform.system}.Hyprspace + ]; settings = { + plugin = { + hyprexpo = { + columns = 3; + gap_size = 5; + bg_col = "rgb(000000)"; + workspace_method = "center current"; + }; + hyprfocus = { + enabled = true; + mode = "flash"; + flash_opacity = 1.8; # Flash brighter instead of dimmer + }; + overview = { + autoDrag = true; + exitOnClick = true; + exitOnSwitch = true; + showNewWorkspace = false; + showEmptyWorkspace = false; + }; + }; input = { kb_options = "ctrl:nocaps"; repeat_delay = 150; @@ -71,34 +105,17 @@ in blur = { enabled = true; # new_optimizations = false; + popups = false; }; shadow = { enabled = false; }; }; + # keep default animations, but speed them all up animations = { - bezier = [ - "wind, 0.05, 0.9, 0.1, 1.0" - "winIn, 0.1, 1.0, 0.1, 1.0" - "winOut, 0.3, -0.3, 0, 1" - "liner, 1, 1, 1, 1" - "fadeIn, 0, 0, 0.98, 1" - ]; animation = [ - "windows, 1, 2, wind, popin 80%" - "windowsIn, 1, 2, fadeIn, popin 80%" - "windowsOut, 1, 5, winOut, popin 80%" - "windowsMove, 1, 5, wind, slide" - "border, 1, 1, liner" - "borderangle, 1, 30, liner, loop" - "fade, 1, 2, fadeIn" - "fadeIn, 1, 2, fadeIn" - "fadeOut, 1, 2, winOut" - "workspaces, 1, 2, wind" - "windowsMove, 0, 1, default, slide" - # "specialWorkspace, 0, 2, default, fade" - "specialWorkspace, 1, 2, fadeIn, fade" + "global, 1, 2, default" ]; }; @@ -111,7 +128,6 @@ in "exec-once" = [ "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" - "hyprpanel" "nm-applet" "hyprsunset" "nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended" @@ -165,14 +181,19 @@ in "$mod" = "SUPER"; bind = [ + "$mod, g, hyprexpo:expo, toggle" + # "$mod, tab, overview:toggle," + "$mod, b, exec, pkill waybar || waybar" "$mod, t, exec, kitty" "$mod, v, togglefloating" "$mod, q, killactive" "$mod, f, fullscreen, 0" "$mod SHIFT, f, fullscreen, 1" - # rofi - "$mod, space, exec, launcher_t2" + # walker app launcher + "$mod, space, exec, walker" + # rofi (old) + # "$mod, space, exec, launcher_t2" # nerd-dictation # "$mod, d, exec, nerd-dictation-toggle" diff --git a/home/common/programs/hyprland/quickshell.nix b/home/common/programs/hyprland/quickshell.nix new file mode 100644 index 0000000..52f3660 --- /dev/null +++ b/home/common/programs/hyprland/quickshell.nix @@ -0,0 +1,11 @@ +{ inputs, pkgs, ... }: +{ + home.packages = [ + inputs.quickshell.packages.${pkgs.stdenv.hostPlatform.system}.default + ]; + + xdg.configFile."quickshell" = { + source = ./quickshell; + recursive = true; + }; +} diff --git a/home/common/programs/hyprland/quickshell/Bar.qml b/home/common/programs/hyprland/quickshell/Bar.qml new file mode 100644 index 0000000..aa4de4a --- /dev/null +++ b/home/common/programs/hyprland/quickshell/Bar.qml @@ -0,0 +1,94 @@ +import Quickshell +import Quickshell.Hyprland +import QtQuick +import QtQuick.Layouts + +Scope { + id: root + property bool barVisible: false + + Variants { + model: Quickshell.screens + + Scope { + id: perScreen + required property var modelData + + // invisible trigger zone at the top edge + PanelWindow { + id: trigger + screen: perScreen.modelData + visible: !root.barVisible + + anchors { + top: true + left: true + right: true + } + + exclusionMode: ExclusionMode.Ignore + implicitHeight: 4 + color: "transparent" + + MouseArea { + anchors.fill: parent + hoverEnabled: true + onEntered: root.barVisible = true + } + } + + // the actual bar + PanelWindow { + id: bar + screen: perScreen.modelData + visible: root.barVisible + + anchors { + top: true + left: true + right: true + } + + exclusionMode: ExclusionMode.Ignore + implicitHeight: 32 + color: "#e611111b" + + MouseArea { + anchors.fill: parent + hoverEnabled: true + propagateComposedEvents: true + // keep bar visible while mouse is on it + onExited: hideTimer.restart() + } + + RowLayout { + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + spacing: 0 + + Workspaces { + Layout.alignment: Qt.AlignLeft + } + + Item { Layout.fillWidth: true } + + SysTray { + Layout.alignment: Qt.AlignRight + Layout.rightMargin: 16 + } + + ClockWidget { + Layout.alignment: Qt.AlignRight + } + } + } + + Timer { + id: hideTimer + interval: 500 + onTriggered: root.barVisible = false + } + } + } +} diff --git a/home/common/programs/hyprland/quickshell/ClockWidget.qml b/home/common/programs/hyprland/quickshell/ClockWidget.qml new file mode 100644 index 0000000..de8f078 --- /dev/null +++ b/home/common/programs/hyprland/quickshell/ClockWidget.qml @@ -0,0 +1,20 @@ +import QtQuick +import QtQuick.Layouts + +RowLayout { + spacing: 12 + + Text { + text: Time.date + font.family: "FiraCode Nerd Font" + font.pixelSize: 13 + color: "#6c7086" + } + + Text { + text: Time.clock + font.family: "FiraCode Nerd Font" + font.pixelSize: 14 + color: "#bac2de" + } +} diff --git a/home/common/programs/hyprland/quickshell/SysTray.qml b/home/common/programs/hyprland/quickshell/SysTray.qml new file mode 100644 index 0000000..6ae92cf --- /dev/null +++ b/home/common/programs/hyprland/quickshell/SysTray.qml @@ -0,0 +1,47 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import Quickshell +import Quickshell.Services.SystemTray + +RowLayout { + spacing: 6 + + Repeater { + model: SystemTray.items + + Image { + required property SystemTrayItem modelData + + Layout.preferredWidth: 18 + Layout.preferredHeight: 18 + source: modelData.icon + fillMode: Image.PreserveAspectFit + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.LeftButton | Qt.RightButton + onClicked: (mouse) => { + if (mouse.button === Qt.RightButton || modelData.onlyMenu) { + modelData.display(bar, parent.x, bar.height) + } else { + modelData.activate() + } + } + } + + ToolTip { + id: tooltip + visible: hoverArea.containsMouse + text: modelData.tooltipTitle || modelData.title || "" + } + + MouseArea { + id: hoverArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + } + } + } +} diff --git a/home/common/programs/hyprland/quickshell/Time.qml b/home/common/programs/hyprland/quickshell/Time.qml new file mode 100644 index 0000000..7836795 --- /dev/null +++ b/home/common/programs/hyprland/quickshell/Time.qml @@ -0,0 +1,15 @@ +pragma Singleton + +import Quickshell +import QtQuick + +Singleton { + id: root + readonly property string clock: Qt.formatDateTime(sysClock.date, "hh:mm") + readonly property string date: Qt.formatDateTime(sysClock.date, "ddd MMM d") + + SystemClock { + id: sysClock + precision: SystemClock.Minutes + } +} diff --git a/home/common/programs/hyprland/quickshell/Workspaces.qml b/home/common/programs/hyprland/quickshell/Workspaces.qml new file mode 100644 index 0000000..330a394 --- /dev/null +++ b/home/common/programs/hyprland/quickshell/Workspaces.qml @@ -0,0 +1,41 @@ +import QtQuick +import QtQuick.Layouts +import Quickshell.Hyprland + +RowLayout { + spacing: 4 + + Repeater { + model: [1, 2, 3, 4, 5, 6] + + Rectangle { + required property int modelData + property bool active: Hyprland.focusedMonitor?.activeWorkspace?.id === modelData + property bool occupied: { + for (let i = 0; i < Hyprland.workspaces.values.length; i++) { + let ws = Hyprland.workspaces.values[i]; + if (ws.id === modelData && ws.windows > 0) return true; + } + return false; + } + + Layout.preferredWidth: 24 + Layout.preferredHeight: 24 + radius: 4 + color: active ? "#b4befe" : "transparent" + + Text { + anchors.centerIn: parent + text: modelData + font.family: "FiraCode Nerd Font" + font.pixelSize: 13 + color: active ? "#11111b" : occupied ? "#bac2de" : "#6c7086" + } + + MouseArea { + anchors.fill: parent + onClicked: Hyprland.dispatch("workspace " + modelData) + } + } + } +} diff --git a/home/common/programs/hyprland/quickshell/shell.qml b/home/common/programs/hyprland/quickshell/shell.qml new file mode 100644 index 0000000..9d093ad --- /dev/null +++ b/home/common/programs/hyprland/quickshell/shell.qml @@ -0,0 +1,5 @@ +import Quickshell + +Scope { + Bar {} +} diff --git a/home/common/programs/hyprland/walker.nix b/home/common/programs/hyprland/walker.nix new file mode 100644 index 0000000..c40e8e9 --- /dev/null +++ b/home/common/programs/hyprland/walker.nix @@ -0,0 +1,13 @@ +{ inputs, pkgs, ... }: +{ + imports = [ inputs.walker.homeManagerModules.default ]; + + programs.walker = { + enable = true; + runAsService = true; + + # Using default theme - clean dark theme with good defaults + # You can customize later by copying from: + # https://github.com/abenz1267/walker/tree/master/resources/themes/default + }; +} diff --git a/home/common/programs/hyprland/waybar.nix b/home/common/programs/hyprland/waybar.nix new file mode 100644 index 0000000..abfca0c --- /dev/null +++ b/home/common/programs/hyprland/waybar.nix @@ -0,0 +1,173 @@ +{ pkgs, ... }: +{ + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 32; + exclusive = false; + + modules-left = [ "hyprland/workspaces" ]; + modules-center = [ "hyprland/window" ]; + modules-right = [ + "tray" + "bluetooth" + "network" + "pulseaudio" + "battery" + "clock" + ]; + + "hyprland/workspaces" = { + format = "{icon}"; + format-icons = { + "1" = "1"; + "2" = "2"; + "3" = "3"; + "4" = "4"; + "5" = "5"; + "6" = "6"; + }; + persistent-workspaces = { + "*" = [ 1 2 3 4 5 6 ]; + }; + }; + + "hyprland/window" = { + max-length = 50; + }; + + tray = { + icon-size = 16; + spacing = 8; + }; + + bluetooth = { + format = "󰂯"; + format-disabled = "󰂲"; + format-connected = "󰂱"; + tooltip-format = "{controller_alias}\t{controller_address}"; + tooltip-format-connected = "{controller_alias}\t{controller_address}\n\n{device_enumerate}"; + tooltip-format-enumerate-connected = "{device_alias}\t{device_address}"; + on-click = "blueman-manager"; + }; + + network = { + format-wifi = "󰤨"; + format-ethernet = "󰈀"; + format-disconnected = "󰤭"; + tooltip-format-wifi = "{essid} ({signalStrength}%)"; + tooltip-format-ethernet = "{ifname}: {ipaddr}/{cidr}"; + tooltip-format-disconnected = "Disconnected"; + }; + + pulseaudio = { + format = "{icon}"; + format-muted = "󰝟"; + format-icons = { + default = [ "󰕿" "󰖀" "󰕾" ]; + }; + tooltip-format = "{volume}%"; + on-click = "pavucontrol"; + on-click-right = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + scroll-step = 5; + }; + + battery = { + format = "{icon} {capacity}%"; + format-charging = "󰂄 {capacity}%"; + format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + states = { + warning = 20; + critical = 10; + }; + }; + + clock = { + format = "{:%H:%M}"; + tooltip-format = "{:%A, %B %d, %Y}"; + }; + }; + }; + + style = '' + @define-color foreground #bac2de; + @define-color background #11111b; + @define-color active #b4befe; + @define-color warning #f9e2af; + @define-color critical #f38ba8; + @define-color muted #6c7086; + + * { + background-color: transparent; + color: @foreground; + border: none; + border-radius: 0; + min-height: 0; + font-family: FiraCode Nerd Font; + font-size: 15px; + } + + window#waybar { + background-color: @background; + } + + .modules-left { + margin-left: 10px; + } + + .modules-right { + margin-right: 10px; + } + + #workspaces button { + padding: 0 6px; + margin: 0 2px; + color: @muted; + } + + #workspaces button.active { + color: @active; + } + + #workspaces button.urgent { + color: @critical; + } + + #window { + color: @muted; + font-size: 14px; + } + + #tray, + #bluetooth, + #network, + #pulseaudio, + #battery, + #clock { + padding: 0 10px; + color: @foreground; + } + + #battery.warning { + color: @warning; + } + + #battery.critical { + color: @critical; + } + + #pulseaudio.muted { + color: @muted; + } + + tooltip { + background-color: @background; + border: 1px solid @muted; + border-radius: 4px; + } + ''; + }; +} diff --git a/home/common/programs/i3.nix b/home/common/programs/i3.nix deleted file mode 100644 index 23d366d..0000000 --- a/home/common/programs/i3.nix +++ /dev/null @@ -1,88 +0,0 @@ -{ - lib, - config, - pkgs, - ... -}: -{ - xsession.windowManager.i3 = { - enable = true; - package = pkgs.i3; - config = { - modifier = "Mod4"; - terminal = "${pkgs.kitty}/bin/kitty"; - gaps = { - inner = 10; - outer = 0; - }; - keybindings = - let - modifier = config.xsession.windowManager.i3.config.modifier; - in - lib.mkOptionDefault { - "${modifier}+h" = "focus left"; - "${modifier}+j" = "focus down"; - "${modifier}+k" = "focus up"; - "${modifier}+l" = "focus right"; - - "XF86AudioRaiseVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"; - "XF86AudioLowerVolume" = "exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"; - "XF86AudioMute" = "exec pactl set-sink-mute @DEFAULT_SINK@ toggle"; - "XF86AudioMicMute" = "exec volumectl -m toggle-mute"; - "XF86AudioNext" = "exec playerctl next"; - "XF86AudioPrev" = "exec playerctl previous"; - "XF86AudioPlay" = "exec playerctl play-pause"; - - "XF86MonBrightnessUp" = "exec brightnessctl set 5%+"; - "XF86MonBrightnessDown" = "exec brightnessctl set 5%-"; - - "Print" = "exec flameshot gui"; - - "${modifier}+space" = "exec launcher_t2"; - }; - bars = [ - { - position = "top"; - statusCommand = "i3status-rs ~/.config/i3status-rust/config-default.toml"; - } - ]; - }; - extraConfig = '' - smart_gaps on - hide_edge_borders smart_no_gaps - - for_window [class="kitty"] border none - for_window [class="kitty"] gaps inner current set 0 - for_window [class="kitty"] gaps outer current set 0 - - for_window [class="^zen"] border none - for_window [class="^zen"] gaps inner current set 0 - for_window [class="^zen"] gaps outer current set 0 - ''; - }; - - programs = { - i3status-rust = { - enable = true; - }; - }; - - # services.picom = { - # enable = true; - # backend = "glx"; - # vSync = true; - # }; - - services.flameshot = { - enable = true; - - settings.General = { - drawFontSize = 10; - }; - }; - - xdg.portal = { - enable = true; - xdgOpenUsePortal = true; - }; -} diff --git a/home/desktop/default.nix b/home/desktop/default.nix index d112b36..c4050c6 100644 --- a/home/desktop/default.nix +++ b/home/desktop/default.nix @@ -14,7 +14,6 @@ ../common/programs/desktop ../common/programs/zen-browser.nix ../common/programs/hyprland - ../common/programs/i3.nix ../common/programs/kitty ../common/programs/syncthing.nix ../common/programs/unity.nix @@ -23,6 +22,7 @@ ../common/programs/3d.nix ../common/programs/nerd-dictation.nix ../common/features/xdg.nix + ../common/features/downloads-cleanup.nix ../common/features/bluetooth.nix ./monitors.nix ]; @@ -31,11 +31,24 @@ LIBVA_DRIVER_NAME = "nvidia"; GDM_BACKEND = "nvidia-drm"; __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + # Larger cursor size for desktop (4K monitors) + XCURSOR_SIZE = lib.mkForce 42; + HYPRCURSOR_SIZE = lib.mkForce 42; }; wayland.windowManager.hyprland.settings = { env = [ "WEBKIT_DISABLE_DMABUF_RENDERER, 1" + "XCURSOR_SIZE, 42" + "HYPRCURSOR_SIZE, 42" + ]; + + cursor = { + no_hardware_cursors = true; # For NVIDIA + }; + + exec-once = [ + "hyprctl setcursor Nordzy-cursors 42" ]; windowrule = [ diff --git a/home/desktop/monitors.nix b/home/desktop/monitors.nix index e5958ba..dede8ff 100644 --- a/home/desktop/monitors.nix +++ b/home/desktop/monitors.nix @@ -22,53 +22,22 @@ in { wayland.windowManager.hyprland.settings = { monitor = [ - # monitor, res, position, scale, transform, rotation + # List HDMI-A-1 first so it becomes the primary monitor (ID 0) "HDMI-A-1, 3840x2160, 0x2160, 1" - "DP-1, 3840x2160, 0x0, 1" - # 300 instead of 0 is so that 'move left' actually focuses the bottom one instead of the top one - # for some reason, that's the minimum value for which this works + # Then the other monitors "DP-2, 3840x2160, 3840x180, 1, transform, 1" + "DP-1, 3840x2160, 0x0, 1" ]; workspace = [ - "1, monitor=DP-2" - "2, monitor=DP-1" - "3, monitor=DP-2" - "4, monitor=HDMI-A-1" - "5, monitor=HDMI-A-1" + "1, monitor:HDMI-A-1, default:true, persistent:true" # bottom-left (primary) + "2, monitor:DP-2, persistent:true" # right (vertical) + "3, monitor:DP-1, persistent:true" # top-left + "4, monitor:HDMI-A-1" # bottom-left + "5, monitor:DP-2" # right (vertical) + "6, monitor:DP-1" # top-left ]; }; - xsession.windowManager.i3 = { - extraConfig = lib.mkAfter '' - workspace 1 output HDMI-0 - workspace 2 output DP-2 - workspace 3 output DP-0 - - for_window [title="^ethui-test - main$"] workspace 2 - for_window [title="^ethui-test - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500 - for_window [title="^ethui-test - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse - no_focus [title="^ethui-test - main$"] - no_focus [title="^ethui-test - dialog.*"] - - for_window [title="^ethui-dev - main$"] workspace 2 - for_window [title="^ethui-dev - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500 - for_window [title="^ethui-dev - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse - no_focus [title="^ethui-dev - main$"] - no_focus [title="^ethui-dev - dialog.*"] - - for_window [title="^ethui - main$"] workspace 2 - for_window [title="^ethui - main$"] border normal 2, floating enable, resize set 1280 1200, move position 4720 500 - for_window [title="^ethui - dialog.*"] border normal 2, floating enable, resize set 800 800, move position mouse - no_focus [title="^ethui - main$"] - no_focus [title="^ethui - dialog.*"] - - # for_window [class="^Ethui$"] border normal 2, floating enable, resize set 1280 1200, move position mouse - - for_window [title="^egui-test$"] floating enable, border none, resize set 800 800, move position 2720 500 - no_focus [title="^egui-test$"] - ''; - }; - services.hyprpaper.settings.preload = [ (builtins.toString wallpaper1) (builtins.toString wallpaper2) diff --git a/hooks b/hooks new file mode 100644 index 0000000..e69de29 diff --git a/hosts/common/features/display/default.nix b/hosts/common/features/display/default.nix index 7eb2089..d05a9b7 100644 --- a/hosts/common/features/display/default.nix +++ b/hosts/common/features/display/default.nix @@ -2,7 +2,6 @@ { imports = [ ./wayland.nix - ./x11.nix - ./gdm.nix + ./sddm.nix ]; } diff --git a/hosts/common/features/display/sddm.nix b/hosts/common/features/display/sddm.nix new file mode 100644 index 0000000..39517df --- /dev/null +++ b/hosts/common/features/display/sddm.nix @@ -0,0 +1,31 @@ +{ inputs, pkgs, ... }: +let + sddm-astronaut-theme = pkgs.callPackage ../../../../pkgs/sddm-astronaut-theme/package.nix { }; +in +{ + services.xserver = { + enable = true; + displayManager = { + startx.enable = true; + }; + autoRepeatDelay = 250; + autoRepeatInterval = 30; + }; + + services.displayManager.sddm = { + enable = true; + wayland.enable = true; + theme = "sddm-astronaut-theme"; + package = pkgs.kdePackages.sddm; + extraPackages = with pkgs.kdePackages; [ + qtmultimedia + qtsvg + qtvirtualkeyboard + qt5compat + ]; + }; + + environment.systemPackages = with pkgs; [ + sddm-astronaut-theme + ]; +} diff --git a/hosts/common/features/display/wayland.nix b/hosts/common/features/display/wayland.nix index 1622215..e4fa0d0 100644 --- a/hosts/common/features/display/wayland.nix +++ b/hosts/common/features/display/wayland.nix @@ -2,24 +2,26 @@ { environment.systemPackages = with pkgs; [ wl-clipboard - hyprland ]; - services.displayManager.sessionPackages = with pkgs; [ - hyprland - ]; + programs.hyprland = { + enable = true; + package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; + portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + }; - # thumbnail support for images - services.tumbler.enable = true; + # GTK/GNOME services still useful on Wayland + programs.dconf.enable = true; - environment.etc."xdg/wayland-sessions/hyprland.desktop".text = '' - [Desktop Entry] - Name=Hyprland - Comment=Hyprland Wayland Compositor - Exec=Hyprland - Type=Application - DesktopNames=Hyprland - ''; + services = { + # thumbnail support for images + tumbler.enable = true; + + gnome = { + glib-networking.enable = true; + gnome-keyring.enable = true; + }; + }; nix.settings = { substituters = [ "https://hyprland.cachix.org" ]; diff --git a/hosts/common/features/display/x11.nix b/hosts/common/features/display/x11.nix deleted file mode 100644 index 3a00971..0000000 --- a/hosts/common/features/display/x11.nix +++ /dev/null @@ -1,54 +0,0 @@ -{ inputs, pkgs, ... }: -{ - - services = { - desktopManager = { - gnome.enable = true; - }; - xserver = { - windowManager.i3.enable = true; - xkb.options = "ctrl:nocaps"; - }; - sysprof.enable = true; - gnome = { - glib-networking.enable = true; - gnome-keyring.enable = true; - gnome-online-accounts.enable = true; - }; - }; - - programs = { - i3lock.enable = true; - dconf.enable = true; - }; - - environment.systemPackages = with pkgs; [ - xclip - ]; - - environment.gnome.excludePackages = - (with pkgs; [ - gnome-photos - gnome-tour - gnome-console - gnome-text-editor - gedit - ]) - ++ (with pkgs; [ - cheese # webcam tool - gnome-music - gnome-terminal - epiphany # web browser - geary # email reader - evince # document viewer - totem # video player - tali # poker game - iagno # go game - hitori # sudoku game - atomix # puzzle game - gnome-contacts - gnome-initial-setup - gnome-shell-extensions - ]); - -} diff --git a/hosts/common/global/default.nix b/hosts/common/global/default.nix index 5bf2be8..de0c2a0 100644 --- a/hosts/common/global/default.nix +++ b/hosts/common/global/default.nix @@ -39,5 +39,4 @@ }; services.dbus.packages = with pkgs; [ gcr ]; - services.geoclue2.enable = true; } diff --git a/hosts/desktop/default.nix b/hosts/desktop/default.nix index b1f0a69..554d944 100644 --- a/hosts/desktop/default.nix +++ b/hosts/desktop/default.nix @@ -44,7 +44,11 @@ TOP='DP-0' RIGHT='DP-2' - ${pkgs.xorg.xrandr}/bin/xrandr --output $BOTTOM --primary --mode 3840x2160 --pos 0x0 --rotate normal --output $TOP --mode 3840x2160 --above $BOTTOM --rotate normal --output $RIGHT --mode 3840x2160 --pos 3840x-1680 --rotate left + # Match Hyprland layout: TOP at 0x0, BOTTOM at 0x2160, RIGHT at 3840x180 + ${pkgs.xorg.xrandr}/bin/xrandr \ + --output $TOP --mode 3840x2160 --pos 0x0 --rotate normal \ + --output $BOTTOM --primary --mode 3840x2160 --pos 0x2160 --rotate normal \ + --output $RIGHT --mode 3840x2160 --pos 3840x180 --rotate left ${pkgs.xorg.xrandr}/bin/xrandr --dpi 160 ''; diff --git a/objects b/objects new file mode 100644 index 0000000..e69de29 diff --git a/pkgs/nordzy-cursors/package.nix b/pkgs/nordzy-cursors/package.nix new file mode 100644 index 0000000..1457016 --- /dev/null +++ b/pkgs/nordzy-cursors/package.nix @@ -0,0 +1,35 @@ +{ lib, stdenvNoCC, fetchFromGitHub }: + +stdenvNoCC.mkDerivation rec { + pname = "nordzy-cursors"; + version = "0.6.0"; + + src = fetchFromGitHub { + owner = "guillaumeboehm"; + repo = "Nordzy-cursors"; + rev = "v${version}"; + sha256 = "sha256-q9PEEyxejRQ8UCwbqsfOCL7M70pLCOLyCx8gEFmZkWA="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/icons + + # Install all Nordzy cursor themes + for theme in Nordzy-cursors*; do + if [ -d "$theme" ]; then + cp -r "$theme" $out/share/icons/ + fi + done + + runHook postInstall + ''; + + meta = with lib; { + description = "Cursor theme using the Nord color palette"; + homepage = "https://github.com/guillaumeboehm/Nordzy-cursors"; + license = licenses.gpl3; + platforms = platforms.linux; + }; +} diff --git a/pkgs/sddm-astronaut-theme/package.nix b/pkgs/sddm-astronaut-theme/package.nix new file mode 100644 index 0000000..fce9e84 --- /dev/null +++ b/pkgs/sddm-astronaut-theme/package.nix @@ -0,0 +1,29 @@ +{ pkgs, ... }: + +pkgs.stdenv.mkDerivation { + pname = "sddm-astronaut-theme"; + version = "1.0-pixel-sakura-v2"; + + src = pkgs.fetchFromGitHub { + owner = "Keyitdev"; + repo = "sddm-astronaut-theme"; + rev = "master"; + sha256 = "sha256-+94WVxOWfVhIEiVNWwnNBRmN+d1kbZCIF10Gjorea9M="; + }; + + installPhase = '' + mkdir -p $out/share/sddm/themes/sddm-astronaut-theme + cp -r * $out/share/sddm/themes/sddm-astronaut-theme/ + + # Override the theme variant to pixel_sakura + sed -i 's|ConfigFile=Themes/astronaut.conf|ConfigFile=Themes/pixel_sakura.conf|' \ + $out/share/sddm/themes/sddm-astronaut-theme/metadata.desktop + ''; + + meta = with pkgs.lib; { + description = "Modern astronaut-themed SDDM login theme"; + homepage = "https://github.com/Keyitdev/sddm-astronaut-theme"; + license = licenses.gpl3; + platforms = platforms.linux; + }; +} diff --git a/refs b/refs new file mode 100644 index 0000000..e69de29