diff --git a/.github/workflows/build-nix.yml b/.github/workflows/build-nix.yml new file mode 100644 index 0000000..e60310d --- /dev/null +++ b/.github/workflows/build-nix.yml @@ -0,0 +1,42 @@ +name: Build system configurations + +on: + pull_request: + +jobs: + build-x86_64-demeter: + runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write + steps: + - name: Free Disk Space (Ubuntu) + uses: Jayllyz/free-disk-space@perf/use-rmz + - uses: actions/checkout@v4 + - name: Check Nix flake Nixpkgs inputs + uses: DeterminateSystems/flake-checker-action@main + - uses: DeterminateSystems/nix-installer-action@main + with: + github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }} + - name: Build demeter + run: | + # nix flake check --all-systems + nix build .#nixosConfigurations.demeter.config.system.build.toplevel + build-aarch64-callisto: + runs-on: ubuntu-24.04-arm + permissions: + contents: read + id-token: write + steps: + - name: Free Disk Space (Ubuntu) + uses: Jayllyz/free-disk-space@perf/use-rmz + - uses: actions/checkout@v4 + - name: Check Nix flake Nixpkgs inputs + uses: DeterminateSystems/flake-checker-action@main + - uses: DeterminateSystems/nix-installer-action@main + with: + github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }} + - name: Build callisto + run: | + # nix flake check --all-systems + nix build .#nixosConfigurations.callisto.config.system.build.toplevel diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml new file mode 100644 index 0000000..f57e1cd --- /dev/null +++ b/.github/workflows/lock.yml @@ -0,0 +1,24 @@ +name: update-flake-lock +on: + workflow_dispatch: # allows manual triggering + schedule: + # Runs weekly at 00:00 UTC on Sunday + - cron: "0 0 * * 0" +jobs: + lockfile: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Install Nix + uses: DeterminateSystems/nix-installer-action@main + with: + github-token: ${{ secrets.GH_TOKEN_FOR_UPDATES }} + - name: Update flake.lock + uses: DeterminateSystems/update-flake-lock@main + with: + token: ${{ secrets.GH_TOKEN_FOR_UPDATES }} + pr-title: "deps(flake.lock): update" + pr-labels: | + dependencies,auto-merge + pr-assignees: youwen5 diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml new file mode 100644 index 0000000..70793b9 --- /dev/null +++ b/.github/workflows/merge.yml @@ -0,0 +1,16 @@ +name: auto-merge-labeled +on: + pull_request: +jobs: + auto-merge-labeled: + runs-on: ubuntu-latest + steps: + - id: auto-merge-labeled + name: Auto merge labeled + uses: isolomak/auto-merge-labeled@v1.0.1 + with: + label: 'lock' + commit-title: 'build(lock): update' + merge_method: 'squash' + env: + GITHUB_TOKEN: ${{ secrets.TOKEN }} diff --git a/README.md b/README.md index 791d9bd..0b8cf8b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ # KaitoianOS -> Fully customizable container-based operating system based on ```NixOS``` running SwayDE. +> Fully customizable container-based operating system based on ```NixOS``` running Hyprland && Hyprscroller. ## What even is this Config? So I believe I have no life, so I migrated from a super unstable and limited OS (DOS) to FreeBSD, however FreeBSD had limited packages being maintained on **Fresh Ports** so I figured might as well become a Linux user. After distro hopping for 3 months I was introduced to NixOS by [Youwen](https://youwen.dev) claiming that it would solve my problems of having to configure everything on seperate directories, common on most distros such as Arch or Debian. -## Why Sway and Wayland -Wayland provides a more stable graphical enviornment due to the simplicity of the code and it's security; moreover, it peforms significantly better on intergrated and discrete graphics cards for most of my systems. Why Sway and not Hyprland? Sway is a simple port of the popular x11 DE known as i3. Hyprland has too much eyecandy for a DE, too much bells and whistles such as dynamic colors and rounded edges. Also removing eyecandy on my config makes my input smoother and crispier. + + +## Why switch to Hyprland +Although Sway is a reliable and well developed window manager, it doesn't offer the same versatility as Hyprland in Wayland. Hyprland, although has too much eyecandy, it does offer a more polished and complete operating system especially to display beautiful color scheme. I adopted youwen's Hyprland configuration because it is preconfigured and it has all that I need in terms of productivity in this operating system. + ## What Basic Utilites do you have on here? - Firefox Developer Edition - Spotify (Spicetify) @@ -27,7 +30,7 @@ ROG (ASUS) Flow X13 2022 > 16 GB LPDDR4 -> 1TB Crucial (Allocated 128 for NixOS) +> 256 GB Kioxia ## How to Install or Clone @@ -52,6 +55,6 @@ cp /etc/nixos/hardware-configuration.nix ~/KaitoianOS/hosts/shiroko/hardware-con 5. Recompile your os by ```sh -sudo nixos-rebuild switch --flake .\#shiroko #or kuroko +sudo nixos-rebuild switch --flake .#shiroko #or kuroko ``` 6. Enjoy! diff --git a/flake.lock b/flake.lock index d96e054..8522081 100644 --- a/flake.lock +++ b/flake.lock @@ -1,32 +1,15 @@ { "nodes": { - "aq": { - "flake": false, - "locked": { - "lastModified": 1736050555, - "narHash": "sha256-TUoKhJ2QMK2AYTRvBCRpYFmaSihiF/OgB+HDZjamZtI=", - "owner": "quantum9innovation", - "repo": "aquamarine", - "rev": "546ce7963d18cbd30b32bf8d464f9ab3f6d54f74", - "type": "github" - }, - "original": { - "owner": "quantum9innovation", - "ref": "patch-125", - "repo": "aquamarine", - "type": "github" - } - }, "base16": { "inputs": { "fromYaml": "fromYaml" }, "locked": { - "lastModified": 1732200724, - "narHash": "sha256-+R1BH5wHhfnycySb7Sy5KbYEaTJZWm1h+LW1OtyhiTs=", + "lastModified": 1746562888, + "narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=", "owner": "SenchoPens", "repo": "base16.nix", - "rev": "153d52373b0fb2d343592871009a286ec8837aec", + "rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89", "type": "github" }, "original": { @@ -54,11 +37,11 @@ "base16-helix": { "flake": false, "locked": { - "lastModified": 1736852337, - "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", + "lastModified": 1748408240, + "narHash": "sha256-9M2b1rMyMzJK0eusea0x3lyh3mu5nMeEDSc4RZkGm+g=", "owner": "tinted-theming", "repo": "base16-helix", - "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", + "rev": "6c711ab1a9db6f51e2f6887cc3345530b33e152e", "type": "github" }, "original": { @@ -70,44 +53,60 @@ "base16-vim": { "flake": false, "locked": { - "lastModified": 1735953590, - "narHash": "sha256-YbQwaApLFJobn/0lbpMKcJ8N5axKlW2QIGkDS5+xoSU=", + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", "owner": "tinted-theming", "repo": "base16-vim", - "rev": "c2a1232aa2c0ed27dcbf005779bcfe0e0ab5e85d", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" }, "original": { "owner": "tinted-theming", "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" } }, "cpu-microcodes": { "flake": false, "locked": { - "lastModified": 1737223256, - "narHash": "sha256-aETUoryCkJSRWlxbgL8im40+2FfOm0u4X9aP5aZueME=", + "lastModified": 1747081695, + "narHash": "sha256-nnim3432n3+iwD2alY1cigQE7GKnI8BkyZDJTzood+E=", "owner": "platomav", "repo": "CPUMicrocodes", - "rev": "984b766433e99c7e945b5cc17519bb088084b3fd", + "rev": "2bcc2d8cb648c3397ea7381ca6887a9e3fdd6164", "type": "github" }, "original": { "owner": "platomav", "repo": "CPUMicrocodes", - "rev": "984b766433e99c7e945b5cc17519bb088084b3fd", + "rev": "2bcc2d8cb648c3397ea7381ca6887a9e3fdd6164", + "type": "github" + } + }, + "crane": { + "locked": { + "lastModified": 1731098351, + "narHash": "sha256-HQkYvKvaLQqNa10KEFGgWHfMAbWBfFp+4cAgkut+NNE=", + "owner": "ipetkov", + "repo": "crane", + "rev": "ef80ead953c1b28316cc3f8613904edc2eb90c28", + "type": "github" + }, + "original": { + "owner": "ipetkov", + "repo": "crane", "type": "github" } }, "firefox-gnome-theme": { "flake": false, "locked": { - "lastModified": 1736899990, - "narHash": "sha256-S79Hqn2EtSxU4kp99t8tRschSifWD4p/51++0xNWUxw=", + "lastModified": 1748383148, + "narHash": "sha256-pGvD/RGuuPf/4oogsfeRaeMm6ipUIznI2QSILKjKzeA=", "owner": "rafaelmardojai", "repo": "firefox-gnome-theme", - "rev": "91ca1f82d717b02ceb03a3f423cbe8082ebbb26d", + "rev": "4eb2714fbed2b80e234312611a947d6cb7d70caf", "type": "github" }, "original": { @@ -119,11 +118,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -133,13 +132,12 @@ } }, "flake-compat_2": { - "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -148,12 +146,51 @@ "type": "github" } }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "lanzaboote", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1730504689, + "narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "506278e768c2a08bec68eb62932193e341f55c90", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1743550720, + "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { - "systems": [ - "stylix", - "systems" - ] + "systems": "systems" }, "locked": { "lastModified": 1731533236, @@ -191,18 +228,18 @@ "stylix", "flake-compat" ], - "gitignore": "gitignore", + "gitignore": "gitignore_2", "nixpkgs": [ "stylix", "nixpkgs" ] }, "locked": { - "lastModified": 1735882644, - "narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=", + "lastModified": 1747372754, + "narHash": "sha256-2Y53NGIX2vxfie1rOW0Qb86vjRZ7ngizoo+bnXU9D9k=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "a5a961387e75ae44cc20f0a57ae463da5e959656", + "rev": "80479b6ec16fefd9c1db3ea13aeb038c60530f46", "type": "github" }, "original": { @@ -212,6 +249,28 @@ } }, "gitignore": { + "inputs": { + "nixpkgs": [ + "lanzaboote", + "pre-commit-hooks-nix", + "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" + } + }, + "gitignore_2": { "inputs": { "nixpkgs": [ "stylix", @@ -236,16 +295,16 @@ "gnome-shell": { "flake": false, "locked": { - "lastModified": 1732369855, - "narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=", + "lastModified": 1744584021, + "narHash": "sha256-0RJ4mJzf+klKF4Fuoc8VN8dpQQtZnKksFmR2jhWE1Ew=", "owner": "GNOME", "repo": "gnome-shell", - "rev": "dadd58f630eeea41d645ee225a63f719390829dc", + "rev": "52c517c8f6c199a1d6f5118fae500ef69ea845ae", "type": "github" }, "original": { "owner": "GNOME", - "ref": "47.2", + "ref": "48.1", "repo": "gnome-shell", "type": "github" } @@ -257,11 +316,11 @@ ] }, "locked": { - "lastModified": 1737188535, - "narHash": "sha256-O2ttwW1/dUc/Y+Rf48Njtr4tZpRJhy8FhafikekIjMY=", + "lastModified": 1749400020, + "narHash": "sha256-0nTmHO8AYgRYk5v6zw5oZ3x9nh+feb+Isn7WNe318M0=", "owner": "nix-community", "repo": "home-manager", - "rev": "1e36429705f9af2d00a517ba46a4f21ef8a8194f", + "rev": "2835e8ba0ad99ba86d4a5e497a962ec9fa35e48f", "type": "github" }, "original": { @@ -278,11 +337,11 @@ ] }, "locked": { - "lastModified": 1736785676, - "narHash": "sha256-TY0jUwR3EW0fnS0X5wXMAVy6h4Z7Y6a3m+Yq++C9AyE=", + "lastModified": 1748737919, + "narHash": "sha256-5kvBbLYdp+n7Ftanjcs6Nv+UO6sBhelp6MIGJ9nWmjQ=", "owner": "nix-community", "repo": "home-manager", - "rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d", + "rev": "5675a9686851d9626560052a032c4e14e533c1fa", "type": "github" }, "original": { @@ -291,13 +350,91 @@ "type": "github" } }, + "hyprscroller-src": { + "flake": false, + "locked": { + "lastModified": 1749141212, + "narHash": "sha256-YC9WEi74d9L1rjVnjNXqWCUPhHgCj6npQWZ0KT6l2nA=", + "owner": "cpiber", + "repo": "hyprscroller", + "rev": "80f9a9c6ec9423cfd3f17e801e92934ffc5d52d2", + "type": "github" + }, + "original": { + "owner": "cpiber", + "repo": "hyprscroller", + "type": "github" + } + }, + "iamb": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": [ + "nixpkgs" + ], + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1749177992, + "narHash": "sha256-B72RIr6pbf9kW0JhcbsgUhLSw22BxxODoKIdPd2YWFY=", + "owner": "ulyssa", + "repo": "iamb", + "rev": "33d3407694c9dece0f3e59aa577eda98c9384ea1", + "type": "github" + }, + "original": { + "owner": "ulyssa", + "repo": "iamb", + "type": "github" + } + }, + "jkernel": { + "flake": false, + "locked": { + "lastModified": 1733188630, + "narHash": "sha256-TlUFZOqFsTXh97vRpNeyoJJ+WNOwxgvu7u3JcLGN7iU=", + "owner": "tweag", + "repo": "jupyenv", + "rev": "55e42c3dea87d3c1e3e9dfde28df637e88d6bd39", + "type": "github" + }, + "original": { + "owner": "tweag", + "repo": "jupyenv", + "type": "github" + } + }, + "lanzaboote": { + "inputs": { + "crane": "crane", + "flake-compat": "flake-compat", + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2", + "pre-commit-hooks-nix": "pre-commit-hooks-nix", + "rust-overlay": "rust-overlay_2" + }, + "locked": { + "lastModified": 1737639419, + "narHash": "sha256-AEEDktApTEZ5PZXNDkry2YV2k6t0dTgLPEmAZbnigXU=", + "owner": "nix-community", + "repo": "lanzaboote", + "rev": "a65905a09e2c43ff63be8c0e86a93712361f871e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "v0.4.2", + "repo": "lanzaboote", + "type": "github" + } + }, "nixCats": { "locked": { - "lastModified": 1735318798, - "narHash": "sha256-x1hq2uimNBQtYtkaJ4KODKQmdbAYvnd1hoxRyyPekWE=", + "lastModified": 1741608660, + "narHash": "sha256-qikkAmt+z7fN2Zq6lU54x5nZ1KlE97wVAwaJk+/1PkI=", "owner": "BirdeeHub", "repo": "nixCats-nvim", - "rev": "58a8782879f926192b06b95f75538618456062ae", + "rev": "ad8d22d086cfb7a1cb0e9fda1fb871bbe370c942", "type": "github" }, "original": { @@ -308,11 +445,59 @@ }, "nixpkgs": { "locked": { - "lastModified": 1737062831, - "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", + "lastModified": 1736320768, + "narHash": "sha256-nIYdTAiKIGnFNugbomgBJR+Xv5F1ZQU+HfaBqJKroC0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "4bc9c909d9ac828a039f288cf872d16d38185db8", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1730741070, + "narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "d063c1dd113c91ab27959ba540c0d9753409edf3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1731919951, + "narHash": "sha256-vOM6ETpl1yu9KLi/icTmLJIPbbdJCdAVYUXZceO/Ce4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "04386ac325a813047fc314d4b4d838a5b1e3c7fe", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable-small", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1749285348, + "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", + "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f", "type": "github" }, "original": { @@ -322,21 +507,35 @@ "type": "github" } }, + "nixpkgs_4": { + "locked": { + "lastModified": 1741462378, + "narHash": "sha256-ZF3YOjq+vTcH51S+qWa1oGA9FgmdJ67nTNPG2OIlXDc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2d9e4457f8e83120c9fdf6f1707ed0bc603e5ac9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixvim": { "inputs": { "nixCats": "nixCats", - "nixpkgs": [ - "nixpkgs" - ], + "nixpkgs": "nixpkgs_4", "plugins-blink-ripgrep": "plugins-blink-ripgrep", "plugins-pomo-nvim": "plugins-pomo-nvim" }, "locked": { - "lastModified": 1737164379, - "narHash": "sha256-/lERZhJCq+eXPUENu0a8MwVbO8CMMn2ooej3l3+jc1U=", + "lastModified": 1741660851, + "narHash": "sha256-kFlDqMvo0gNu3xJ9PDXhF21vPv18/NiuhjHr+yoxJp4=", "owner": "kaitotlex", "repo": "vix1", - "rev": "30506bcd245c0d44d8cfcda446ff7abb2b12ae1f", + "rev": "879bcb9e209dfac74e5e86e1a0066c952edee140", "type": "github" }, "original": { @@ -345,14 +544,40 @@ "type": "github" } }, + "nur": { + "inputs": { + "flake-parts": [ + "stylix", + "flake-parts" + ], + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1748730660, + "narHash": "sha256-5LKmRYKdPuhm8j5GFe3AfrJL8dd8o57BQ34AGjJl1R0=", + "owner": "nix-community", + "repo": "NUR", + "rev": "2c0bc52fe14681e9ef60e3553888c4f086e46ecb", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "plugins-blink-ripgrep": { "flake": false, "locked": { - "lastModified": 1735411615, - "narHash": "sha256-V3Tf8bPpO7KjP/AwcgYjMZdTejydvBx/t33H3+wsNLo=", + "lastModified": 1741415505, + "narHash": "sha256-lEt5AUSyezmlthSj3KUHJ9cX4pQnB2/31j8bklIp5Mk=", "owner": "mikavilpas", "repo": "blink-ripgrep.nvim", - "rev": "f4d9460a3552c735c7835a545ce32125610c1ce5", + "rev": "91aee73557237b0cc1313e4ed2b32f10de6cc65e", "type": "github" }, "original": { @@ -377,11 +602,41 @@ "type": "github" } }, + "pre-commit-hooks-nix": { + "inputs": { + "flake-compat": [ + "lanzaboote", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "lanzaboote", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1731363552, + "narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { - "aq": "aq", "home-manager": "home-manager", - "nixpkgs": "nixpkgs", + "hyprscroller-src": "hyprscroller-src", + "iamb": "iamb", + "jkernel": "jkernel", + "lanzaboote": "lanzaboote", + "nixpkgs": "nixpkgs_3", "nixvim": "nixvim", "spicetify": "spicetify", "stylix": "stylix", @@ -390,19 +645,58 @@ "zen": "zen" } }, - "spicetify": { + "rust-overlay": { + "inputs": { + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1736994333, + "narHash": "sha256-v4Jrok5yXsZ6dwj2+2uo5cSyUi9fBTurHqHvNHLT1XA=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "848db855cb9e88785996e961951659570fc58814", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "rust-overlay_2": { "inputs": { - "flake-compat": "flake-compat", "nixpkgs": [ + "lanzaboote", "nixpkgs" ] }, "locked": { - "lastModified": 1737173687, - "narHash": "sha256-+WxaXc30KhTuCa9U8Nv2mJApIBq85CfA5fbcVsvdfxo=", + "lastModified": 1731897198, + "narHash": "sha256-Ou7vLETSKwmE/HRQz4cImXXJBr/k9gp4J4z/PF8LzTE=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "0be641045af6d8666c11c2c40e45ffc9667839b5", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "spicetify": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems_2" + }, + "locked": { + "lastModified": 1749357231, + "narHash": "sha256-AbrPgGFVYR45TlYLHYTppayG0xzOG9XXhi+1j3Klbw8=", "owner": "Gerg-L", "repo": "spicetify-nix", - "rev": "c68c2ac0814ab386d2cbd3b9178e729b4fc805f0", + "rev": "03783416f7416715c52166d4e8ba0492a7149397", "type": "github" }, "original": { @@ -419,25 +713,27 @@ "base16-vim": "base16-vim", "firefox-gnome-theme": "firefox-gnome-theme", "flake-compat": "flake-compat_2", - "flake-utils": "flake-utils", + "flake-parts": "flake-parts_2", "git-hooks": "git-hooks", "gnome-shell": "gnome-shell", "home-manager": "home-manager_2", "nixpkgs": [ "nixpkgs" ], - "systems": "systems", + "nur": "nur", + "systems": "systems_3", "tinted-foot": "tinted-foot", "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", "tinted-tmux": "tinted-tmux", "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1737207873, - "narHash": "sha256-XTCuMv753lpm8DvdVf9q2mH3rhlfsKrCUYbaADPC/bA=", + "lastModified": 1749398498, + "narHash": "sha256-Usx6sGnT/D8ZnWiZg+J1OY3dp4ZssMQiN1XeXcsL/cs=", "owner": "danth", "repo": "stylix", - "rev": "51ad2cec11e773a949bdbec88bed2524f098f49a", + "rev": "5869510e48e64d916dc6905dc664a02b0f85f1bd", "type": "github" }, "original": { @@ -461,6 +757,36 @@ "type": "github" } }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tinted-foot": { "flake": false, "locked": { @@ -481,28 +807,43 @@ "tinted-kitty": { "flake": false, "locked": { - "lastModified": 1716423189, - "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=", + "lastModified": 1735730497, + "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", "owner": "tinted-theming", "repo": "tinted-kitty", - "rev": "eb39e141db14baef052893285df9f266df041ff8", + "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", "type": "github" }, "original": { "owner": "tinted-theming", "repo": "tinted-kitty", - "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1748180480, + "narHash": "sha256-7n0XiZiEHl2zRhDwZd/g+p38xwEoWtT0/aESwTMXWG4=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "87d652edd26f5c0c99deda5ae13dfb8ece2ffe31", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", "type": "github" } }, "tinted-tmux": { "flake": false, "locked": { - "lastModified": 1735737224, - "narHash": "sha256-FO2hRBkZsjlIRqzNHCPc/52yxg11kHGA8MEtSun9RwE=", + "lastModified": 1748740859, + "narHash": "sha256-OEM12bg7F4N5WjZOcV7FHJbqRI6jtCqL6u8FtPrlZz4=", "owner": "tinted-theming", "repo": "tinted-tmux", - "rev": "aead506a9930c717ebf81cc83a2126e9ca08fa64", + "rev": "57d5f9683ff9a3b590643beeaf0364da819aedda", "type": "github" }, "original": { @@ -527,16 +868,38 @@ "type": "github" } }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "stylix", + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733222881, + "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "49717b5af6f80172275d47a418c9719a31a78b53", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, "ucodenix": { "inputs": { "cpu-microcodes": "cpu-microcodes" }, "locked": { - "lastModified": 1737386190, - "narHash": "sha256-r9UOn9nMqDjY+ohnNCKs8SgN55UXTPI+RWhka2RcsXY=", + "lastModified": 1747656938, + "narHash": "sha256-LE5jjWIN3xzL24ph8U2CwzTPrCxS+uGzXCpSh6b+UPk=", "owner": "e-tho", "repo": "ucodenix", - "rev": "4c7931fcf713c4ddf730d275f07d916c5f4c4e7a", + "rev": "86d47e4b5790cc68b3af14ec9969ef8128524d43", "type": "github" }, "original": { @@ -548,11 +911,11 @@ "wallpapers": { "flake": false, "locked": { - "lastModified": 1737220047, - "narHash": "sha256-eLf45K7NvBas7bC5hO5KfpFdy3pzCoQEaW+DNZIFQhs=", + "lastModified": 1749185371, + "narHash": "sha256-M6QK9qLgyvFaM6gF9qH1d6su254cWfw/+1aO3nxeBmQ=", "owner": "kaitotlex", "repo": "wallpaper", - "rev": "101647127869f5e91a569281fd181172b692b365", + "rev": "f1d9cf6f2d16b25ca57e684e1d20124e75413f7c", "type": "github" }, "original": { @@ -568,11 +931,11 @@ ] }, "locked": { - "lastModified": 1737173095, - "narHash": "sha256-32xX3cAIQovRNtW5cHirLvSC87uoOfLcaYGUOrTyhx4=", + "lastModified": 1748971473, + "narHash": "sha256-0Xh6sZI86Ops6u7wyDQlVvV+MvRRXIDb1r3sMnLNk9M=", "owner": "youwen5", "repo": "zen-browser-flake", - "rev": "e91b2aa537c1492efd1c5f35f1f204c685e461ab", + "rev": "5cc269976ca876674d8ccc7f40debb61e05583ab", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 29d2ab1..a13279a 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,6 @@ }; nixvim = { url = "github:kaitotlex/vix1"; - inputs.nixpkgs.follows = "nixpkgs"; }; stylix = { url = "github:danth/stylix"; @@ -25,22 +24,33 @@ }; ucodenix = { url = "github:e-tho/ucodenix"; - inputs.nixpkgs.follows = "nixpkgs"; }; wallpapers = { url = "github:kaitotlex/wallpaper"; flake = false; }; - aq = { - url = "github:quantum9innovation/aquamarine/patch-125"; + lanzaboote = { + url = "github:nix-community/lanzaboote/v0.4.2"; + }; + hyprscroller-src = { + url = "github:cpiber/hyprscroller"; flake = false; }; + jkernel = { + url = "github:tweag/jupyenv"; + flake = false; + }; + iamb = { + url = "github:ulyssa/iamb"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = { nixpkgs, home-manager, + lanzaboote, ... }@inputs: { @@ -52,6 +62,29 @@ system = "x86_64-linux"; modules = [ ./hosts/kuroko + lanzaboote.nixosModules.lanzaboote + + ( + { pkgs, lib, ... }: + { + + environment.systemPackages = [ + # For debugging and troubleshooting Secure Boot. + pkgs.sbctl + ]; + + # Lanzaboote currently replaces the systemd-boot module. + # This setting is usually set to true in configuration.nix + # generated at installation time. So we force it to false + # for now. + boot.loader.systemd-boot.enable = lib.mkForce false; + + boot.lanzaboote = { + enable = true; + pkiBundle = "/var/lib/sbctl"; + }; + } + ) home-manager.nixosModules.home-manager { home-manager = { @@ -62,7 +95,20 @@ inherit inputs; }; users.kaitotlex = { - imports = [ ./users/kaitotlex ]; + imports = [ + ./users/kaitotlex + { + wayland.windowManager.hyprland.settings.monitor = [ + "eDP-1,1920x1200@120,0x0,1" + "DP-1, 1920x1080@75.03,3840x0,1,transform, 1" + "HDMI-A-1,1920x1080@165,1920x0,1" + ]; + programs.git.signing = { + signByDefault = true; + key = "42F52D76F1B15B8D997E2AEE8AB934746F475D0B"; + }; + } + ]; }; }; } @@ -75,7 +121,29 @@ system = "x86_64-linux"; modules = [ ./hosts/shiroko + lanzaboote.nixosModules.lanzaboote + ( + { pkgs, lib, ... }: + { + + environment.systemPackages = [ + # For debugging and troubleshooting Secure Boot. + pkgs.sbctl + ]; + + # Lanzaboote currently replaces the systemd-boot module. + # This setting is usually set to true in configuration.nix + # generated at installation time. So we force it to false + # for now. + boot.loader.systemd-boot.enable = lib.mkForce false; + + boot.lanzaboote = { + enable = true; + pkiBundle = "/var/lib/sbctl"; + }; + } + ) home-manager.nixosModules.home-manager { home-manager = { @@ -86,7 +154,19 @@ inherit inputs; }; users.kaitotlex = { - imports = [ ./users/kaitotlex ]; + imports = [ + ./users/kaitotlex + { + wayland.windowManager.hyprland.settings.monitor = [ + "eDP-1,1920x1200@120,0x0,1" + "DP-1, 1920x1080@144.04,1920x0,1" + ]; + programs.git.signing = { + signByDefault = true; + key = "BC04C0C14AEDA705B8FBACE8C5F52A3C0F3B4A77"; + }; + } + ]; }; }; } diff --git a/hosts/kuroko/configuration.nix b/hosts/kuroko/configuration.nix index 8cdaa62..c09f380 100644 --- a/hosts/kuroko/configuration.nix +++ b/hosts/kuroko/configuration.nix @@ -18,16 +18,17 @@ # Bootloader. boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; + #boot.extraModulePackages = [ config.boot.kernelPackages.nvidia_x11 ]; virtualisation.waydroid.enable = true; - #boot.kernelPackages = pkgs.linuxPackages_5_15; + boot.kernelPackages = pkgs.linuxPackages_latest; #systemdefaults networking.hostName = "kuroko"; # Define your hostname. services.ratbagd.enable = true; hardware.pulseaudio.support32Bit = true; - # boot.kernelParams = [ - # "mem_sleep_default=deep" - # ]; + boot.kernelParams = [ + "mem_sleep_default=deep" + ]; # systemd.sleep.extraConfig = '' # AllowSuspend=yes # AllowHibernation=yes @@ -37,12 +38,14 @@ #Nvidia Hardware begins services.xserver.videoDrivers = [ - "nvidia" "amdgpu" + "nvidia" ]; hardware.graphics.enable = true; hardware.graphics.enable32Bit = true; - + hardware.graphics.extraPackages = with pkgs; [ + amdvlk + ]; hardware.nvidia = { # custom option defined in graphics/default.nix #usePatchedAquamarine = true; @@ -58,7 +61,7 @@ # Fine-grained power management. Turns off GPU when not in use. # Experimental and only works on modern Nvidia GPUs (Turing or newer). - powerManagement.finegrained = lib.mkForce false; + powerManagement.finegrained = lib.mkForce true; # Use the NVidia open source kernel module (not to be confused with the # independent third-party "nouveau" open source driver). @@ -67,7 +70,7 @@ # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus # Only available from driver 515.43.04+ # Currently alpha-quality/buggy, so false is currently the recommended setting. - open = lib.mkForce true; + open = lib.mkForce false; # Enable the Nvidia settings menu, # accessible via `nvidia-settings`. @@ -77,14 +80,11 @@ package = config.boot.kernelPackages.nvidiaPackages.beta; #Power Saving Features prime = { - offload = { - enable = true; - enableOffloadCmd = true; - }; + offload.enable = lib.mkForce true; # Make sure to use the correct Bus ID values for your system! #intelBusId = "PCI:"; - nvidiaBusId = "PCI:01:00:0"; - amdgpuBusId = "PCI:08:00:0"; + nvidiaBusId = "PCI:1:0:0"; + amdgpuBusId = "PCI:8:0:0"; }; }; @@ -110,7 +110,9 @@ LC_TELEPHONE = "en_US.UTF-8"; LC_TIME = "en_US.UTF-8"; }; - + nixpkgs.config.permittedInsecurePackages = [ + "olm-3.2.16" + ]; services.keyd = { enable = true; keyboards.default = { @@ -148,13 +150,20 @@ }; }; + #Asus Specific Packages + services.asusd.enable = true; + programs.rog-control-center.enable = true; + #System specific packages to install environment.systemPackages = with pkgs; [ - nvtop + # nvtop osu-lazer davinci-resolve wacomtablet obs-studio + asusctl + supergfxctl + thinkfan ]; # List services that you want to enable: diff --git a/hosts/kuroko/default.nix b/hosts/kuroko/default.nix index a3cfae5..928917f 100644 --- a/hosts/kuroko/default.nix +++ b/hosts/kuroko/default.nix @@ -7,5 +7,6 @@ ../../modules/audio ../../modules/stylix ../../modules/electrical + ../../modules/desktop-environment ]; } diff --git a/hosts/kuroko/hardware-configuration.nix b/hosts/kuroko/hardware-configuration.nix index 1120d78..c970984 100644 --- a/hosts/kuroko/hardware-configuration.nix +++ b/hosts/kuroko/hardware-configuration.nix @@ -8,20 +8,20 @@ [ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usb_storage" "usbhid" "sd_mod" ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-amd" ]; boot.extraModulePackages = [ ]; fileSystems."/" = - { device = "/dev/disk/by-uuid/50c34d14-4b3a-483c-874e-b6412a474cfe"; + { device = "/dev/disk/by-uuid/def95f35-9630-4015-9e21-97d9518a014d"; fsType = "ext4"; }; - boot.initrd.luks.devices."luks-efb1b312-b89c-493e-952a-f70fc2ab0fbf".device = "/dev/disk/by-uuid/efb1b312-b89c-493e-952a-f70fc2ab0fbf"; + boot.initrd.luks.devices."luks-c69579ed-9b9c-4435-b329-e5c95c945823".device = "/dev/disk/by-uuid/c69579ed-9b9c-4435-b329-e5c95c945823"; fileSystems."/boot" = - { device = "/dev/disk/by-uuid/1826-F6B8"; + { device = "/dev/disk/by-uuid/02A5-BCDF"; fsType = "vfat"; options = [ "fmask=0077" "dmask=0077" ]; }; diff --git a/hosts/kurokoNightly/configuration.nix b/hosts/kurokoNightly/configuration.nix index bc40d07..9b58dcc 100644 --- a/hosts/kurokoNightly/configuration.nix +++ b/hosts/kurokoNightly/configuration.nix @@ -161,16 +161,16 @@ events = [ "key" ]; command = "pamixer -d 5"; } - { - keys = [ 237 ]; - events = [ "key" ]; - command = "brightnessctl -d asus::kbd_backlight set 1-"; - } - { - keys = [ 238 ]; - events = [ "key" ]; - command = "brightnessctl -d asus::kbd_backlight set +1"; - } + # { + # keys = [ 237 ]; + # events = [ "key" ]; + # command = "${pkgs.brightnessctl} -d asus::kbd_backlight set 1-"; + # } + # { + # keys = [ 238 ]; + # events = [ "key" ]; + # command = "${pkgs.brightnessctl} -d asus::kbd_backlight set +1"; + # } #{ keys = [ ]; events = [ "key" ]; command = "brightnessctl -d amdgpu_bl2 set +10%"; } #{ keys = [ ]; events = [ "key" ]; command = "brightnessctl -d amdgpu_bl2 set +10%"; } diff --git a/hosts/shiroko/configuration.nix b/hosts/shiroko/configuration.nix index 328aab5..2e9728a 100644 --- a/hosts/shiroko/configuration.nix +++ b/hosts/shiroko/configuration.nix @@ -13,13 +13,32 @@ ]; services.fprintd.enable = true; security.pam.services.login.fprintAuth = true; + hardware.graphics.extraPackages = with pkgs; [ + vaapiIntel + intel-media-driver + ]; + hardware.graphics.enable32Bit = true; + hardware.opengl = { + enable = true; + extraPackages = with pkgs; [ + # your Open GL, Vulkan and VAAPI drivers + vpl-gpu-rt # for newer GPUs on NixOS >24.05 or unstable + # onevpl-intel-gpu # for newer GPUs on NixOS <= 24.05 + # intel-media-sdk # for older GPUs + ]; + }; hardware = { - graphics.enable32Bit = true; pulseaudio.support32Bit = true; openrazer.enable = true; }; - + virtualisation.podman = { + enable = true; + dockerCompat = true; + }; + nixpkgs.config.permittedInsecurePackages = [ + "olm-3.2.16" + ]; boot = { # Bootloader. loader.systemd-boot.enable = true; @@ -95,9 +114,9 @@ enable = true; settings = { CPU_SCALING_GOVERNOR_ON_AC = "performance"; - CPU_SCALING_GOVERNOR_ON_BAT = "performance"; + CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; - CPU_ENERGY_PERF_POLICY_ON_BAT = "performance"; + CPU_ENERGY_PERF_POLICY_ON_BAT = "power"; CPU_ENERGY_PERF_POLICY_ON_AC = "performance"; CPU_MIN_PERF_ON_AC = 0; @@ -113,6 +132,7 @@ }; environment.systemPackages = with pkgs; [ openrazer-daemon + distrobox ]; # Set your time zone. time.timeZone = "America/Los_Angeles"; # Asia/Taipei lib.mkDefault @@ -135,6 +155,46 @@ }; }; # Select internationalisation properties. + + networking.firewall = { + allowedUDPPorts = [ 51820 ]; # Clients and peers can use the same port, see listenport + }; + # Enable WireGuard + # networking.wireguard.interfaces = { + # # "wg0" is the network interface name. You can name the interface arbitrarily. + # wg0 = { + # # Determines the IP address and subnet of the client's end of the tunnel interface. + # ips = [ "10.100.0.2/24" ]; + # listenPort = 51820; # to match firewall allowedUDPPorts (without this wg uses random port numbers) + # + # # Path to the private key file. + # # + # # Note: The private key can also be included inline via the privateKey option, + # # but this makes the private key world-readable; thus, using privateKeyFile is + # # recommended. + # privateKeyFile = "path to private key file"; + # + # peers = [ + # # For a client configuration, one peer entry for the server will suffice. + # + # { + # # Public key of the server (not a file path). + # publicKey = "{server public key}"; + # + # # Forward all the traffic via VPN. + # allowedIPs = [ "0.0.0.0/0" ]; + # # Or forward only particular subnets + # #allowedIPs = [ "10.100.0.1" "91.108.12.0/22" ]; + # + # # Set this to the server IP and port. + # endpoint = "{server ip}:51820"; # ToDo: route to endpoint not automatically configured https://wiki.archlinux.org/index.php/WireGuard#Loop_routing https://discourse.nixos.org/t/solved-minimal-firewall-setup-for-wireguard-client/7577 + # + # # Send keepalives every 25 seconds. Important to keep NAT tables alive. + # persistentKeepalive = 25; + # } + # ]; + # }; + # }; i18n.defaultLocale = "en_US.UTF-8"; i18n.extraLocaleSettings = { diff --git a/hosts/shiroko/default.nix b/hosts/shiroko/default.nix index a3cfae5..928917f 100644 --- a/hosts/shiroko/default.nix +++ b/hosts/shiroko/default.nix @@ -7,5 +7,6 @@ ../../modules/audio ../../modules/stylix ../../modules/electrical + ../../modules/desktop-environment ]; } diff --git a/modules/core/default.nix b/modules/core/default.nix index 908bea6..7298a94 100644 --- a/modules/core/default.nix +++ b/modules/core/default.nix @@ -4,9 +4,6 @@ ... }: { - imports = [ - ../graphics - ]; # Enable the X11 windowing system. # You can disable this if you're only using the Wayland session. services.xserver.enable = false; diff --git a/modules/desktop-environment/default.nix b/modules/desktop-environment/default.nix new file mode 100644 index 0000000..653b2b3 --- /dev/null +++ b/modules/desktop-environment/default.nix @@ -0,0 +1,68 @@ +{ + pkgs, + lib, + config, + ... +}: +let + cfg = config.liminalOS.desktop; +in +{ + options.liminalOS.desktop = { + enable = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Whether to enable the liminalOS desktop environment. + ''; + }; + hyprland.enable = lib.mkOption { + type = lib.types.bool; + default = cfg.enable; + description = '' + Whether to enable Hyprland. Sets up a default configuration at the system and user level, and installs xdg-desktop-portal-gtk. + ''; + }; + }; + + options.liminalOS.formFactor = lib.mkOption { + type = lib.types.nullOr ( + lib.types.enum [ + "laptop" + "desktop" + ] + ); + default = "desktop"; + description = '' + Form factor of the machine. Adjusts some UI settings. + ''; + }; + + options.liminalOS.powersave = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to set some options to reduce power consumption (mostly Hyprland). + ''; + }; + + config = lib.mkIf cfg.enable { + xdg.portal = lib.mkIf cfg.hyprland.enable { + enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + }; + + programs.hyprland.enable = cfg.hyprland.enable; + + # programs.niri.enable = cfg.niri.enable; + + # programs.xwayland.enable = lib.mkIf cfg.niri.enable (lib.mkForce true); + + services.xserver.enable = false; + + services.xserver = { + xkb.layout = "us"; + xkb.variant = ""; + }; + }; +} diff --git a/modules/graphics/default.nix b/modules/graphics/default.nix deleted file mode 100644 index 094830e..0000000 --- a/modules/graphics/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ - config, - lib, - inputs, - ... -}: -let - cfg = config.hardware.nvidia; -in -{ - options.hardware.nvidia.usePatchedAquamarine = lib.mkEnableOption "q9i's patched aquamarine with working sleep on Nvidia"; - - config = lib.mkIf cfg.usePatchedAquamarine { - nixpkgs.overlays = [ - (final: prev: { - aquamarine = prev.aquamarine.overrideAttrs { - src = inputs.aq; - version = inputs.aq.rev; - }; - }) - ]; - }; -} diff --git a/modules/stylix/default.nix b/modules/stylix/default.nix index 4c5fa61..83eb960 100644 --- a/modules/stylix/default.nix +++ b/modules/stylix/default.nix @@ -6,9 +6,9 @@ stylix = { enable = true; - image = "${inputs.wallpapers}/vtubers/nordMachi-resized.png"; + image = "${inputs.wallpapers}/anime/N25/mafuAura.png"; polarity = "dark"; - base16Scheme = "${pkgs.base16-schemes}/share/themes/rose-pine.yaml"; + base16Scheme = "${pkgs.base16-schemes}/share/themes/heetch.yaml"; fonts = { serif = { diff --git a/modules/wm/default.nix b/modules/wm/default.nix index 3a3b4a2..6ab06fb 100644 --- a/modules/wm/default.nix +++ b/modules/wm/default.nix @@ -4,7 +4,10 @@ enable = true; settings = { default_session = { - command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway --remember --greeting 'Access is restricted to authorized personnel only.'"; + command = '' + ${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland --remember --asterisks --greeting "Welcome, generation $(readlink /nix/var/nix/profiles/system | grep -o '[0-9]*'). Access is restricted to authorized personnel only." + ''; + # --remember tuigreet --time --cmd Hyprland --remember --asterisks --greeting 'Access granted for those who don't touch grass' user = "greeter"; }; }; diff --git a/pkgs/hyprland/hyprscroller.nix b/pkgs/hyprland/hyprscroller.nix new file mode 100644 index 0000000..4d5351d --- /dev/null +++ b/pkgs/hyprland/hyprscroller.nix @@ -0,0 +1,60 @@ +{ + lib, + fetchFromGitHub, + hyprland, + pkg-config, + cmake, + unstableGitUpdater, + ... +}: +let + mkHyprlandPlugin = + hyprland: + args@{ pluginName, ... }: + hyprland.stdenv.mkDerivation ( + args + // { + pname = "${pluginName}"; + nativeBuildInputs = [ pkg-config ] ++ args.nativeBuildInputs or [ ]; + buildInputs = [ hyprland ] ++ hyprland.buildInputs ++ (args.buildInputs or [ ]); + meta = args.meta // { + description = args.meta.description or ""; + longDescription = + (args.meta.longDescription or "") + + "\n\nPlugins can be installed via a plugin entry in the Hyprland NixOS or Home Manager options."; + }; + } + ); +in +mkHyprlandPlugin hyprland { + pluginName = "hyprscroller"; + version = "0-unstable-2025-05-16"; + + src = fetchFromGitHub { + owner = "cpiber"; + repo = "hyprscroller"; + rev = "de97924b6d1086d84939b6f6688637f7b21d8d80"; + hash = "sha256-m9689UH+w8Z/qP/DKYtzQfIGfiE4jgBAfO+uH34cfNs="; + }; + + nativeBuildInputs = [ cmake ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib + mv hyprscroller.so $out/lib/libhyprscroller.so + + runHook postInstall + ''; + + passthru.updateScript = unstableGitUpdater { }; + + meta = { + homepage = "https://github.com/cpiber/hyprscroller"; + description = "Hyprland layout plugin providing a scrolling layout like PaperWM"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ youwen5 ]; + platforms = lib.platforms.linux; + }; +} diff --git a/users/kaitotlex/de/default.nix b/users/kaitotlex/de/default.nix deleted file mode 100644 index d021f05..0000000 --- a/users/kaitotlex/de/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - imports = [ - ./sway - ./waybar - #./rofi - ]; -} diff --git a/users/kaitotlex/de/sway/default.nix b/users/kaitotlex/de/sway/default.nix deleted file mode 100644 index 6fcf452..0000000 --- a/users/kaitotlex/de/sway/default.nix +++ /dev/null @@ -1,89 +0,0 @@ -{ - wayland.windowManager.sway = { - enable = true; - config = rec { - terminal = "kitty"; - modifier = "Mod4"; - menu = "rofi -show combi"; - #lock = "swaylock"; - bars = [ - { - command = "waybar"; - } - ]; - gaps = { - inner = 12; - }; - # colors = { - # focused = { - # background = "#191724"; - # border = "#6e6a86"; - # childBorder = "#6e6a86"; - # indicator = "#26233a"; - # text = "#e0def4"; - # }; - # focusedInactive = { - # background = "#797593"; - # border = "#393552"; - # childBorder = "#393552"; - # indicator = "#ea9d34"; - # text = "#e0def4"; - # }; - # placeholder = { - # background = "#1f1d2e"; - # border = "#000000"; - # childBorder = "#9893a5"; - # indicator = "#000000"; - # text = "#e0def4"; - # }; - # unfocused = { - # background = "#1f1d2e"; - # border = "#1f1d2e"; - # childBorder = "#1f1d2e"; - # indicator = "#797593"; - # text = "#e0def4"; - # }; - # urgent = { - # background = "#2a273f"; - # border = "#ea9a97"; - # childBorder = "#ea9a97"; - # indicator = "#1f1d2e"; - # text = "#e0def4"; - # }; - # }; - window = { - border = 3; - titlebar = false; - }; - # startup = [ - # { - # always = true; - # command = "swaybg -i /home/kaitotlex/Pictures/eff.png"; - # } - # ]; - }; - xwayland = true; - extraConfig = '' - bindsym XF86AudioRaiseVolume exec pamixer -i 5 - bindsym XF86AudioLowerVolume exec pamixer -d 5 - bindsym XF86AudioMute exec pamixer -t - bindsym XF86MonBrightnessUp exec brightnessctl s 5%+ - bindsym XF86MonBrightnessDown exec brightnessctl s 5%- - bindsym XF86AudioMicMute exec spotify - input "type:touchpad" { - natural_scroll enabled - tap enabled # enables click-on-tap - tap_button_map lrm # tap with 1 finger = left click, 2 fingers = right click, 3 fingers = middle click - #dwt enabled # disable (touchpad) while typing - } - bindsym XF86KbdBrightnessDown exec brightnessctl -d asus::kbd_backlight s 1- - bindsym XF86KbdBrightnessUp exec brightnessctl -d asus::kbd_backlight s +1 - bindsym XF86Tools exec brightnessctl s 0 - bindsym XF86WebCam exec systemctl sleep - bindsym Prior exec playerctl previous - bindsym Next exec playerctl next - bindsym XF86RotateWindows exec playerctl play-pause - ''; - }; - -} diff --git a/users/kaitotlex/de/waybar/default.nix b/users/kaitotlex/de/waybar/default.nix deleted file mode 100644 index 0d7fb89..0000000 --- a/users/kaitotlex/de/waybar/default.nix +++ /dev/null @@ -1,172 +0,0 @@ -{ pkgs, ... }: -{ - programs.waybar = { - enable = true; - style = ./style.css; - settings = { - mainBar = { - name = "bar0"; - - layer = "top"; - position = "top"; - - height = 28; - # "width" = 1920; - - "margin" = "5px 10px 0px 10px"; - "spacing" = 10; - - "mode" = "top"; - # "exclusive" = true; - - # "output" = "eDP-1"; - - reload_style_on_change = true; - - modules-left = [ - "sway/workspaces" - "sway/window" - ]; - modules-right = [ - "tray" - "idle_inhibitor" - "backlight" - "wireplumber" - "network" - "battery" - "disk" - "memory" - "cpu" - "temperature" - "clock" - ]; - - idle_inhibitor = { - format = "{icon}"; - format-icons = { - activated = "󰛊 "; - deactivated = "󰾫 "; - }; - }; - - network = { - format = "{ifname}"; - format-wifi = "{icon}{essid}"; - format-ethernet = " {essid}"; - format-disconnected = "󰤯 Disconnected"; - format-icons = [ - "󰤟 " - "󰤢 " - "󰤨 " - ]; - tooltip-format = " {bandwidthUpBits} |  {bandwidthDownBits}"; - tooltip-format-wifi = " {bandwidthUpBits} |  {bandwidthDownBits} | 󱄙 {signalStrength}"; - }; - - backlight = { - interval = 2; - format = "󰖨 {percent}%"; - on-scroll-up = "${pkgs.brightnessctl}/bin/brightnessctl -d amdgpu_bl2 set 10%"; - on-scroll-down = "${pkgs.brightnessctl}/bin/brightnessctl -d amdgpu_bl2 set 10%-"; - }; - - wireplumber = { - format = "{icon} {volume}%"; - format-muted = "󰝟 "; - on-click = "pamixer -t"; - on-scroll-up = "${pkgs.pamixer}/bin/pamixer set 5%+"; - on-scroll-down = "${pkgs.pamixer}/bin/pamixer set 5%-"; - format-icons = [ - "" - "" - "" - "" - "" - ]; - }; - - battery = { - interval = 10; - format = "{icon} {capacity}%"; - format-icons = [ - "󰂎" - "󰁺" - "󰁻" - "󰁼" - "󰁽" - "󰁾" - "󰁿" - "󰂀" - "󰂁" - "󰂂" - "󰁹" - ]; - tooltip = true; - tooltip-format = "{timeTo}"; - }; - - disk = { - intervel = 30; - format = "󰋊 {percentage_used}%"; - tooltip-format = "{used} used out of {total} on \"{path}\" ({percentage_used}%)"; - }; - - memory = { - interval = 10; - format = " {used}"; - tooltip-format = "{used}GiB used of {total}GiB ({percentage}%)"; - }; - - cpu = { - interval = 10; - format = " {usage}%"; - }; - - temperature = { - interval = 10; - }; - - clock = { - interval = 1; - format = "{:%H:%M:%S}"; - }; - - "hyprland/workspaces" = { - show-special = true; - persistent-workspaces = { - "*" = [ - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - ]; - }; - format = "{icon}"; - format-icons = { - active = ""; - empty = ""; - default = ""; - urgent = ""; - special = "󰠱"; - }; - }; - "hyprland/window" = { - icon = true; - icon-size = 20; - max-length = 50; - rewrite = { - "(.*) — firefox" = "$1"; - "(.*) — chromium" = "$1"; - "^$" = "👾"; - }; - }; - }; - }; - }; -} diff --git a/users/kaitotlex/de/waybar/nord.css b/users/kaitotlex/de/waybar/nord.css deleted file mode 100644 index 7ae564f..0000000 --- a/users/kaitotlex/de/waybar/nord.css +++ /dev/null @@ -1,27 +0,0 @@ -@define-color bg #2E3440; -/*@define-color bg #353C4A;*/ -@define-color light #D8DEE9; -/*@define-color dark @nord_dark_font;*/ -@define-color warning #ebcb8b; -@define-color critical #BF616A; -@define-color mode #434C5E; -/*@define-color workspaces @bg;*/ -/*@define-color workspaces @nord_dark_font;*/ -/*@define-color workspacesfocused #434C5E;*/ -@define-color workspacesfocused #4C566A; -@define-color tray @workspacesfocused; -@define-color sound #EBCB8B; -@define-color network #5D7096; -@define-color memory #546484; -@define-color cpu #596A8D; -@define-color temp #4D5C78; -@define-color layout #5e81ac; -@define-color battery #88c0d0; -@define-color date #434C5E; -@define-color time #434C5E; -@define-color backlight #434C5E; -@define-color nord_bg #434C5E; -@define-color nord_bg_blue #546484; -@define-color nord_light #D8DEE9; -@define-color nord_light_font #D8DEE9; -@define-color nord_dark_font #434C5E; diff --git a/users/kaitotlex/de/waybar/rose-pine-dawn.css b/users/kaitotlex/de/waybar/rose-pine-dawn.css deleted file mode 100644 index a85bab2..0000000 --- a/users/kaitotlex/de/waybar/rose-pine-dawn.css +++ /dev/null @@ -1,23 +0,0 @@ -/* -* Variant: Rosé Pine Dawn -* Maintainer: DankChoir -*/ - -@define-color base #faf4ed; -@define-color surface #fffaf3; -@define-color overlay #f2e9e1; - -@define-color muted #9893a5; -@define-color subtle #797593; -@define-color text #575279; - -@define-color love #b4637a; -@define-color gold #ea9d34; -@define-color rose #d7827e; -@define-color pine #286983; -@define-color foam #56949f; -@define-color iris #907aa9; - -@define-color highlightLow #f4ede8; -@define-color highlightMed #dfdad9; -@define-color highlightHigh #cecacd; diff --git a/users/kaitotlex/de/waybar/style.css b/users/kaitotlex/de/waybar/style.css deleted file mode 100644 index b87b208..0000000 --- a/users/kaitotlex/de/waybar/style.css +++ /dev/null @@ -1,75 +0,0 @@ -@import "./nord.css"; -window#waybar { - font-family: "CaskaydiaCove Nerd Font"; - background-color: @bg; - font-size: 0.8rem; - border-radius: 0.5rem; -} - -.modules-left { - opacity: 1; - background-color: #95a3bb; - border-radius: 0.5rem; - padding: 2px; -} - -.modules-center { - opacity: 0; -} - -.modules-right { - opacity: 1; - background-color: #95a3bb; - border-radius: 0.5rem; - padding: 2px 2px 2px 10px -} - -/* label.module { - margin-left: -1px; -} */ - -#workspaces { - background-color: #6e7581; - border-radius: 0.5rem; - padding: 0 2px; -} - -#workspaces button { - font-size: 0.6rem; - padding: 0 0.3rem 0 0; -} - -#window { - background-color: #95a3bb; - border-radius: 0.5rem; - padding: 2px 5px; -} - -#clock { - border-radius: 0.5rem; - padding: 0 3px 0 0; -} - -#battery { - color: @date; -} - -#memory { - color: @memory; -} - -#disk { - color: @date; -} - -#cpu { - color: @cpu; -} - -#temperature { - color: @temp; -} - -#network { - color: @network; -} diff --git a/users/kaitotlex/de/waybar/style.css.bak b/users/kaitotlex/de/waybar/style.css.bak deleted file mode 100644 index 9fbd8ff..0000000 --- a/users/kaitotlex/de/waybar/style.css.bak +++ /dev/null @@ -1,76 +0,0 @@ -@import "./rose-pine-dawn.css"; -window#waybar { - font-family: "CaskaydiaCove Nerd Font"; - background-color: @base; - font-size: 0.8rem; - border-radius: 0.5rem; -} - -.modules-left { - opacity: 1; - background: linear-gradient(45deg, @muted, @subtle); - border-radius: 0.5rem; - padding: 2px; -} - -.modules-center { - opacity: 0; -} - -.modules-right { - opacity: 1; - background-color: @subtle; - border-radius: 0.5rem; - padding: 2px 2px 2px 10px -} - -/* label.module { - margin-left: -1px; -} */ - -#workspaces { - background-color: @rose; - border-radius: 0.5rem; - padding: 0 2px; -} - -#workspaces button { - font-size: 0.6rem; - padding: 0 0.3rem 0 0; -} - -#window { - background-color: @iris; - border-radius: 0.5rem; - padding: 2px 5px; -} - -#clock { - border-radius: 0.5rem; - padding: 0 3px 0 0; -} - -#battery { - color: @foam; -} - -#memory { - color: @iris; -} - -#disk { - color: @gold; -} - -#cpu { - color: @rose; -} - -#temperature { - color: @foam; -} - -#network { - color: @rose; -} - diff --git a/users/kaitotlex/default.nix b/users/kaitotlex/default.nix index 51cda52..42f8144 100644 --- a/users/kaitotlex/default.nix +++ b/users/kaitotlex/default.nix @@ -2,7 +2,10 @@ imports = [ ./home.nix ./spicetify.nix - ./de ./stylix + ./desktop-environment ]; + + liminalOS.formFactor = "laptop"; + liminalOS.powersave = false; } diff --git a/users/kaitotlex/desktop-environment/default.nix b/users/kaitotlex/desktop-environment/default.nix new file mode 100644 index 0000000..18ac71f --- /dev/null +++ b/users/kaitotlex/desktop-environment/default.nix @@ -0,0 +1,22 @@ +{ + osConfig, + lib, + ... +}: +{ + imports = [ + ./hyprland + ./waybar + ./swaync.nix + ]; + + options.liminalOS.desktop = { + enable = lib.mkOption { + type = lib.types.bool; + default = osConfig.liminalOS.desktop.enable; + description = '' + Whether to enable the default configuration for the userland portions of the liminalOS desktop environment. + ''; + }; + }; +} diff --git a/users/kaitotlex/desktop-environment/hyprland/binds.nix b/users/kaitotlex/desktop-environment/hyprland/binds.nix new file mode 100644 index 0000000..6886fe4 --- /dev/null +++ b/users/kaitotlex/desktop-environment/hyprland/binds.nix @@ -0,0 +1,99 @@ +{ + lib, + pkgs, + config, + ... +}: +let + cfg = config.liminalOS.desktop.hyprland; + hyprnome = "${pkgs.hyprnome}/bin/hyprnome"; +in +{ + wayland.windowManager.hyprland.settings = lib.mkIf cfg.enable { + bind = [ + "$mod+Shift, $Left, scroller:movewindow, l" + "$mod+Shift, $Right, scroller:movewindow, r" + "$mod+Shift, $Up, scroller:movewindow, u" + "$mod+Shift, $Down, scroller:movewindow, d" + + # Move around + "$mod, $Left, scroller:movefocus, l" + "$mod, $Right, scroller:movefocus, r" + "$mod, $Up, scroller:movefocus, u" + "$mod, $Down, scroller:movefocus, d" + "$mod, comma, scroller:admitwindow" + "$mod, period, scroller:expelwindow" + "$mod, F, scroller:fitsize, active" + "$mod, Y, scroller:fitsize, all" + "$mod, semicolon, scroller:cyclesize, next" + "$mod, apostrophe, scroller:cyclesize, previous" + + "$mod+Shift, U, exec, ${hyprnome} --move" + "$mod+Shift, I, exec, ${hyprnome} --previous --move" + + "$mod, U, exec, ${hyprnome}" + "$mod, I, exec, ${hyprnome} --previous" + + "$mod, C, scroller:setmode, c" + "$mod, V, scroller:setmode, r" + + "$mod, G, scroller:jump" + "$mod+Ctrl, G, scroller:toggleoverview" + # Window actions + "$mod, Q, killactive" + "$mod, W, togglefloating" + "$mod, Return, fullscreen" + + # Utilities + "$mod, Space, exec, pkill -x rofi || rofi -show drun" # Run rofi application launcher + "$mod, X, exec, pkill -x rofi || rofi -show window" # Run rofi window switcher + + "$mod, Backspace, exec, pkill -x wlogout || wlogout" # show logout menu + + "$mod, Z, exec, loginctl lock-session" + + # Media controls + ",XF86AudioMute, exec, ${pkgs.pamixer}/bin/pamixer -t" + ",XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl --player=%any,firefox play-pause" + ",XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl --player=%any,firefox next" + ",XF86AudioRewind, exec, ${pkgs.playerctl}/bin/playerctl --player=%any,firefox previous" + + "$mod, S, togglespecialworkspace" + "$mod+Alt, S, movetoworkspacesilent, special" + "$mod, Tab, workspace, previous" + ''$mod+Shift, P, exec, ${pkgs.grim}/bin/grim - | ${pkgs.swappy}/bin/swappy -f -'' # Screenshot full screen + ''$mod, P, exec, ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.swappy}/bin/swappy -f -'' # Screenshot + + "$mod, B, exec, zen" + + "$mod, N, exec, sleep 0.1 && ${pkgs.swaynotificationcenter}/bin/swaync-client -t -sw" + # Application Keybinds + "$mod, R, exec, ${pkgs.pavucontrol}/bin/pavucontrol -t 3" # open pavucontrol on 'outputs' tab + "$mod, T, exec, ${pkgs.kitty}/bin/kitty" + "$mod, E, exec, ${pkgs.xfce.thunar}/bin/thunar" + "$mod, M, exec, ${pkgs.thunderbird}/bin/thunderbird" + ]; + + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + bindel = [ + ",XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%-" + ",XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%+" + ",XF86KbdBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl -d asus::kbd_backlight set 1-" + ",XF86KbdBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl -d asus::kbd_backlight set 1-" + ",XF86Launch1, exec, ${pkgs.supergfxctl}/bin/supergfxctl --mode Hybrid" + ",XF86Launch4, exec, ${pkgs.supergfxctl}/bin/supergfxctl --mode Integrated" + ",XF86AudioRaiseVolume, exec, ${pkgs.pamixer}/bin/pamixer -i 5" + ",XF86AudioLowerVolume, exec, ${pkgs.pamixer}/bin/pamixer -d 5" + ]; + binde = [ + # Resize windows + "$mod+Alt, $Right, resizeactive, 30 0" + "$mod+Alt, $Left, resizeactive, -30 0" + "$mod+Alt, $Up, resizeactive, 0 -30" + "$mod+Alt, $Down, resizeactive, 0 30" + ]; + }; +} diff --git a/users/kaitotlex/desktop-environment/hyprland/default.nix b/users/kaitotlex/desktop-environment/hyprland/default.nix new file mode 100644 index 0000000..ddd9dde --- /dev/null +++ b/users/kaitotlex/desktop-environment/hyprland/default.nix @@ -0,0 +1,248 @@ +{ + pkgs, + config, + lib, + osConfig, + inputs, + ... +}: +let + cfg = config.liminalOS.desktop.hyprland; +in +{ + imports = [ + ./binds.nix + ./utilities.nix + ./windowrules.nix + ]; + + options.liminalOS.formFactor = lib.mkOption { + type = lib.types.nullOr ( + lib.types.enum [ + "laptop" + "desktop" + ] + ); + default = osConfig.liminalOS.formFactor; + description = '' + Form factor of the machine. Adjusts some UI settings. + ''; + }; + + options.liminalOS.powersave = lib.mkOption { + type = lib.types.bool; + default = osConfig.liminalOS.powersave; + description = '' + Whether to set some options to reduce power consumption (mostly Hyprland). + ''; + }; + + options.liminalOS.desktop.hyprland = { + enable = lib.mkOption { + type = lib.types.bool; + default = config.liminalOS.desktop.enable; + description = '' + Whether to enable and rice Hyprland as well as some basic desktop utilities. + ''; + }; + gtkUseOpenGL = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to set GSK_RENDERER environment variable to stop GTK apps from crashing. + ''; + }; + idleDaemon.enable = lib.mkOption { + type = lib.types.bool; + default = cfg.enable; + description = '' + Whether to setup and enable Hypridle with some defaults to automatically lock the screen and suspend after idling. + ''; + }; + screenlocker.enable = lib.mkOption { + type = lib.types.bool; + default = cfg.enable && cfg.idleDaemon.enable; + description = '' + Whether to set up Hyprlock for screen locking. + ''; + }; + screenlocker.useCrashFix = lib.mkOption { + type = lib.types.bool; + default = false; + description = '' + Whether to use a workaround for Hyprlock background blur not working on some machines. Before locking, a screenshot will be taken and placed at `/tmp/__hyprlock-monitor-screenshot.png`. + ''; + }; + screenlocker.monitor = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + description = '' + Monitor to use for screen locker. Use `hyprctl monitors` to determine. + ''; + }; + bluelight.enable = lib.mkOption { + type = lib.types.bool; + default = true; + description = '' + Whether to enable `hyprsunset` as a daemon. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = with pkgs; [ + wl-clipboard + libsForQt5.qtstyleplugin-kvantum + libsForQt5.qt5ct + papirus-icon-theme + libsForQt5.qt5ct + hyprland-qtutils + ]; + + wayland.windowManager.hyprland = + let + hyprscroller = pkgs.callPackage ../../../../pkgs/hyprland/hyprscroller.nix { + src = inputs.hyprscroller-src; + version = inputs.hyprscroller-src.lastModified; + }; + in + { + enable = true; + plugins = [ hyprscroller ]; + settings = { + input.touchpad = lib.mkIf (config.liminalOS.formFactor == "laptop") { + natural_scroll = true; + disable_while_typing = true; + clickfinger_behavior = true; + tap-to-click = true; + scroll_factor = 0.15; + }; + + exec-once = [ + "hyprctl dispatch workspace 100000" + ]; + "$mod" = "SUPER"; + "$Left" = "H"; + "$Right" = "L"; + "$Up" = "K"; + "$Down" = "J"; + env = ( + lib.optionals cfg.gtkUseOpenGL [ + "GSK_RENDERER,ngl" + ] + ); + layerrule = [ + "blur,rofi" + "ignorezero,rofi" + "animation slide bottom 0.2 0.2 wind,rofi" + "blur,notifications" + "ignorezero,notifications" + "blur,swaync-notification-window" + "animation slide right 0.5 0.5,swaync-control-center" + "animation slide right 0.5 0.5,notifications" + "animation slide right 0.5 0.5,swaync-notification-window" + "ignorezero,swaync-notification-window" + "blur,swaync-control-center" + "ignorezero,swaync-control-center" + "blur,logout_dialog" + ]; + dwindle = { + pseudotile = "yes"; + preserve_split = "yes"; + }; + animations = { + enabled = "yes"; + bezier = [ + "wind, 0.05, 0.9, 0.1, 1.05" + "winIn, 0.1, 1.1, 0.1, 1.1" + "winOut, 0.3, -0.3, 0, 1" + "liner, 1, 1, 1, 1" + "windup, 0.05, 0.9, 0.1, 1.05" + ]; + animation = + [ + "windows, 1, 6, wind, slide" + "windowsIn, 1, 6, winIn, slide" + "windowsOut, 1, 5, winOut, slide" + "windowsMove, 1, 5, wind, slide" + "fade, 1, 10, default" + # "layers, 1, 8, default, slide" + "workspaces, 1, 5, wind, slidefadevert" + ] + ++ (lib.optionals (!osConfig.liminalOS.powersave) [ + "border, 1, 1, liner" + "borderangle, 1, 30, liner, loop" + ]); + }; + + general = + let + inherit (config.lib.stylix) colors; + in + { + gaps_in = "3"; + gaps_out = "8"; + border_size = "2"; + # "col.active_border" = pkgs.lib.mkForce "rgba(ca9ee6ff) rgba(f2d5cfff) 45deg"; + # "col.inactive_border" = pkgs.lib.mkForce "rgba(b4befecc) rgba(6c7086cc) 45deg"; + "col.active_border" = "rgba(${colors.base0A}ff) rgba(${colors.base09}ff) 45deg"; + "col.inactive_border" = "rgba(${colors.base01}cc) rgba(${colors.base02}cc) 45deg"; + layout = "scroller"; + resize_on_border = "true"; + }; + + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + }; + + cursor = { + hide_on_key_press = true; + }; + + decoration = { + rounding = "10"; + dim_special = "0.3"; + blur = { + enabled = "yes"; + size = "6"; + passes = "3"; + new_optimizations = "on"; + ignore_opacity = "on"; + xray = "false"; + special = true; + }; + shadow = { + enabled = false; + }; + }; + input = { + sensitivity = "-0.25"; + }; + plugin.scroller = { + column_widths = "onethird onehalf twothirds one"; + column_heights = "onethird onehalf twothirds one"; + }; + experimental.xx_color_management_v4 = true; + }; + }; + + # wayland.windowManager.hyprland.settings.input.touchpad = + # lib.mkIf (config.liminalOS.formFactor == "laptop") + # { + # natural_scroll = true; + # disable_while_typing = true; + # clickfinger_behavior = true; + # tap-to-click = false; + # scroll_factor = 0.15; + # }; + # + assertions = [ + { + assertion = + !cfg.screenlocker.useCrashFix || (cfg.screenlocker.useCrashFix && cfg.screenlocker.monitor != null); + message = "To use the Nvidia crash fix, you must set screenlocker.monitor to the monitor you want to use as the lock screen that blurs! Use `hyprctl monitors` to determine the monitor codes (should be something like DP-1, HDMI-A-1, etc)."; + } + ]; + }; +} diff --git a/users/kaitotlex/desktop-environment/hyprland/utilities.nix b/users/kaitotlex/desktop-environment/hyprland/utilities.nix new file mode 100644 index 0000000..40b3fff --- /dev/null +++ b/users/kaitotlex/desktop-environment/hyprland/utilities.nix @@ -0,0 +1,183 @@ +{ + pkgs, + lib, + config, + ... +}: +let + cfg = config.liminalOS.desktop.hyprland; +in +{ + config = lib.mkIf cfg.enable { + systemd.user.services = lib.mkIf cfg.bluelight.enable { + hyprsunset = { + Unit = { + Description = "Start the hyprsunset daemon"; + PartOf = "hyprland-session.target"; + After = "hyprland-session.target"; + }; + Service = { + Type = "simple"; + ExecStart = "${pkgs.hyprsunset}/bin/hyprsunset"; + Restart = "on-failure"; + RestartSec = 3; + }; + Install = { + WantedBy = [ "hyprland-session.target" ]; + }; + }; + }; + + services.hyprpaper.enable = true; + + programs.wlogout.enable = true; + + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + terminal = "${pkgs.kitty}/bin/kitty"; + theme = + let + inherit (config.lib.formats.rasi) mkLiteral; + mkRgba = + opacity: color: + let + c = config.lib.stylix.colors; + r = c."${color}-rgb-r"; + g = c."${color}-rgb-g"; + b = c."${color}-rgb-b"; + in + mkLiteral "rgba ( ${r}, ${g}, ${b}, ${opacity} % )"; + mkRgb = mkRgba "100"; + rofiOpacity = builtins.toString (builtins.ceil (config.stylix.opacity.popups * 100)); + in + { + "*" = { + font = "${config.stylix.fonts.monospace.name} ${toString config.stylix.fonts.sizes.popups}"; + text-color = mkRgb "base05"; + background-color = mkRgba rofiOpacity "base00"; + }; + "window" = { + height = mkLiteral "20em"; + width = mkLiteral "30em"; + border-radius = mkLiteral "8px"; + border-width = mkLiteral "2px"; + padding = mkLiteral "1.5em"; + }; + "mainbox" = { + background-color = mkRgba rofiOpacity "base01"; + }; + "inputbar" = { + margin = mkLiteral "0 0 1em 0"; + }; + "prompt" = { + enabled = false; + }; + "entry" = { + placeholder = "Search..."; + padding = mkLiteral "1em 1em"; + text-color = mkRgb "base05"; + background-color = mkRgba rofiOpacity "base00"; + border-radius = mkLiteral "8px"; + }; + "element-text" = { + padding = mkLiteral "0.5em 1em"; + margin = mkLiteral "0 0.5em"; + }; + "element-icon" = { + size = mkLiteral "3ch"; + }; + "element-text selected" = { + background-color = mkRgba rofiOpacity "base0A"; + text-color = mkRgb "base01"; + border-radius = mkLiteral "8px"; + }; + }; + }; + + services.swayosd.enable = true; + + programs.hyprlock = lib.mkIf cfg.screenlocker.enable { + enable = true; + settings = { + general = { + hide_cursor = true; + grace = 0; + }; + background = { + monitor = cfg.screenlocker.monitor; + path = + if cfg.screenlocker.useCrashFix then "/tmp/__hyprlock-monitor-screenshot.png" else "screenshot"; + blur_passes = 3; + blur_size = 7; + noise = 0.0117; + contrast = 0.8916; + brightness = 0.8172; + vibrancy = 0.1696; + vibrancy_darkness = 0.0; + }; + input-field = { + monitor = ""; + size = "200, 50"; + outline_thickness = 3; + dots_size = 0.33; + dots_spacing = 0.15; + dots_center = false; + dots_rounding = -1; + outer_color = "rgb(151515)"; + inner_color = "rgb(200, 200, 200)"; + font_color = "rgb(10, 10, 10)"; + fade_on_empty = true; + fade_timeout = 1000; + placeholder_text = "Input Password..."; + hide_input = false; + rounding = -1; + check_color = "rgb(204, 136, 34)"; + fail_color = "rgb(204, 34, 34)"; + fail_text = "$FAIL ($ATTEMPTS)"; + fail_timeout = 2000; + fail_transition = 300; + capslock_color = -1; + numlock_color = -1; + bothlock_color = -1; + invert_numlock = false; + swap_font_color = false; + + position = "0, -20"; + halign = "center"; + valign = "center"; + }; + }; + }; + + services.hypridle = lib.mkIf cfg.idleDaemon.enable { + enable = true; + settings = { + general = { + lock_cmd = + if cfg.screenlocker.useCrashFix then + "pidof hyprlock || ${pkgs.grim}/bin/grim -o ${config.programs.hyprlock.settings.background.monitor} /tmp/__hyprlock-monitor-screenshot.png && ${pkgs.hyprlock}/bin/hyprlock" + else + "pidof hyprlock || hyprlock"; + before_sleep_cmd = "loginctl lock-session"; # lock before suspend. + after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display. + }; + listener = [ + { + timeout = 1500; + on-timeout = "loginctl lock-session"; + } + { + timeout = 330; # 5.5min + on-timeout = "hyprctl dispatch dpms off"; # screen off when timeout has passed + on-resume = "hyprctl dispatch dpms on"; # screen on when activity is detected after timeout has fired. + } + { + timeout = 1800; + on-timeout = "systemctl suspend"; + } + ]; + }; + }; + }; +} diff --git a/users/kaitotlex/desktop-environment/hyprland/windowrules.nix b/users/kaitotlex/desktop-environment/hyprland/windowrules.nix new file mode 100644 index 0000000..017128d --- /dev/null +++ b/users/kaitotlex/desktop-environment/hyprland/windowrules.nix @@ -0,0 +1,95 @@ +{ config, lib, ... }: +{ + config.wayland.windowManager.hyprland.settings.windowrulev2 = + lib.mkIf config.liminalOS.desktop.hyprland.enable + [ + "opacity 0.90 0.90,class:^(librewolf)$" + "opacity 0.90 0.90,class:^(floorp)$" + "opacity 0.90 0.90,class:^(zen-alpha)$" + "opacity 0.90 0.90,class:^(zen-beta)$" + "opacity 0.90 0.90,class:^(zen)$" + "opacity 0.90 0.90,class:^(Brave-browser)$" + "opacity 0.80 0.80,class:^(Steam)$" + "opacity 0.80 0.80,class:^(steam)$" + "opacity 0.80 0.80,class:^(steamwebhelper)$" + "opacity 0.80 0.80,class:^(Spotify)$" + "opacity 0.80 0.80,initialTitle:^(Spotify Premium)$" + "opacity 0.80 0.80,initialTitle:^(Spotify Free)$" + "opacity 0.80 0.80,class:^(code-oss)$" + "opacity 0.80 0.80,class:^(Code)$" + "opacity 0.80 0.80,class:^(code-url-handler)$" + "opacity 0.80 0.80,class:^(code-insiders-url-handler)$" + "opacity 0.80 0.80,class:^(kitty)$" + "opacity 0.80 0.80,class:^(neovide)$" + "opacity 0.80 0.80,class:^(org.kde.dolphin)$" + "opacity 0.80 0.80,class:^(thunar)$" + "opacity 0.80 0.80,class:^(org.kde.ark)$" + "opacity 0.80 0.80,class:^(nwg-look)$" + "opacity 0.80 0.80,class:^(qt5ct)$" + "opacity 0.80 0.80,class:^(qt6ct)$" + "opacity 0.80 0.80,class:^(kvantummanager)$" + "opacity 0.80 0.80,class:^(waypaper)$" + "opacity 0.80 0.80,class:^(org.pulseaudio.pavucontrol)$" + "opacity 0.80 0.80,class:^(com.github.wwmm.easyeffects)$" + "opacity 0.80 0.80,class:^(thunderbird)$" + + "opacity 0.90 0.90,class:^(com.github.rafostar.Clapper)$ # Clapper-Gtk" + "opacity 0.80 0.80,class:^(com.github.tchx84.Flatseal)$ # Flatseal-Gtk" + "opacity 0.80 0.80,class:^(hu.kramo.Cartridges)$ # Cartridges-Gtk" + "opacity 0.80 0.80,class:^(com.obsproject.Studio)$ # Obs-Qt" + "opacity 0.80 0.80,class:^(gnome-boxes)$ # Boxes-Gtk" + "opacity 0.80 0.80,class:^(discord)$ # Discord-Electron" + "opacity 0.80 0.80,class:^(vesktop)$ # Vesktop-Electron" + "opacity 0.80 0.80,class:^(ArmCord)$ # ArmCord-Electron" + "opacity 0.80 0.80,class:^(app.drey.Warp)$ # Warp-Gtk" + "opacity 0.80 0.80,class:^(net.davidotek.pupgui2)$ # ProtonUp-Qt" + "opacity 0.80 0.80,class:^(yad)$ # Protontricks-Gtk" + "opacity 0.80 0.80,class:^(signal)$ # Signal-Gtk" + "opacity 0.80 0.80,class:^(io.github.alainm23.planify)$ # planify-Gtk" + "opacity 0.80 0.80,class:^(io.gitlab.theevilskeleton.Upscaler)$ # Upscaler-Gtk" + "opacity 0.80 0.80,class:^(com.github.unrud.VideoDownloader)$ # VideoDownloader-Gtk" + "opacity 0.80 0.80,class:^(lutris)$ # Lutris game launcher" + + "opacity 0.80 0.70,class:^(pavucontrol)$" + "opacity 0.80 0.70,class:^(blueman-manager)$" + "opacity 0.80 0.70,class:^(nm-applet)$" + "opacity 0.80 0.70,class:^(nm-connection-editor)$" + "opacity 0.80 0.70,class:^(org.kde.polkit-kde-authentication-agent-1)$" + + "float,class:^(org.kde.dolphin)$,title:^(Progress Dialog — Dolphin)$" + "float,class:^(org.kde.dolphin)$,title:^(Copying — Dolphin)$" + "float,title:^(Picture-in-Picture)$" + "float,class:^(librewolf)$,title:^(Library)$" + "float,class:^(floorp)$,title:^(Library)$" + "float,class:^(zen-alpha)$,title:^(Library)$" + "float,class:^(zen-beta)$,title:^(Library)$" + "float,class:^(zen)$,title:^(Library)$" + ''float,class:^(zen)$,title:^(.*Extension: \(Bitwarden Password Manager\).*)$'' + "float,class:^(vlc)$" + "float,class:^(kvantummanager)$" + "float,class:^(qt5ct)$" + "float,class:^(qt6ct)$" + "float,class:^(nwg-look)$" + "float,class:^(org.kde.ark)$" + "float,class:^(org.pulseaudio.pavucontrol)$" + "float,class:^(com.github.rafostar.Clapper)$ # Clapper-Gtk" + "float,class:^(app.drey.Warp)$ # Warp-Gtk" + "float,class:^(net.davidotek.pupgui2)$ # ProtonUp-Qt" + "float,class:^(yad)$ # Protontricks-Gtk" + "float,class:^(eog)$ # Imageviewer-Gtk" + "float,class:^(io.github.alainm23.planify)$ # planify-Gtk" + "float,class:^(io.gitlab.theevilskeleton.Upscaler)$ # Upscaler-Gtk" + "float,class:^(com.github.unrud.VideoDownloader)$ # VideoDownloader-Gkk" + "float,class:^(blueman-manager)$" + "float,class:^(nm-applet)$" + "float,class:^(nm-connection-editor)$" + "float,class:^(org.kde.polkit-kde-authentication-agent-1)$" + "opacity 0.80 0.80,class:^(org.freedesktop.impl.portal.desktop.gtk)$" + "opacity 0.80 0.80,class:^(org.freedesktop.impl.portal.desktop.hyprland)$" + + ''size 70% 70%,class:^(zen)$,title:^(.*Extension: \(Bitwarden Password Manager\).*)$'' + "size 50% 50%,class:^(org.pulseaudio.pavucontrol)" + + "stayfocused, class:^(pinentry-)" # fix pinentry losing focus + ]; +} diff --git a/users/kaitotlex/desktop-environment/swaync.nix b/users/kaitotlex/desktop-environment/swaync.nix new file mode 100644 index 0000000..73b1b3e --- /dev/null +++ b/users/kaitotlex/desktop-environment/swaync.nix @@ -0,0 +1,325 @@ +{ config, lib, ... }: +let + cfg = config.liminalOS.desktop.swaync; +in +{ + options.liminalOS.desktop.swaync = { + enable = lib.mkOption { + type = lib.types.bool; + default = config.liminalOS.desktop.enable; + description = '' + Whether to enable the swaync notification center and daemon. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + services.swaync.enable = true; + services.swaync.settings = { + positionX = "right"; + positionY = "top"; + control-center-margin-top = 10; + control-center-margin-bottom = 10; + control-center-margin-right = 10; + control-center-margin-left = 10; + notification-icon-size = 64; + notification-body-image-height = 100; + notification-body-image-width = 200; + timeout = 10; + timeout-low = 5; + timeout-critical = 0; + fit-to-screen = false; + control-center-width = 500; + control-center-height = 800; + notification-window-width = 500; + keyboard-shortcuts = true; + image-visibility = "when-available"; + transition-time = 200; + hide-on-clear = false; + hide-on-action = true; + script-fail-notify = true; + widgets = [ + "title" + "mpris" + "volume" + "backlight" + "dnd" + "notifications" + ]; + widget-config = { + title = { + text = "Mission Control"; + clear-all-button = "true"; + button-text = " All Systems Go"; + }; + dnd = { + text = "Do Not Disturb"; + }; + label = { + max-lines = 1; + text = "Mission Control"; + }; + mpris = { + image-size = 96; + image-radius = 7; + }; + volume = { + label = "󰕾"; + }; + backlight = { + label = "󰃟"; + }; + }; + }; + + home.file.".config/swaync/style.css".text = '' + * { + font-family: ${config.stylix.fonts.monospace.name}; + } + .control-center .notification-row:focus, + .control-center .notification-row:hover { + background: #${config.lib.stylix.colors.base00} + } + .notification-row { + outline: none; + margin: 10px; + padding: 0; + } + .notification { + background: transparent; + padding: 0; + margin: 0px; + opacity: 0.75; + } + .notification-content { + background: #${config.lib.stylix.colors.base00}; + padding: 10px; + border-radius: 5px; + border: 2px solid #${config.lib.stylix.colors.base05}; + margin: 0; + } + .notification-default-action { + margin: 0; + padding: 0; + border-radius: 5px; + } + .close-button { + background: #${config.lib.stylix.colors.base08}; + color: #${config.lib.stylix.colors.base00}; + text-shadow: none; + padding: 0; + border-radius: 5px; + margin-top: 5px; + margin-right: 5px; + } + .close-button:hover { + box-shadow: none; + background: #${config.lib.stylix.colors.base0D}; + transition: all .15s ease-in-out; + border: none + } + .notification-action { + border: 2px solid #${config.lib.stylix.colors.base0D}; + border-top: none; + border-radius: 5px; + } + .notification-default-action:hover, + .notification-action:hover { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base0B} + } + .notification-default-action { + border-radius: 5px; + margin: 0px; + } + .notification-default-action:not(:only-child) { + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px + } + .notification-action:first-child { + border-bottom-left-radius: 10px; + background: #${config.lib.stylix.colors.base00} + } + .notification-action:last-child { + border-bottom-right-radius: 10px; + background: #${config.lib.stylix.colors.base00} + } + .inline-reply { + margin-top: 8px + } + .inline-reply-entry { + background: #${config.lib.stylix.colors.base00}; + color: #${config.lib.stylix.colors.base05}; + caret-color: #${config.lib.stylix.colors.base05}; + border: 1px solid #${config.lib.stylix.colors.base09}; + border-radius: 5px + } + .inline-reply-button { + margin-left: 4px; + background: #${config.lib.stylix.colors.base00}; + border: 1px solid #${config.lib.stylix.colors.base09}; + border-radius: 5px; + color: #${config.lib.stylix.colors.base05} + } + .inline-reply-button:disabled { + background: initial; + color: #${config.lib.stylix.colors.base03}; + border: 1px solid transparent + } + .inline-reply-button:hover { + background: #${config.lib.stylix.colors.base00} + } + .body-image { + margin-top: 6px; + background-color: #${config.lib.stylix.colors.base05}; + border-radius: 5px + } + .summary { + font-size: 16px; + font-weight: 700; + background: transparent; + color: rgba(158, 206, 106, 1); + text-shadow: none + } + .time { + font-size: 16px; + font-weight: 700; + background: transparent; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none; + margin-right: 18px + } + .body { + font-size: 15px; + font-weight: 400; + background: transparent; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none + } + .control-center { + background: #${config.lib.stylix.colors.base00}; + border: 2px solid #${config.lib.stylix.colors.base0C}; + border-radius: 5px; + opacity: 0.85; + } + .control-center-list { + background: transparent + } + .control-center-list-placeholder { + opacity: .5 + } + .floating-notifications { + background: transparent + } + .blank-window { + background: alpha(black, 0) + } + .widget-title { + color: #${config.lib.stylix.colors.base0B}; + background: #${config.lib.stylix.colors.base00}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + font-size: 1.5rem; + border-radius: 5px; + } + .widget-title>button { + font-size: 1rem; + color: #${config.lib.stylix.colors.base05}; + text-shadow: none; + background: #${config.lib.stylix.colors.base00}; + box-shadow: none; + border-radius: 5px; + } + .widget-title>button:hover { + background: #${config.lib.stylix.colors.base08}; + color: #${config.lib.stylix.colors.base00}; + } + .widget-dnd { + background: #${config.lib.stylix.colors.base00}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: large; + color: #${config.lib.stylix.colors.base0B}; + } + .widget-dnd>switch { + border-radius: 5px; + /* border: 1px solid #${config.lib.stylix.colors.base0B}; */ + background: #${config.lib.stylix.colors.base0B}; + } + .widget-dnd>switch:checked { + background: #${config.lib.stylix.colors.base08}; + border: 1px solid #${config.lib.stylix.colors.base08}; + } + .widget-dnd>switch slider { + background: #${config.lib.stylix.colors.base00}; + border-radius: 5px + } + .widget-dnd>switch:checked slider { + background: #${config.lib.stylix.colors.base00}; + border-radius: 5px + } + .widget-label { + margin: 10px 10px 5px 10px; + } + .widget-label>label { + font-size: 1rem; + color: #${config.lib.stylix.colors.base05}; + } + .widget-mpris { + color: #${config.lib.stylix.colors.base05}; + padding: 5px 10px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + } + .widget-mpris > box > button { + border-radius: 5px; + } + .widget-mpris-player { + padding: 5px 10px; + margin: 10px + } + .widget-mpris-title { + font-weight: 700; + font-size: 1.25rem + } + .widget-mpris-subtitle { + font-size: 1.1rem + } + .widget-menubar>box>.menu-button-bar>button { + border: none; + background: transparent + } + .topbar-buttons>button { + border: none; + background: transparent + } + .widget-volume { + background: #${config.lib.stylix.colors.base01}; + padding: 5px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: x-large; + color: #${config.lib.stylix.colors.base05}; + } + .widget-volume>box>button { + background: #${config.lib.stylix.colors.base0B}; + border: none + } + .per-app-volume { + background-color: #${config.lib.stylix.colors.base00}; + padding: 4px 8px 8px; + margin: 0 8px 8px; + border-radius: 5px; + } + .widget-backlight { + background: #${config.lib.stylix.colors.base01}; + padding: 5px; + margin: 10px 10px 5px 10px; + border-radius: 5px; + font-size: x-large; + color: #${config.lib.stylix.colors.base05} + } + ''; + }; +} diff --git a/users/kaitotlex/desktop-environment/waybar/default.nix b/users/kaitotlex/desktop-environment/waybar/default.nix new file mode 100644 index 0000000..e8b9def --- /dev/null +++ b/users/kaitotlex/desktop-environment/waybar/default.nix @@ -0,0 +1,424 @@ +{ + pkgs, + config, + lib, + osConfig, + ... +}: +let + cfg = config.liminalOS.desktop.waybar; + theme = config.lib.stylix; + palette = theme.colors; +in +{ + options.liminalOS.desktop.waybar = { + enable = lib.mkOption { + type = lib.types.bool; + default = config.liminalOS.desktop.enable; + description = '' + Whether to enable Waybar and the liminalOS rice. + ''; + }; + }; + config = lib.mkIf cfg.enable { + home.packages = with pkgs; [ playerctl ]; + programs.waybar = + let + isDesktop = osConfig.liminalOS.formFactor == "desktop"; + isLaptop = osConfig.liminalOS.formFactor == "laptop"; + in + { + enable = true; + systemd.enable = true; + systemd.target = lib.mkIf config.liminalOS.desktop.hyprland.enable "hyprland-session.target"; + settings.mainBar = { + name = "bar0"; + reload_style_on_change = true; + position = "top"; + layer = "top"; + height = 37; + margin-top = 0; + margin-bottom = 0; + margin-left = 0; + margin-right = 0; + modules-left = + [ + "custom/launcher" + ] + ++ (lib.optionals isDesktop [ + + "custom/playerctl#backward" + "custom/playerctl#play" + "custom/playerctl#foward" + ]) + ++ [ + "custom/playerlabel" + ] + ++ (lib.optionals isLaptop [ + "hyprland/workspaces" + ]); + modules-center = lib.mkIf isDesktop [ + "cava#left" + "hyprland/workspaces" + "cava#right" + ]; + modules-right = [ + "tray" + "battery" + "pulseaudio" + "network" + "clock" + ]; + clock = { + format = " {:%a, %D, %T}"; + tooltip = "true"; + tooltip-format = "{:%Y %B}\n{calendar}"; + format-alt = " {:%d/%m}"; + }; + "hyprland/workspaces" = { + disable-scroll = false; + on-scroll-down = "${pkgs.hyprnome}/bin/hyprnome"; + on-scroll-up = "${pkgs.hyprnome}/bin/hyprnome --previous"; + format = "{icon}"; + on-click = "activate"; + format-icons = { + active = ""; + default = ""; + urgent = ""; + special = "󰠱"; + }; + sort-by-number = true; + }; + "cava#left" = { + framerate = 60; + autosens = 1; + bars = 18; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = false; + bar_delimiter = 0; + monstercat = false; + waves = false; + input_delay = 2; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + "" + ]; + }; + "cava#right" = { + framerate = 60; + autosens = 1; + bars = 18; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = false; + bar_delimiter = 0; + monstercat = false; + waves = false; + input_delay = 2; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + "" + ]; + }; + "custom/playerctl#backward" = { + format = "󰙣 "; + on-click = "playerctl previous"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + }; + "custom/playerctl#play" = { + format = "{icon}"; + return-type = "json"; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + on-click = "playerctl play-pause"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + format-icons = { + Playing = "󰏥 "; + Paused = ""; + Stopped = ""; + }; + }; + "custom/playerctl#foward" = { + format = "󰙡 "; + on-click = "playerctl next"; + on-scroll-up = "playerctl volume .05+"; + on-scroll-down = "playerctl volume .05-"; + }; + "custom/playerlabel" = { + format = "󰎈 {} 󰎈"; + return-type = "json"; + max-length = 40; + exec = "playerctl -a metadata --format '{\"text\": \"{{artist}} - {{markup_escape(title)}}\", \"tooltip\": \"{{playerName}} : {{markup_escape(title)}}\", \"alt\": \"{{status}}\", \"class\": \"{{status}}\"}' -F"; + on-click = ""; + }; + battery = { + states = { + good = 95; + warning = 30; + critical = 15; + }; + format = "{icon} {capacity}%"; + format-charging = " {capacity}%"; + format-plugged = " {capacity}% "; + format-alt = "{icon} {time}"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + }; + + memory = { + format = "󰍛 {}%"; + format-alt = "󰍛 {used}/{total} GiB"; + interval = 5; + }; + cpu = { + format = "󰻠 {usage}%"; + format-alt = "󰻠 {avg_frequency} GHz"; + interval = 5; + }; + network = { + format-wifi = " {signalStrength}%"; + format-ethernet = "󰈀 100% "; + tooltip-format = "Connected to {essid} {ifname} via {gwaddr}"; + format-linked = "{ifname} (No IP)"; + format-disconnected = "󰖪 0% "; + }; + tray = { + icon-size = 20; + spacing = 8; + }; + pulseaudio = { + format = "{icon} {volume}%"; + format-muted = "󰝟"; + format-icons = { + default = [ + "󰕿" + "󰖀" + "󰕾" + ]; + }; + scroll-step = 5; + on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; + }; + "custom/launcher" = + let + toggle-colorscheme = pkgs.writeShellScriptBin "toggle-colorscheme.sh" '' + POLARITY_FILE="/etc/polarity" + + if [[ ! -f "$POLARITY_FILE" ]]; then + exit 0 + elif [[ ! -r "$POLARITY_FILE" ]]; then + echo "Error: Cannot read $POLARITY_FILE. Check permissions." >&2 + exit 1 + fi + + current_scheme=$(cat "$POLARITY_FILE") + if [[ $? -ne 0 ]]; then + echo "Error: Failed to read content from $POLARITY_FILE." >&2 + exit 1 + fi + + current_scheme=$(echo "$current_scheme" | xargs) + + target_service="" + case "$current_scheme" in + dawn) + target_service="colorscheme-dusk.service" + ;; + dusk) + target_service="colorscheme-dawn.service" + ;; + *) + echo "Error: Invalid content '$current_scheme' found in $POLARITY_FILE. Expected 'dawn' or 'dusk'." >&2 + exit 1 + ;; + esac + + echo "Current scheme: '$current_scheme'. Attempting to start '$target_service'..." + systemctl start "$target_service" + + if [[ $? -ne 0 ]]; then + echo "Error: Failed to execute 'systemctl start $target_service'. Check systemctl logs or permissions." >&2 + exit 1 + else + echo "Command 'systemctl start $target_service' executed successfully." + fi + + exit 0 + ''; + in + { + format = ""; + on-click = "pkill -9 rofi || rofi -show drun"; + on-click-right = "${toggle-colorscheme}/bin/toggle-colorscheme.sh"; + tooltip = "false"; + }; + }; + style = + '' + * { + border: none; + border-radius: 0px; + font-family: GeistMono Nerd Font; + font-size: 13px; + min-height: 0; + } + window#waybar { + background: #${palette.base01}; + } + + #cava.left, #cava.right { + background: #${palette.base00}; + margin: 4px; + padding: 6px 16px; + color: #${palette.base00}; + } + #cava.left { + border-radius: 24px 10px 24px 10px; + } + #cava.right { + border-radius: 10px 24px 10px 24px; + } + #workspaces { + background: #${palette.base00}; + color: #${palette.base00} + } + #workspaces button { + padding: 0px 5px; + margin: 0px 3px; + border-radius: 16px; + color: transparent; + background: #${palette.base01}; + transition: all 0.3s ease-in-out; + } + + #workspaces button.active { + background-color: #${palette.base0A}; + color: #${palette.base01}; + border-radius: 16px; + min-width: 50px; + background-size: 400% 400%; + transition: all 0.3s ease-in-out; + } + + #workspaces button:hover { + background-color: #${palette.base05}; + color: #${palette.base01}; + border-radius: 16px; + min-width: 50px; + background-size: 400% 400%; + } + + #tray, #pulseaudio, #network, #battery, + #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward{ + background: #${palette.base00}; + font-weight: bold; + margin: 4px 0px; + } + #tray, #pulseaudio, #network, #battery{ + color: #${palette.base05}; + border-radius: 10px 24px 10px 24px; + padding: 0 20px; + margin-left: 7px; + } + #clock { + color: #${palette.base05}; + background: #${palette.base00}; + border-radius: 0px 0px 0px 40px; + padding: 8px 10px 8px 25px; + margin-left: 7px; + font-weight: bold; + font-size: 14px; + } + #custom-launcher { + color: #${palette.base0A}; + background: #${palette.base00}; + border-radius: 0px 0px 40px 0px; + margin: 0px; + padding: 0px 35px 0px 15px; + font-size: 24px; + } + + #custom-playerctl.backward, #custom-playerctl.play, #custom-playerctl.foward { + background: #${palette.base00}; + font-size: 20px; + } + #custom-playerctl.backward:hover, #custom-playerctl.play:hover, #custom-playerctl.foward:hover{ + color: #${palette.base05}; + } + #custom-playerctl.backward { + color: #${palette.base08}; + border-radius: 24px 0px 0px 10px; + padding-left: 16px; + margin-left: 7px; + } + #custom-playerctl.play { + color: #${palette.base0A}; + padding: 0 5px; + } + #custom-playerctl.foward { + color: #${palette.base08}; + border-radius: 0px 10px 24px 0px; + padding-right: 12px; + margin-right: 7px + } + #custom-playerlabel { + background: #${palette.base00}; + color: #${palette.base05}; + padding: 0 20px; + border-radius: 24px 10px 24px 10px; + margin: 4px 0; + font-weight: bold; + } + #window{ + background: #${palette.base00}; + padding-left: 15px; + padding-right: 15px; + border-radius: 16px; + margin-top: 4px; + margin-bottom: 4px; + font-weight: normal; + font-style: normal; + } + '' + + (lib.optionalString isLaptop '' + #workspaces { + margin: 4px; + padding: 6px 16px; + border-radius: 24px 10px 24px 10px; + } + '') + + (lib.optionalString isDesktop '' + #workspaces { + margin: 4px 5px; + padding: 6px 5px; + border-radius: 16px; + } + ''); + }; + }; +} diff --git a/users/kaitotlex/home.nix b/users/kaitotlex/home.nix index e13837c..d50bd1f 100644 --- a/users/kaitotlex/home.nix +++ b/users/kaitotlex/home.nix @@ -22,6 +22,25 @@ home.packages = with pkgs; [ # here is some command line tools I use frequently # feel free to add your own or remove some of them + #gfortran1 + gqrx + urh + rtl_433 + rng-tools + nheko + openvpn + tor-browser + bambu-studio + gimp3 + openssl + cmake + obs-studio + python312Packages.pip + pipx + rpcs3 + dolphin-emu + affine-bin + elmPackages.elm kicad android-tools wacomtablet @@ -33,7 +52,6 @@ arduino-language-server geoclue2 lua - tetrio-desktop prismlauncher asciiquarium-transparent fortune @@ -80,7 +98,6 @@ sl piper nwg-displays - dolphin xfce.thunar tailwindcss @@ -145,7 +162,7 @@ # productivity glow # markdown previewer in terminal obsidian # markdown previewer - thunderbird-unwrapped # Full Feature Email Client + #thunderbird-unwrapped # Full Feature Email Client #sway Modules swaybg @@ -166,7 +183,6 @@ texlivePackages.csquotes texlivePackages.csquotes-de texlivePackages.collection-latexextra - texpresso btop # replacement of htop/nmon iotop # io monitoring @@ -192,7 +208,6 @@ git-credential-oauth # messaging apps - vesktop signal-desktop gh @@ -200,7 +215,7 @@ netcat nmap metasploit - john + #john lynis hydra-cli #ghidra @@ -215,24 +230,12 @@ extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; }; - programs.rofi = { - enable = true; - cycle = true; - location = "center"; - package = pkgs.rofi-wayland; - }; - - services.dunst.enable = true; + programs.vesktop.enable = true; programs.git = { enable = true; userName = "KaitoTLex"; - userEmail = "wlin@kaitotlex.systems"; - signing = { - signByDefault = true; - key = "2AE6771F14386F9B85E48685A9209668BFA39C0E"; - }; - + userEmail = "renl@kaitotlex.systems"; }; programs.neovim.defaultEditor = true; @@ -244,7 +247,38 @@ enableBashIntegration = true; enableFishIntegration = true; }; - + programs.iamb = { + enable = true; + package = inputs.iamb.packages.${pkgs.stdenv.targetPlatform.system}.default; + settings = { + profiles."matrix.org".user_id = "@kaitotlex:matrix.org"; + settings = { + image_preview = { }; + notifications = { + enabled = true; + show_message = true; + }; + }; + }; + }; + # programs.iamb = { + # enable = true; + # packages = inputs.iamb.packages.${pkgs.stdenv.targetPlatform.system}.default; + # settings = { + # profiles."matrix.org" = { + # user_id = "@kaitotlex:matrix.org"; + # style = "restore"; + # }; + # settings = { + # image_preview = { }; + # image_preview.protocol.type = "kitty"; + # notifications = { + # enabled = true; + # show_message = true; + # }; + # }; + # }; + # }; programs.kitty = { enable = true; settings = { @@ -265,10 +299,10 @@ }; }; - programs.firefox = { - enable = true; - package = pkgs.firefox-devedition; - }; + # programs.firefox = { + # enable = true; + # package = pkgs.firefox-devedition; + # }; programs.ripgrep.enable = true; programs.oh-my-posh = { diff --git a/users/kaitotlex/stylix/default.nix b/users/kaitotlex/stylix/default.nix index 5ad9af1..035671e 100644 --- a/users/kaitotlex/stylix/default.nix +++ b/users/kaitotlex/stylix/default.nix @@ -3,7 +3,9 @@ waybar.enable = false; kitty.variant256Colors = true; neovim.enable = false; - sway.enable = true; - swaylock.enable = true; + hyprland.enable = false; + hyprlock.enable = false; + rofi.enable = false; + swaync.enable = false; }; }