From e8086e8528738558d74163bbfdc21482c05d327c Mon Sep 17 00:00:00 2001 From: Miguel Palhas Date: Mon, 16 Feb 2026 17:33:40 +0000 Subject: [PATCH] Several hyprland updates: plugins, new cursor, light/dark themes, new app launcher, ... --- .bash_profile | 0 .bashrc | 0 .claude/agents | 0 .claude/commands | 0 .claude/settings.json | 0 .claude/settings.local.json | 11 +- .claude/skills | 0 .gitconfig | 0 .gitmodules | 0 .idea | 0 .mcp.json | 0 .profile | 0 .ripgreprc | 0 .vscode | 0 .zprofile | 0 .zshrc | 0 HEAD | 0 config | 0 flake.lock | 750 ++++++++++++++++-- flake.nix | 18 + home/arrakis/default.nix | 14 +- home/common/features/downloads-cleanup.nix | 64 ++ home/common/programs/desktop/darkman.nix | 26 +- home/common/programs/hyprland/cursor.nix | 12 +- home/common/programs/hyprland/default.nix | 71 +- home/common/programs/hyprland/quickshell.nix | 11 + .../programs/hyprland/quickshell/Bar.qml | 94 +++ .../hyprland/quickshell/ClockWidget.qml | 20 + .../programs/hyprland/quickshell/SysTray.qml | 47 ++ .../programs/hyprland/quickshell/Time.qml | 15 + .../hyprland/quickshell/Workspaces.qml | 41 + .../programs/hyprland/quickshell/shell.qml | 5 + home/common/programs/hyprland/walker.nix | 13 + home/common/programs/hyprland/waybar.nix | 173 ++++ home/common/programs/i3.nix | 88 -- home/desktop/default.nix | 15 +- home/desktop/monitors.nix | 49 +- hooks | 0 hosts/common/features/display/default.nix | 3 +- hosts/common/features/display/sddm.nix | 31 + hosts/common/features/display/wayland.nix | 30 +- hosts/common/features/display/x11.nix | 54 -- hosts/common/global/default.nix | 1 - hosts/desktop/default.nix | 6 +- objects | 0 pkgs/nordzy-cursors/package.nix | 35 + pkgs/sddm-astronaut-theme/package.nix | 29 + refs | 0 48 files changed, 1436 insertions(+), 290 deletions(-) create mode 100644 .bash_profile create mode 100644 .bashrc create mode 100644 .claude/agents create mode 100644 .claude/commands create mode 100644 .claude/settings.json create mode 100644 .claude/skills create mode 100644 .gitconfig create mode 100644 .gitmodules create mode 100644 .idea create mode 100644 .mcp.json create mode 100644 .profile create mode 100644 .ripgreprc create mode 100644 .vscode create mode 100644 .zprofile create mode 100644 .zshrc create mode 100644 HEAD create mode 100644 config create mode 100644 home/common/features/downloads-cleanup.nix create mode 100644 home/common/programs/hyprland/quickshell.nix create mode 100644 home/common/programs/hyprland/quickshell/Bar.qml create mode 100644 home/common/programs/hyprland/quickshell/ClockWidget.qml create mode 100644 home/common/programs/hyprland/quickshell/SysTray.qml create mode 100644 home/common/programs/hyprland/quickshell/Time.qml create mode 100644 home/common/programs/hyprland/quickshell/Workspaces.qml create mode 100644 home/common/programs/hyprland/quickshell/shell.qml create mode 100644 home/common/programs/hyprland/walker.nix create mode 100644 home/common/programs/hyprland/waybar.nix delete mode 100644 home/common/programs/i3.nix create mode 100644 hooks create mode 100644 hosts/common/features/display/sddm.nix delete mode 100644 hosts/common/features/display/x11.nix create mode 100644 objects create mode 100644 pkgs/nordzy-cursors/package.nix create mode 100644 pkgs/sddm-astronaut-theme/package.nix create mode 100644 refs 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