56 Commits
Author SHA1 Message Date
andreas ad17b67774 add better wallpaper engine gui 2026-10-20 22:25:24 +02:00
andreas 6b8778c6be code server 2026-10-20 22:24:54 +02:00
andreas d2b4e9d1f1 WIP 2026-10-17 11:43:55 +02:00
andreas 36fbaf137e Harden RTL8125 recovery checks and reapply EEE settings 2026-10-17 10:04:48 +02:00
andreas 8c2dbe4775 Update RTL8125 driver to 9.018.00 2026-10-17 07:01:38 +02:00
andreas 7c00c133ab transition to nixos stable 2026-10-17 06:50:58 +02:00
andreas 3062ef1608 update millennium 2026-10-15 15:08:12 +02:00
andreas ac7a47c26a module for recovering shitty realtek controller when it gets stuck in bugged power state 2026-10-15 10:48:08 +02:00
andreas 74d3d6870d WIP 2026-10-15 08:52:31 +02:00
andreas ac9eeb1f1c enable millennium for steam 2026-09-30 19:54:22 +02:00
andreas 666b7ab737 move comment to appropriate block 2026-09-30 19:53:54 +02:00
andreas bcfada020b enable distrobox 2026-09-30 19:53:42 +02:00
andreas d79713972e don't disable power saving 2026-09-30 17:53:28 +02:00
andreas 441d029eb6 enable ptyxis terminal on gnome 2026-09-30 17:53:08 +02:00
andreas 17933af881 fix log spam 2026-09-30 15:40:46 +02:00
andreas c4693f0ee6 fix url handlers for steam 2026-09-30 02:27:58 +02:00
andreas 813e474bc1 add wp engine gui 2026-09-28 01:04:34 +02:00
andreas 333bed459d updated config for fresh install 2026-09-19 07:04:41 +02:00
andreas cd454434d7 add gnome compatible wallpaperengine 2026-09-18 12:25:28 +02:00
andreas e89ee3c559 patch low contrast icons 2026-09-18 12:24:49 +02:00
andreas 0dad448f97 WIP 2026-09-16 08:11:52 +02:00
andreas cc0cc15ee5 WIP 2026-09-16 08:11:41 +02:00
andreas 5596fb8a9c remove verbose messaging 2026-09-05 10:14:11 +02:00
andreas dce21780ac cursor patch 2026-09-05 10:12:37 +02:00
andreas 310fc047b2 verbose debug logging 2026-09-04 01:35:39 +02:00
andreas c9725d3b78 mutter tearing patches 2026-09-03 10:10:52 +02:00
andreas 777acf7503 plan 2026-09-03 06:43:34 +02:00
andreas e6fd27f8ee bump and remove GOL 2026-09-03 06:42:53 +02:00
andreas f14680dfbf delete hello test package 2026-09-03 06:19:21 +02:00
andreas ca050d08d3 update package hash 2026-09-03 06:17:32 +02:00
andreas d0f23a0e7f update package hash 2026-09-03 06:17:05 +02:00
andreas 1cdedee438 formatting 2026-09-03 06:16:57 +02:00
andreas eac6e5ca97 fix mullvad on latest nixpkgs 2026-09-03 06:16:41 +02:00
andreas 819cbd3606 fix deprecation warning 2026-09-03 06:16:01 +02:00
andreas 65e6e7f747 enable cinnamon 2026-08-29 00:22:16 +02:00
andreas 36dbc3229d add tigervnc import 2026-08-29 00:22:10 +02:00
andreas 2f3e8c14f2 shader compiler 2026-08-29 00:21:53 +02:00
andreas 14b6e989f6 gnome extensions 2026-08-29 00:21:40 +02:00
andreas 64324ab150 add vscode-modernized 2026-08-29 00:21:23 +02:00
andreas c56a82c0b1 delete mesa-gcc overlay 2026-08-29 00:21:10 +02:00
andreas 9e686b3f8d faugus 2026-08-29 00:20:57 +02:00
andreas a512855fa9 add cinnamon 2026-08-29 00:20:49 +02:00
andreas 4dbe74854f Merge branch 'stableconfig' into trunk 2026-05-30 09:47:56 +02:00
andreas 2a543c6e93 Switch to sddm to fix gdm regression causing plasma x11 to not work properly 2026-05-30 09:47:17 +02:00
andreas 89e04df44a update lock 2026-05-28 17:36:07 +02:00
andreas d0546b20ea remove trilium-next-pr 2026-05-28 17:35:20 +02:00
andreas a652234c7c update flake lock 2026-05-28 17:18:18 +02:00
andreas b867dd12c4 remove unneeded triliumnext flake input 2026-05-28 17:18:12 +02:00
andreas 2fc09a965a upgraded mesa-gcc 2026-05-28 17:17:49 +02:00
andreas e3d7538fa3 "mbedtls" now points to "mbedtls_2", and mbedtls_2 has been removed. Removing overlay. 2026-05-28 17:17:12 +02:00
andreas d64b2f8d6d upgraded mesa with upstream libdrm 2026-05-28 17:16:11 +02:00
andreas 093623dad7 fonts 2026-05-12 23:56:20 +02:00
andreas f6c2c48c7d fonts 2026-05-12 23:56:13 +02:00
andreas b7c6a2fce5 WIP stuff 2026-05-12 23:56:04 +02:00
andreas a692c1353d bump flake and fix problems 2026-05-07 16:58:02 +02:00
andreas 589eefd527 upgrade mesa 2026-05-07 16:57:48 +02:00
29 changed files with 1615 additions and 474 deletions
+102
View File
@@ -0,0 +1,102 @@
## CODE GENERATION INSTRUCTIONS
You are tasked with integrating patches into my kernel to make the tearing protocol work on Wayland with my intel B580.
## THINGS TO DO:
Plan out how you're going to do the following. I will inspect your plan and then authorize it.
- Custom build this MR: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3797
- Fix KDE tearing on Intel Graphics using kernel patches for libdrm. Use these resources to research:
- https://bugs.kde.org/show_bug.cgi?id=520549
- https://gitlab.freedesktop.org/drm/xe/kernel/-/work_items/8597#note_3567675
- https://gitlab.freedesktop.org/drm/i915/kernel/-/work_items/13834 (this one has patches that supposedly fix the problem.)
# Plan here:
- [ ] 1. Record the current package and kernel baselines.
- Evaluate the locked versions of Mutter, GNOME Shell, libdrm, and the selected CachyOS kernel.
- Confirm that the Intel Arc B580 (`8086:e20b`) is using the `xe` driver.
- Save the current working kernel and NixOS generation as the rollback baseline.
- [ ] 2. Pin all experimental upstream sources.
- Pin Mutter merge request !3797 to a specific commit instead of following its branch.
- Record the MR base commit and verify whether it is compatible with the Mutter version in the locked nixpkgs input.
- Identify the exact revisions of the Intel async-flip and `IN_FORMATS_ASYNC` kernel patches referenced by the i915 and Xe work items.
- Use fixed-output hashes for every fetched patch or source archive.
- [ ] 3. Determine which Intel DRM patches are still required.
- Inspect the selected CachyOS kernel source for patches that have already been merged or backported.
- Select only the missing patches needed to expose async-capable formats and prevent unchanged or disabled planes from incorrectly rejecting an async atomic commit.
- Confirm that the selected changes affect the Intel display code shared by `xe` and `i915`, and therefore apply to the B580 even when the original report is filed under i915.
- Document the required patch order and each patch's upstream URL and revision.
- [ ] 4. Add a dedicated, reversible Wayland-tearing overlay or module.
- Keep the experimental Mutter and kernel overrides together in a new, clearly named repository file.
- Scope the override to `drivebystation-nix` where practical.
- Provide a single enable switch or isolated import so the experiment can be disabled without editing generated hardware configuration.
- Preserve all unrelated existing worktree changes.
- [ ] 5. Override Mutter with merge request !3797.
- Prefer applying the pinned MR commits to the nixpkgs Mutter derivation so nixpkgs build flags and dependency wiring are retained.
- If the patch series is incompatible, use the pinned MR source only after confirming its Mutter ABI matches the installed GNOME Shell.
- Verify that libdrm is at least version 2.4.120.
- Ensure GNOME Shell and the display-manager session reference the overridden Mutter rather than merely installing it alongside the stock package.
- Enable the experimental feature with `MUTTER_DEBUG_EXPERIMENTAL_FEATURES=tearing` in the session environment.
- [ ] 6. Override the CachyOS kernel with the selected Intel DRM patches.
- Extend the existing `pkgs.cachyosKernels.linuxPackages-cachyos-latest` kernel derivation rather than replacing it with an unrelated kernel package set.
- Apply the pinned patches in their upstream dependency order.
- Verify that every patch applies cleanly to the exact CachyOS kernel source.
- Keep `boot.extraModulePackages` tied to the patched kernel package set so `r8125` and `v4l2loopback` are rebuilt against the correct kernel.
- Do not modify the generated `hardware-configuration.nix` beyond any unavoidable existing kernel selection; place the override in a maintained host module.
- [ ] 7. Validate the Nix expressions without activating the system.
- Run formatting and syntax checks on every changed Nix file.
- Evaluate the complete `drivebystation-nix` configuration.
- Run `nix flake check` and resolve evaluation failures attributable to these changes.
- Confirm that all sources are pinned and reproducible and that no mutable branch names remain.
- [ ] 8. Build each risky component independently.
- Build the overridden Mutter derivation.
- Build the patched kernel derivation.
- Build the matching `r8125` and `v4l2loopback` modules.
- Inspect the build logs for rejected patches, warnings related to async flips, and ABI mismatches.
- [ ] 9. Build the complete NixOS system before switching.
- Build the `drivebystation-nix` toplevel without activating it.
- Verify that the closure contains the pinned patched Mutter and patched CachyOS kernel.
- Confirm that a previous known-good boot generation remains available.
- [ ] 10. Activate the result safely.
- Use `nixos-rebuild boot` first so the new system is selected only after reboot.
- Reboot into the patched generation and verify the running kernel version and `xe` driver binding.
- If the display fails or the system is unstable, boot the previous generation and disable the experimental module.
- [ ] 11. Verify the kernel DRM capabilities.
- Run `drm_info` and confirm atomic async-page-flip capability is reported.
- Confirm `IN_FORMATS_ASYNC` is populated for supported primary planes.
- Confirm its absence on the cursor plane is handled as expected rather than causing the entire commit to fail.
- Capture a DRM debug log while submitting tearing-enabled fullscreen frames.
- [ ] 12. Test KDE Plasma tearing.
- Enable Plasma's "Allow in fullscreen windows" tearing setting.
- Run a fullscreen tearing-aware game or test client with frame rate above the monitor refresh rate.
- Confirm that KWin's async atomic commits no longer fail with `-EINVAL`.
- Confirm that the previous `cursor A: async flip not supported` and `plane 2A: async flip not supported` errors no longer occur for disabled or unchanged planes.
- Check cursor movement, fullscreen entry and exit, direct scanout, VRR enabled and disabled, and all connected monitors.
- [ ] 13. Test GNOME Mutter tearing.
- Start a GNOME Wayland session and confirm the tearing-control protocol is advertised.
- Run `weston-simple-egl -v -f -t` or an equivalent tearing-aware client.
- Confirm that requested asynchronous flips are accepted and visibly tear when the frame rate exceeds the refresh rate.
- Confirm unsupported async commits fall back to synchronized presentation without breaking the session.
- Test cursor movement, fullscreen transitions, VRR, multiple monitors, and suspend/resume.
- [ ] 14. Document results and removal criteria.
- Record the tested hardware, kernel, Mutter, GNOME Shell, Plasma, and libdrm versions.
- Record the exact patches used and the outcome of both compositor tests.
- Document how to disable the overrides and roll back to the previous generation.
- Note which upstream merge or kernel release will allow each local override to be removed.
+61
View File
@@ -0,0 +1,61 @@
# NixOS configuration
The default package set is NixOS 26.05. Home Manager and AAGL use their
matching 26.05 release branches. `drivebystation-nix` uses the standard
`pkgs.linuxPackages` kernel from stable, including matching external modules.
## Packages from unstable
`inputs.nixpkgs-unstable` is a separate package set, pinned in `flake.lock`.
Select individual applications explicitly, as with Trilium and JetBrains
Toolbox in the desktop host:
```nix
unstablePkgs.trilium-desktop
```
The host defines `unstablePkgs` by importing the separate input with
`allowUnfree = true`. Use `pkgs.<name>` for stable packages. Unstable
applications retain their own dependencies; the system package set stays on
stable.
Update the stable inputs and the application exceptions independently:
```sh
nix flake update nixpkgs home-manager aagl
nix flake update nixpkgs-unstable
```
The existing Mutter tearing override remains experimental. Its compatibility
and B580 graphics behavior require testing when changing the desktop stack.
## Validate and boot
```sh
nix build .#nixosConfigurations.drivebystation-nix.config.system.build.toplevel --no-link
sudo nixos-rebuild boot --flake .#drivebystation-nix
```
Only run the boot command after the build succeeds. Keep the previous working
generation available in the boot menu, then test networking, graphics, and
the webcam loopback after reboot. Git restores configuration sources; booting
the previous generation restores the previous system closure.
Whole-flake checks currently also evaluate an unfinished WSL host referencing
the disabled `nixos-wsl` input. Validate the desktop target directly until that
separate host configuration is repaired.
## Migration validation (2026-10-17)
The complete `drivebystation-nix` system built successfully without activation.
Its closure contains Linux 6.18.56, patched Mutter 50.5, GNOME Shell 50.5,
libdrm 2.4.133, r8125 9.016.01, and v4l2loopback 0.15.3. The explicit unstable
applications are Trilium 0.106.0 and JetBrains Toolbox 3.8.1.88030.
Nix syntax and Git whitespace checks pass. `nix flake check --no-build` stops
at the existing WSL input error described above. The edited Nix files retain
the repository's existing formatting; `nixpkgs-fmt --check` reports formatting
differences, including on the original flake before migration.
Boot, networking, B580 graphics, and tearing behavior still require runtime
testing. The migration does not add Intel tearing kernel patches.
Generated
+531 -258
View File
File diff suppressed because it is too large Load Diff
+33 -24
View File
@@ -3,20 +3,22 @@
inputs = { inputs = {
# nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; # nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # Use nixos-unstable for latest kernel and packages nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05";
nixos-wsl = { # Application exceptions; keep the system and graphics stack on stable.
url = "github:nix-community/NixOS-WSL/main"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
inputs.nixpkgs.follows = "nixpkgs"; # nixos-wsl = {
}; # url = "github:nix-community/NixOS-WSL/main";
# inputs.nixpkgs.follows = "nixpkgs";
# };
# Snowfallorg's Flake utility # Snowfallorg's Flake utility
snowfall-lib = { snowfall-lib = {
url = "github:snowfallorg/lib"; url = "github:snowfallorg/lib";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
game-of-life = { # game-of-life = {
url = "github:local-interloper/game-of-life"; # url = "github:local-interloper/game-of-life";
inputs.nixpkgs.follows = "nixpkgs"; # inputs.nixpkgs.follows = "nixpkgs";
}; # };
# Add sops-nix for secrets management # Add sops-nix for secrets management
sops-nix = { sops-nix = {
url = "github:mic92/sops-nix"; url = "github:mic92/sops-nix";
@@ -27,19 +29,15 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
home-manager = { home-manager = {
url = "github:nix-community/home-manager"; url = "github:nix-community/home-manager/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
trilium-next-pr = {
url = "github:FliegendeWurst/nixpkgs/trilium-next";
# Don't follow nixpkgs as this repo has its own pinned nixpkgs
};
anikki = {
url = "github:Hion-V/Anikki-flake";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# anikki = {
# url = "github:Hion-V/Anikki-flake";
# inputs.nixpkgs.follows = "nixpkgs";
# };
lanzaboote = { lanzaboote = {
url = "github:nix-community/lanzaboote/v0.4.3"; url = "github:nix-community/lanzaboote/v1.1.0";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
# kwin-effects-forceblur = { Archived. # kwin-effects-forceblur = { Archived.
@@ -47,10 +45,23 @@
# inputs.nixpkgs.follows = "nixpkgs"; # inputs.nixpkgs.follows = "nixpkgs";
# }; # };
aagl = { aagl = {
url = "github:ezKEa/aagl-gtk-on-nix"; url = "github:ezKEa/aagl-gtk-on-nix/release-26.05";
inputs.nixpkgs.follows = "nixpkgs";
};
wallpaperengine.url = "github:Hion-V/linux-wallpaperengine/Hion-V/prod";
simple-wallpaper-engine = {
url = "github:Maxnights/simple-linux-wallpaperengine-gui";
inputs.nixpkgs.follows = "nixpkgs";
};
linux-wallpaper-engine.url = "github:jagrat7/linux-wallpaper-engine";
millennium = {
url = "github:SteamClientHomebrew/Millennium?dir=packages/nix";
inputs.nixpkgs.follows = "nixpkgs";
};
codex-desktop = {
url = "github:ilysenko/codex-desktop-linux";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
nix-cachyos-kernel.url = "github:xddxdd/nix-cachyos-kernel/release";
}; };
outputs = inputs: outputs = inputs:
@@ -91,9 +102,7 @@
src = ./.; src = ./.;
overlays = with inputs; [ overlays = with inputs; [
# Use the exact kernel versions as defined in this repo. inputs.millennium.overlays.default
# Guarantees you have binary cache.
nix-cachyos-kernel.overlays.pinned
]; ];
nixos = with inputs; [ nixos = with inputs; [
@@ -6,6 +6,26 @@
}: }:
let let
inherit (lib.my-namespace) enabled; inherit (lib.my-namespace) enabled;
system = pkgs.stdenv.hostPlatform.system;
jagratWallpaperEngine =
(inputs.linux-wallpaper-engine.packages.${system}.default.override {
linux-wallpaperengine = inputs.wallpaperengine.packages.${system}.default;
}).overrideAttrs (old: {
# Forge 7 expects a default export, but the bundled Vite exposes named exports.
preBuild = (old.preBuild or "") + ''
substituteInPlace node_modules/@electron-forge/plugin-vite/dist/VitePlugin.js \
--replace-fail 'const vite_1 = __importDefault(require("vite"));' \
'const vite_1 = { default: require("vite") };'
'';
});
simpleWallpaperEngine =
inputs.simple-wallpaper-engine.packages.${system}.default.override {
# The upstream GUI package otherwise puts nixpkgs' unmodified
# linux-wallpaperengine in its wrapped PATH.
pkgs = pkgs // {
linux-wallpaperengine = inputs.wallpaperengine.packages.${system}.default;
};
};
in in
{ {
imports = [ imports = [
@@ -29,20 +49,28 @@ in
pkgs.hyfetch pkgs.hyfetch
pkgs.libreoffice pkgs.libreoffice
pkgs.localsend pkgs.localsend
simpleWallpaperEngine
# Separate GUI for manual testing; keep the existing GUI's autostart.
jagratWallpaperEngine
# pkgs.vesktop # pkgs.vesktop
pkgs.obsidian pkgs.obsidian
inputs.zen-browser.packages.x86_64-linux.default inputs.zen-browser.packages.x86_64-linux.default
# inputs.kwin-effects-forceblur.packages.${pkgs.stdenv.hostPlatform.system}.default # Archived. # inputs.kwin-effects-forceblur.packages.${pkgs.stdenv.hostPlatform.system}.default # Archived.
]; ];
}; };
xdg.autostart = {
enable = true;
entries = [
"${simpleWallpaperEngine}/share/applications/simple-wallpaper-engine-autostart.desktop"
];
};
# Auto-start linux-wallpaperengine for dual monitors via XDG autostart # Auto-start linux-wallpaperengine for dual monitors via XDG autostart
xdg.configFile."autostart/linux-wallpaperengine.desktop".text = '' # xdg.configFile."autostart/linux-wallpaperengine.desktop".text = ''
[Desktop Entry] # [Desktop Entry]
Type=Application # Type=Application
Name=Wallpaper Engine # Name=Wallpaper Engine
Exec=${pkgs.my-namespace.linux-wallpaperengine}/bin/linux-wallpaperengine --screen-root DP-1 --bg 2935872330 --screen-root DP-2 --bg 2935872330 -f 12 # Exec=${pkgs.my-namespace.linux-wallpaperengine}/bin/linux-wallpaperengine --screen-root DP-1 --bg 2935872330 --screen-root DP-2 --bg 2935872330 -f 12
X-KDE-autostart-after=panel # X-KDE-autostart-after=panel
X-KDE-StartupNotify=false # X-KDE-StartupNotify=false
''; # '';
} }
@@ -5,6 +5,9 @@ let
in { in {
options.${namespace}.desktop-environment = { options.${namespace}.desktop-environment = {
cinnamon = {
enable = lib.mkEnableOption "Cinnamon desktop environment";
};
xfce = { xfce = {
enable = lib.mkEnableOption "XFCE desktop environment"; enable = lib.mkEnableOption "XFCE desktop environment";
}; };
@@ -23,6 +26,16 @@ in {
}; };
config = lib.mkMerge [ config = lib.mkMerge [
(lib.mkIf cfg.xfce.enable {
services.xserver = {
enable = true;
desktopManager = {
cinnamon.enable = true;
};
};
environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR =
lib.mkForce "${pkgs.gnome.nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas";
})
(lib.mkIf cfg.xfce.enable { (lib.mkIf cfg.xfce.enable {
services.xserver = { services.xserver = {
enable = true; enable = true;
@@ -70,9 +83,11 @@ in {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
gnome-tweaks gnome-tweaks
ptyxis
gnome-software gnome-software
gnomeExtensions.pop-shell gnomeExtensions.pop-shell
gnome-remote-desktop gnome-remote-desktop
dconf-editor
glib-networking # Required gnome-remote-desktop dependency glib-networking # Required gnome-remote-desktop dependency
]; ];
systemd.user.services.gnome-remote-desktop.environment = { systemd.user.services.gnome-remote-desktop.environment = {
@@ -96,6 +111,16 @@ in {
(lib.mkIf cfg.kde.enable { (lib.mkIf cfg.kde.enable {
services.xserver.enable = true; services.xserver.enable = true;
services.desktopManager.plasma6.enable = true; services.desktopManager.plasma6.enable = true;
environment.sessionVariables = {
# Forces KWin to use the legacy DRM interface so "Allow Tearing" actually works
# KWIN_DRM_NO_AMS = "1";
# Disables the new triple buffering in Plasma 6.1+ to reduce latency
# KWIN_DRM_DISABLE_TRIPLE_BUFFERING = "1";
# KWIN_USE_HWCURSOR = "0";
# KWIN_DRM_USE_EGL_STREAMS = "0";
# MESA_VK_WSI_PRESENT_MODE = "immediate";
# vblank_mode = "0";
};
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
kdePackages.qtwebsockets kdePackages.qtwebsockets
kdePackages.qtwebchannel kdePackages.qtwebchannel
+21
View File
@@ -0,0 +1,21 @@
{
config,
lib,
pkgs,
namespace,
...
}:
let
cfg = config.${namespace}.distrobox;
in
{
options.${namespace}.distrobox = {
enable = lib.mkEnableOption "Distrobox with a Podman container backend";
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.distrobox ];
virtualisation.podman.enable = true;
};
}
+1 -1
View File
@@ -43,7 +43,7 @@ in
age age
wget wget
sops sops
# bitwarden-desktop #replaced bitwarden bitwarden-desktop #replaced bitwarden
bitwarden-cli bitwarden-cli
cowsay cowsay
remmina remmina
@@ -0,0 +1,58 @@
{ config, lib, pkgs, namespace, ... }:
let
cfg = config.${namespace}.rtl8125-recovery;
recovery = pkgs.writeShellApplication {
name = "rtl8125-recover";
runtimeInputs = with pkgs; [ coreutils gnugrep pciutils ethtool systemd ];
text = builtins.readFile ./recover.sh;
};
in {
options.${namespace}.rtl8125-recovery = {
enable = lib.mkEnableOption "RTL8125 PCI recovery after boot and resume";
pciAddress = lib.mkOption {
type = lib.types.str;
default = "0000:0a:00.0";
description = "PCI address of the onboard RTL8125 controller.";
};
bridgeAddress = lib.mkOption {
type = lib.types.str;
default = "0000:06:03.0";
description = "Immediate parent PCI bridge of the controller.";
};
};
config = lib.mkIf cfg.enable {
systemd.services.rtl8125-recovery = {
description = "Recover RTL8125 from failed PCI power restoration";
wantedBy = [ "multi-user.target" ];
after = [ "NetworkManager.service" ];
environment = {
NIC_PCI = cfg.pciAddress;
NIC_BRIDGE = cfg.bridgeAddress;
};
serviceConfig = {
Type = "oneshot";
ExecStart = lib.getExe recovery;
TimeoutStartSec = "90s";
StateDirectory = "rtl8125-recovery";
StateDirectoryMode = "0700";
UMask = "0077";
};
};
# sleep.target is stopped after resume. Queue recovery separately so its
# grace period does not hold up the sleep transaction or user sessions.
systemd.services.rtl8125-resume = {
description = "Queue RTL8125 recovery after waking";
wantedBy = [ "sleep.target" ];
before = [ "sleep.target" ];
unitConfig.StopWhenUnneeded = true;
serviceConfig = {
Type = "oneshot";
RemainAfterExit = true;
ExecStart = "${pkgs.coreutils}/bin/true";
ExecStop = "${pkgs.systemd}/bin/systemctl --no-block start rtl8125-recovery.service";
};
};
};
}
+98
View File
@@ -0,0 +1,98 @@
# Called once after boot or resume. No network access is required.
set -euo pipefail
nic="/sys/bus/pci/devices/$NIC_PCI"
bridge="/sys/bus/pci/devices/$NIC_BRIDGE"
log() { echo "rtl8125-recovery: $*"; }
disable_eee() {
local netdir
for netdir in "$nic"/net/*; do
[[ -e "$netdir/ifindex" ]] || continue
ethtool --set-eee "$(basename "$netdir")" eee off
done
}
# Let normal PCI and network resume finish before diagnosing anything.
sleep 10
if [[ ! -d "$bridge" ]]; then
log "Parent bridge $NIC_BRIDGE is absent; refusing recovery."
exit 1
fi
if [[ $(cat "$bridge/vendor") != 0x1022 || $(cat "$bridge/device") != 0x43f5 ]]; then
log "Parent bridge identity changed; refusing recovery."
exit 1
fi
if [[ -d "$nic" ]]; then
if [[ $(cat "$nic/vendor") != 0x10ec || $(cat "$nic/device") != 0x8125 ]]; then
log "Device at $NIC_PCI is not an RTL8125; refusing recovery."
exit 1
fi
if [[ $(dirname "$(readlink -f "$nic")") != "$(readlink -f "$bridge")" ]]; then
log "NIC is no longer directly below the configured bridge; refusing recovery."
exit 1
fi
power=$(cat "$nic/power_state")
command=$(timeout 5 setpci -s "$NIC_PCI" COMMAND 2>/dev/null || true)
# Both memory decoding and bus mastering should be enabled on this host.
# Disconnected cables do not disable these PCI command bits.
if [[ "$power" == D0 && "$command" =~ ^[[:xdigit:]]{4}$ && "${command,,}" != ffff ]] &&
(( (16#$command & 6) == 6 )); then
log "PCI state healthy ($power, COMMAND=$command); no recovery needed."
disable_eee
exit 0
fi
# An administratively disabled NIC should not be automatically reset.
netdirs=("$nic"/net/*)
if [[ -e "${netdirs[0]}/flags" ]]; then
flags=$(cat "${netdirs[0]}/flags")
if (( (flags & 1) == 0 )); then
log "Interface is administratively down; leaving it alone."
exit 0
fi
fi
log "Failed PCI state: power=$power COMMAND=$command."
else
log "NIC missing; attempting one rescan of its known bridge."
fi
# Retain evidence from the latest failure without accumulating unlimited logs.
evidence="${STATE_DIRECTORY:-/var/lib/rtl8125-recovery}/last-failure.log"
mkdir -p "$(dirname "$evidence")"
{
date -Is
timeout 5 lspci -s "$NIC_PCI" -vv || true
timeout 5 lspci -s "$NIC_BRIDGE" -vv || true
journalctl -b -k --since '10 minutes ago' -n 250 --no-pager || true
} > "$evidence" 2>&1
# This is the remove/rescan recovery that worked on this machine. Never reset
# or remove the parent bridge, which could affect other hardware.
if [[ -d "$nic" ]]; then
echo 1 > "$nic/remove"
fi
echo 1 > "$bridge/rescan"
for ((attempt=0; attempt<20; attempt++)); do
netdirs=("$nic"/net/*)
if [[ -e "${netdirs[0]}/ifindex" ]]; then
iface=$(basename "${netdirs[0]}")
power=$(cat "$nic/power_state")
command=$(timeout 5 setpci -s "$NIC_PCI" COMMAND 2>/dev/null || true)
if [[ "$power" == D0 && "$command" =~ ^[[:xdigit:]]{4}$ && "${command,,}" != ffff ]] &&
(( (16#$command & 6) == 6 )); then
# NetworkManager also reapplies the saved profile. Explicitly
# restore WoL here so recovery does not depend on its timing.
ethtool -s "$iface" wol g
disable_eee
if ! ethtool "$iface" | grep -Eq '^[[:space:]]*Wake-on: g$'; then
log "PCI recovered, but magic-packet WoL could not be confirmed."
exit 1
fi
log "Recovered $iface in D0; magic-packet WoL enabled. Evidence: $evidence"
exit 0
fi
fi
sleep 1
done
log "Recovery did not restore operational PCI state; no further attempt this invocation."
exit 1
+12 -3
View File
@@ -31,18 +31,26 @@
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
protonup-ng # Tool to install and manage Proton-GE protonup-ng # Tool to install and manage Proton-GE
lutris lutris
faugus-launcher
vkd3d vkd3d
dxvk dxvk
corefonts
protontricks protontricks
mangohud mangohud
vkbasalt vkbasalt
gamescope gamescope
corefonts
]; ];
hardware.uinput.enable = true; hardware.uinput.enable = true;
users.users.andreas.extraGroups = [ "input" ]; users.users.andreas.extraGroups = [ "input" ];
# Explicitly register the desktop MIME scheme handler
xdg.mime = {
enable = true;
defaultApplications = {
"x-scheme-handler/steam" = [ "steam.desktop" ];
"x-scheme-handler/steamlink" = [ "steam.desktop" ];
};
};
programs.gamescope.enable = true; programs.gamescope.enable = true;
programs.steam.gamescopeSession = { programs.steam.gamescopeSession = {
enable = true; enable = true;
@@ -66,9 +74,10 @@
programs.steam = { programs.steam = {
enable = true; enable = true;
package = pkgs.steam.override { package = pkgs.millennium-steam.override {
extraPkgs = pkgs: with pkgs; [ extraPkgs = pkgs: with pkgs; [
gamemode gamemode
noto-fonts-color-emoji
]; ];
extraEnv = { extraEnv = {
# SDL_VIDEODRIVER = "wayland,x11"; # SDL_VIDEODRIVER = "wayland,x11";
-11
View File
@@ -1,11 +0,0 @@
{ ... }:
final: prev: {
mbedtls_2 = prev.mbedtls_2.overrideAttrs (oldAttrs: {
doCheck = false; # Skip failing PSA crypto tests
});
haxe = prev.haxe.overrideAttrs (oldAttrs: {
buildInputs = (oldAttrs.buildInputs or []) ++ [ final.mbedtls_2 ];
});
}
-38
View File
@@ -1,38 +0,0 @@
{ ... }:
final: prev: {
mesa = (prev.mesa.overrideAttrs (old: rec {
version = "git-unstable-2026-04-02";
src = prev.fetchFromGitLab {
domain = "gitlab.freedesktop.org";
owner = "mesa";
repo = "mesa";
rev = "72e9f9a760a5dd81a74497f1daef054af1b6b827";
hash = "sha256-81V5RdLSLYeGJ/wh5H8L6vq+QdR6yMkJxDV+6Yf5FPk=";
};
patches = [];
buildInputs = old.buildInputs ++ (with prev.llvmPackages_21; [
clang-unwrapped
libclang
]);
# Create symlinks to clang libraries so meson can find them
preConfigure = (old.preConfigure or "") + ''
mkdir -p $NIX_BUILD_TOP/clang-libs
for lib in ${prev.llvmPackages_21.clang-unwrapped.lib}/lib/*.a; do
ln -sf "$lib" "$NIX_BUILD_TOP/clang-libs/"
done
export LIBRARY_PATH="$NIX_BUILD_TOP/clang-libs:''${LIBRARY_PATH:-}"
export CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"
'';
mesonFlags =
(builtins.filter (flag:
!(prev.lib.hasPrefix "-Dclang-libdir=" flag) &&
flag != "--sysconfdir=/etc"
) old.mesonFlags) ++ [
"-Dsysconfdir=${placeholder "out"}/etc"
] ++ (if prev.stdenv.hostPlatform.is64bit then [ "-Dintel-rt=enabled" ] else [ "-Dintel-rt=disabled" ]);
}));
}
@@ -0,0 +1,7 @@
{ ... }:
final: prev: {
openldap = prev.openldap.overrideAttrs {
doCheck = !prev.stdenv.hostPlatform.isi686;
};
}
+105
View File
@@ -0,0 +1,105 @@
# overlays/vscode-modernized/default.nix
{ ... }:
final: prev:
let
modernized = prev.fetchFromGitHub {
owner = "Sukarth";
repo = "VS-Code-Modernized";
# Pin this once working.
rev = "main";
hash = "sha256-QSmdmCoF2L42ZUxYpJXq6REOdNObK9DBI6c0GEQ32rQ=";
};
injectModernized = vscodePkg:
vscodePkg.overrideAttrs (old: {
postInstall = (old.postInstall or "") + ''
(
set -euo pipefail
candidates=(
"$out/lib/vscode/resources/app/out/vs/code/electron-sandbox/workbench/workbench.html"
"$out/lib/vscode/resources/app/out/vs/code/electron-sandbox/workbench/workbench.esm.html"
"$out/lib/vscode/resources/app/out/vs/code/electron-browser/workbench/workbench.html"
"$out/lib/vscode/resources/app/out/vs/code/electron-browser/workbench/workbench.esm.html"
)
workbench=""
for candidate in "''${candidates[@]}"; do
if [ -f "$candidate" ]; then
workbench="$candidate"
break
fi
done
if [ -z "$workbench" ]; then
echo "VS Code Modernized: could not find workbench.html" >&2
find "$out/lib/vscode/resources/app/out/vs" -name 'workbench*.html' -print >&2 || true
exit 1
fi
# Build one self-contained CSS file.
cat > /tmp/vscode-modernized-inline.css <<'EOF'
/* VS Code Modernized dynamic settings */
:root {
--vscode-modernized-spacing: 0.35rem;
--vscode-modernized-border-radius: 0.5rem;
--vscode-modernized-tab-spacing: 0.2rem;
}
EOF
cat "${modernized}/styles/styles.css" >> /tmp/vscode-modernized-inline.css
# Smoke-test styles. Remove later if you want.
cat >> /tmp/vscode-modernized-inline.css <<'EOF'
/* Modernized dims inactive icons to 20%; let the theme control contrast instead. */
.monaco-workbench .part.activitybar .monaco-action-bar .action-item.icon:not(.disabled) {
opacity: 1;
}
/* Nix smoke test: these should be very visible */
.monaco-workbench .part.sidebar,
.monaco-workbench .part.auxiliarybar,
.monaco-workbench .part.panel,
.monaco-workbench .editor-group-container,
.monaco-workbench .tabs-container,
.monaco-workbench .tab,
.monaco-workbench .monaco-list-row,
.monaco-workbench .quick-input-widget {
border-radius: var(--vscode-modernized-border-radius) !important;
overflow: hidden !important;
}
.monaco-workbench .part.sidebar,
.monaco-workbench .part.panel,
.monaco-workbench .editor-group-container {
margin: var(--vscode-modernized-spacing) !important;
}
EOF
css="$(sed \
-e 's/&/\&amp;/g' \
-e 's/</\&lt;/g' \
-e 's/>/\&gt;/g' \
/tmp/vscode-modernized-inline.css)"
inject="
<!-- VS Code Modernized - Nix injected -->
<style id=\"vscode-modernized-nix\">
$css
</style>
<!-- /VS Code Modernized - Nix injected -->
"
substituteInPlace "$workbench" \
--replace-fail '</html>' "$inject
</html>"
)
'';
});
in
{
vscode-modernized = injectModernized prev.vscode;
}
+1 -1
View File
@@ -16,7 +16,7 @@ let
hash = "sha256-REEhqvfYSKD7EyIYJVlbkQu0h5FZcofc8X7Zhu1xZnA="; # You need to add the hash after first build attempt hash = "sha256-REEhqvfYSKD7EyIYJVlbkQu0h5FZcofc8X7Zhu1xZnA="; # You need to add the hash after first build attempt
}; };
appimageContents = appimageTools.extractType2 { appimageContents = appimageTools.extract {
inherit pname version src; inherit pname version src;
}; };
in in
-69
View File
@@ -1,69 +0,0 @@
{
# Snowfall Lib provides a customized `lib` instance with access to your flake's library
# as well as the libraries available from your flake's inputs.
lib,
# You also have access to your flake's inputs.
inputs,
# The namespace used for your flake, defaulting to "internal" if not set.
namespace,
# All other arguments come from NixPkgs. You can use `pkgs` to pull packages or helpers
# programmatically or you may add the named attributes as arguments here.
stdenv,
fetchurl,
nixos,
callPackage,
testers,
versionCheckHook,
hello,
...
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hello";
version = "2.12.1";
src = fetchurl {
url = "mirror://gnu/hello/hello-${finalAttrs.version}.tar.gz";
hash = "sha256-jZkUKv2SV28wsM18tCqNxoCZmLxdYH2Idh9RLibH2yA=";
};
# The GNU Hello `configure` script detects how to link libiconv but fails to actually make use of that.
# Unfortunately, this cannot be a patch to `Makefile.am` because `autoreconfHook` causes a gettext
# infrastructure mismatch error when trying to build `hello`.
env = lib.optionalAttrs stdenv.hostPlatform.isDarwin {
NIX_LDFLAGS = "-liconv";
};
doCheck = true;
doInstallCheck = true;
nativeInstallCheckInputs = [
versionCheckHook
];
# Give hello some install checks for testing purpose.
postInstallCheck = ''
stat "''${!outputBin}/bin/${finalAttrs.meta.mainProgram}"
'';
passthru.tests = {
version = testers.testVersion { package = hello; };
};
passthru.tests.run = callPackage ./test.nix { hello = finalAttrs.finalPackage; };
meta = {
description = "Program that produces a familiar, friendly greeting";
longDescription = ''
GNU Hello is a program that prints "Hello, world!" when you run it.
It is fully customizable.
'';
homepage = "https://www.gnu.org/software/hello/manual/";
changelog = "https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${finalAttrs.version}";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [ stv0g ];
mainProgram = "hello";
platforms = lib.platforms.all;
};
})
-8
View File
@@ -1,8 +0,0 @@
{ runCommand, hello }:
runCommand "hello-test-run" {
nativeBuildInputs = [ hello ];
} ''
diff -U3 --color=auto <(hello) <(echo 'Hello, world!')
touch $out
''
+89
View File
@@ -0,0 +1,89 @@
{
lib,
stdenv,
fetchFromGitHub,
meson,
ninja,
pkg-config,
gobject-introspection,
glib,
gnome,
mutter,
cairo,
gsettings-desktop-schemas,
wayland,
libglvnd,
libxfixes,
libxi,
atk,
libxkbcommon,
clutter,
cmake,
gnome-shell,
lcms2,
}:
stdenv.mkDerivation {
pname = "gnome-rounded-blur";
version = "unstable-2026-06-11";
src = fetchFromGitHub {
owner = "kancko";
repo = "gnome-rounded-blur";
# Replace this with a fixed commit.
rev = "master";
# Run once with lib.fakeHash, then replace with the real hash.
hash = "sha256-MBeb0/Drt0UQ/K8UaW93ae9OaV3L5nhFZB2tPwj47co=";
};
nativeBuildInputs = [
meson
ninja
pkg-config
gobject-introspection
cmake
];
buildInputs = [
glib
mutter
cairo
gsettings-desktop-schemas
wayland
libglvnd
libxfixes
libxi
atk
libxkbcommon
clutter
(lib.getDev mutter)
(lib.getLib mutter)
(lib.getDev gnome-shell)
(lib.getLib gnome-shell)
lcms2 # required by mutter-clutter
];
postFixup = ''
for libfile in $out/lib/libblur-effect-1.0.so*; do
if [ -f "$libfile" ] && [ ! -L "$libfile" ]; then
patchelf --set-rpath "${
lib.makeLibraryPath [
glib
wayland
(lib.getLib mutter)
]
}:$out/lib" "$libfile"
fi
done
'';
# The upstream meson file installs:
# - libblur-effect-1.0.so*
# - Blur-1.0.gir
# - Blur-1.0.typelib
# See src/meson.build.
meta = {
description = "Rounded blur GObject library for GNOME Shell extensions";
homepage = "https://github.com/kancko/gnome-rounded-blur";
license = lib.licenses.gpl3Plus;
platforms = lib.platforms.linux;
};
}
+53
View File
@@ -0,0 +1,53 @@
{
lib,
stdenvNoCC,
fetchFromGitHub,
glib,
}:
stdenvNoCC.mkDerivation rec {
pname = "rounded-windows-bms";
version = "2.2.0-bms-fix";
src = fetchFromGitHub {
owner = "MeguMario";
repo = "rounded-windows";
rev = "bms-fix";
# Put a fake hash first; Nix will tell you the real one.
hash = "sha256-5llnqW1dK3jsMRfvxb1VrSkZ/DSXsfU3PiNmpbb5CLw=";
};
nativeBuildInputs = [
glib
];
installPhase = ''
runHook preInstall
uuid="rounded-windows@marcosgt.github.io"
extension_dir="$out/share/gnome-shell/extensions/$uuid"
mkdir -p "$extension_dir"
cp metadata.json extension.js effect.js prefs.js stylesheet.css "$extension_dir/"
mkdir -p "$extension_dir/schemas"
cp schemas/*.xml "$extension_dir/schemas/"
glib-compile-schemas "$extension_dir/schemas"
runHook postInstall
'';
passthru = {
extensionUuid = "rounded-windows@marcosgt.github.io";
};
meta = {
description = "Rounded Window Corners GNOME extension with Blur-My-Shell compatibility fix";
homepage = "https://github.com/MeguMario/rounded-windows/tree/bms-fix";
license = lib.licenses.gpl3Only;
platforms = lib.platforms.linux;
};
}
@@ -0,0 +1,17 @@
{ ... }:
{
services.code-server = {
enable = true;
user = "andreas";
group = "users";
host = "0.0.0.0";
port = 1337;
auth = "password";
hashedPassword = "$argon2i$v=19$m=4096,t=3,p=1$Njl5em15cVdqMVluSWJneWp4OUhObGgxZ0tnPQ$1AAVNLuuKv5qyno40QAxFVPeAydY+8XkEVovKYrkJN0";
disableTelemetry = true;
disableUpdateCheck = true;
};
networking.firewall.allowedTCPPorts = [ 1337 ];
}
@@ -10,9 +10,13 @@
{ {
imports = [ imports = [
./code-server.nix
./tigervnc.nix
./hardware/hardware-configuration.nix ./hardware/hardware-configuration.nix
./hardware/realtek-r8125.nix
]; ];
# Bootloader. # Bootloader.
# boot.loader.systemd-boot.enable = true; # managed by lanzaboote # boot.loader.systemd-boot.enable = true; # managed by lanzaboote
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
@@ -44,14 +48,41 @@
LC_TELEPHONE = "nl_NL.UTF-8"; LC_TELEPHONE = "nl_NL.UTF-8";
LC_TIME = "nl_NL.UTF-8"; LC_TIME = "nl_NL.UTF-8";
}; };
system.activationScripts."stremio-mpv-flatpak-patch" = {
text = ''
# 1. Provide the symlink where Stremio's player engine queries
mkdir -p /usr/bin
ln -sf /run/current-system/sw/bin/mpv /usr/bin/mpv
# 2. Locate and patch the runtime server.js file inside the active Flatpak installation
TARGET_FILE="/var/lib/flatpak/app/com.stremio.Stremio/current/active/files/opt/stremio/server.js"
if [ -f "$TARGET_FILE" ]; then
# Make sure the file is writable momentarily for the patch
chmod +w "$TARGET_FILE"
# Inject the flatpak-spawn sequence into the linux player profile
sed -i 's|linux:{path:\["\/usr\/bin\/mpv"\]|linux:{path:["/usr/bin/flatpak-spawn"],args:["--host","/usr/bin/mpv"]|g' "$TARGET_FILE"
sed -i 's|linux:{path:\["mpv"\]|linux:{path:["/usr/bin/flatpak-spawn"],args:["--host","/usr/bin/mpv"]|g' "$TARGET_FILE"
# Restore permissions
chmod -w "$TARGET_FILE"
fi
'';
};
services = { services = {
# Enable Gnome Session # Enable Gnome Session
displayManager.gdm.enable = true; displayManager.gdm.enable = true;
displayManager.sddm.enable = false; displayManager.sddm.enable = false;
displayManager.sddm.wayland.enable = false; # displayManager.sddm.wayland.enable = true;
displayManager.autoLogin = {
enable = false;
user = "andreas";
};
displayManager.cosmic-greeter.enable = false; displayManager.cosmic-greeter.enable = false;
displayManager.defaultSession = "gnome"; displayManager.defaultSession = "gnome";
# Clear the sandbox restriction dynamically
xserver = { xserver = {
enable = true; # Enable the deprecated X11 teletype terminal connection system. enable = true; # Enable the deprecated X11 teletype terminal connection system.
@@ -234,10 +265,47 @@
} }
]; ];
}; };
services.mullvad-vpn.enable = true;
services.mullvad-vpn.package = pkgs.mullvad-vpn; services.mullvad-vpn = {
# Or disable the firewall altogether. enable = true;
# networking.firewall.enable = false; package = pkgs.mullvad-vpn;
};
fonts = {
packages = with pkgs; [
noto-fonts
noto-fonts-color-emoji
];
fontconfig = {
enable = true;
defaultFonts = {
sansSerif = [ "DejaVu Sans" "Noto Color Emoji" ];
serif = [ "DejaVu Serif" "Noto Color Emoji" ];
monospace = [ "DejaVu Sans Mono" "Noto Color Emoji" ];
emoji = [ "Noto Color Emoji" ];
};
};
};
# services.xrdp = {
# enable = true;
# openFirewall = true;
# defaultWindowManager = "cinnamon-session";
# };
### tigervnc
services.tigervnc = {
enable = false;
users = {
andreas = {
localhost = false; # true for SSH-only
};
};
};
### tigervnc END
# This value determines the NixOS release from which the default # This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions # settings for stateful data, like file locations and database versions
@@ -245,6 +313,6 @@
# this value at the release version of the first install of this system. # this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option # Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "24.05"; # Did you read the comment? system.stateVersion = "26.05"; # Did you read the comment?
} }
@@ -29,31 +29,43 @@ let
# inherit (lib.my-namespace) systemPackages; # inherit (lib.my-namespace) systemPackages;
inherit pkgs; inherit pkgs;
installedPackages = lib.my-namespace.mkPackages pkgs; installedPackages = lib.my-namespace.mkPackages pkgs;
# Explicit application exceptions; all other packages use stable pkgs.
unstablePkgs = import inputs.nixpkgs-unstable {
system = pkgs.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
in in
{ {
# inherit system; # inherit system;
imports = [ imports = [
./configuration.nix ./configuration.nix
./mutter-tearing.nix
./video.nix ./video.nix
inputs.wallpaperengine.nixosModules.default
inputs.aagl.nixosModules.default inputs.aagl.nixosModules.default
]; ];
config = { config = {
system.stateVersion = "24.05"; programs.linux-wallpaperengine.enable = true;
system.stateVersion = "26.05";
nix.settings.experimental-features = [ "nix-command" "flakes" ]; nix.settings.experimental-features = [ "nix-command" "flakes" ];
# Define a user account. Don't forget to set a password with ‘passwd’. # Distrobox
my-namespace.distrobox.enable = true;
# Desktops # Desktops
my-namespace.desktop-environment.xfce.enable = true; my-namespace.desktop-environment.cinnamon.enable = true;
my-namespace.desktop-environment.xfce.enable = false;
my-namespace.desktop-environment.gnome.enable = true; my-namespace.desktop-environment.gnome.enable = true;
my-namespace.desktop-environment.kde.enable = true; my-namespace.desktop-environment.kde.enable = false;
my-namespace.desktop-environment.hyprland.enable = true; my-namespace.desktop-environment.hyprland.enable = false;
my-namespace.desktop-environment.cosmic.enable = true; my-namespace.desktop-environment.cosmic.enable = false;
my-namespace.performance-tuning.enable = true; my-namespace.performance-tuning.enable = true;
my-namespace.rtl8125-recovery.enable = true;
my-namespace.file-organization.enable = true; my-namespace.file-organization.enable = true;
# GNOME-keyring # GNOME-keyring
my-namespace.gnome-keyring.enable = true; my-namespace.gnome-keyring.enable = true;
# CS Tools # CS Tools
my-namespace.cs-tools.enable = true; my-namespace.cs-tools.enable = true;
# Define a user account. Don't forget to set a password with ‘passwd’.
users.users.andreas = { users.users.andreas = {
isNormalUser = true; isNormalUser = true;
description = "Andreas Schaafsma"; description = "Andreas Schaafsma";
@@ -67,28 +79,36 @@ in
]; ];
packages = with pkgs; [ packages = with pkgs; [
# Packages from inputsq # Packages from inputsq
inputs.game-of-life.packages.x86_64-linux.default # inputs.game-of-life.packages.x86_64-linux.default
inputs.zen-browser.packages.x86_64-linux.default inputs.zen-browser.packages.x86_64-linux.default
inputs.trilium-next-pr.legacyPackages.x86_64-linux.trilium-next-desktop # inputs.anikki.packages.x86_64-linux.default
inputs.anikki.packages.x86_64-linux.default
# We want flatpak support # We want flatpak support
flatpak flatpak
# GNOME shit # GNOME shit
thunderbird thunderbird
soundwireserver soundwireserver
vscode # vscode
# discord
spotify spotify
appimage-run appimage-run
prismlauncher #replaces broken minecraft package prismlauncher #replaces broken minecraft package
trilium-desktop unstablePkgs.trilium-desktop
terraform terraform
virt-manager virt-manager
nil nil
codex
inputs.codex-desktop.packages.${pkgs.stdenv.hostPlatform.system}.codex-desktop
# thunderbird # thunderbird
]; ];
}; };
programs.appimage = {
enable = true;
binfmt = true;
};
programs.anime-game-launcher.enable = true; # Adds launcher and /etc/hosts rules programs.anime-game-launcher.enable = true; # Adds launcher and /etc/hosts rules
programs.anime-games-launcher.enable = true; programs.anime-games-launcher.enable = true;
@@ -100,16 +120,22 @@ in
# Open ports in the firewall. # Open ports in the firewall.
networking.firewall.allowedTCPPorts = [ networking.firewall.allowedTCPPorts = [
59010 #SoundWireServer 59010 #SoundWireServer
5901
5001
11434
3389 #RDP 3389 #RDP
22 #ssh 22 #ssh
]; ];
networking.firewall.allowedUDPPorts = [ networking.firewall.allowedUDPPorts = [
59010 #SoundWireServer 59010 #SoundWireServer
5901
5001
11434
3389 #RDP 3389 #RDP
22 #ssh 22 #ssh
]; ];
# Or disable the firewall altogether. # Or disable the firewall altogether.
# networking.firewall.enable = false; networking.firewall.enable = false;
# Install firefox. # Install firefox.
@@ -117,6 +143,22 @@ in
nixpkgs.config.allowBroken = true; nixpkgs.config.allowBroken = true;
powerManagement.cpuFreqGovernor = "performance"; powerManagement.cpuFreqGovernor = "performance";
# Set up system Packages # Set up system Packages
environment.sessionVariables.GI_TYPELIB_PATH =
lib.makeSearchPath "lib/girepository-1.0" [
pkgs.my-namespace.rounded-blur
];
environment.sessionVariables = {
# If you are using Hyprland, labwc, or Sway (wlroots-based):
WLR_DRM_NO_ATOMIC = "1";
KWIN_DRM_DISABLE_TRIPLE_BUFFERING="1";
# If you are using KDE Plasma (KWin):
KWIN_FORCE_SW_CURSOR = "1";
# For modern wlroots (and Aquamarine in Hyprland) to force software cursors:
WLR_NO_HARDWARE_CURSORS = "1";
};
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
git git
wine wine
@@ -127,8 +169,13 @@ in
synergy synergy
mangohud mangohud
my-namespace.udev-steelseries my-namespace.udev-steelseries
my-namespace.hello
my-namespace.linux-wallpaperengine my-namespace.linux-wallpaperengine
my-namespace.rounded-blur
my-namespace.rounded-windows-bms
my-namespace.cs-demo-manager
vscode-modernized
zed-editor
unstablePkgs.jetbrains-toolbox
(pkgs.writeShellScriptBin "switch-to-desktop" '' (pkgs.writeShellScriptBin "switch-to-desktop" ''
#!/bin/sh #!/bin/sh
@@ -190,9 +237,9 @@ in
# Disable the GNOME3/GDM auto-suspend feature that cannot be disabled in GUI! # Disable the GNOME3/GDM auto-suspend feature that cannot be disabled in GUI!
# If no user is logged in, the machine will power down after 20 minutes. # If no user is logged in, the machine will power down after 20 minutes.
systemd.targets.sleep.enable = false; # systemd.targets.sleep.enable = false;
systemd.targets.suspend.enable = false; # systemd.targets.suspend.enable = false;
systemd.targets.hibernate.enable = false; # systemd.targets.hibernate.enable = false;
systemd.targets.hybrid-sleep.enable = false; # systemd.targets.hybrid-sleep.enable = false;
}; };
} }
@@ -39,6 +39,7 @@
intel-vaapi-driver # fallback intel-vaapi-driver # fallback
intel-compute-runtime # OpenCL/Level Zero intel-compute-runtime # OpenCL/Level Zero
level-zero # Level Zero API for compute level-zero # Level Zero API for compute
intel-graphics-compiler # Shader compiler for Arc GPUs allgedly needed for XPU
]; ];
}; };
@@ -127,6 +128,13 @@
clinfo clinfo
vulkan-tools vulkan-tools
]; ];
services.xserver.config = ''
Section "Device"
Identifier "AMD"
Driver "amdgpu"
Option "TearFree" "false"
EndSection
'';
services.xserver.deviceSection = '' services.xserver.deviceSection = ''
Option "TearFree" "false" Option "TearFree" "false"
''; '';
@@ -14,11 +14,7 @@
./acer-monitor-edid.nix ./acer-monitor-edid.nix
./samsung-monitor-edid.nix ./samsung-monitor-edid.nix
]; ];
# boot.kernelPackages = pkgs.linuxPackages_latest;
boot.kernelPackages = pkgs.cachyosKernels.linuxPackages-cachyos-latest;
hardware.enableRedistributableFirmware = true; hardware.enableRedistributableFirmware = true;
# boot.kernelPackages = pkgs.linuxKernel.packages.linux_xanmod_latest;
# boot.kernelPackages = pkgs.linuxPackages;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
boot.kernelModules = [ "kvm-amd" "r8125" "4vl2loopback" ]; boot.kernelModules = [ "kvm-amd" "r8125" "4vl2loopback" ];
@@ -26,30 +22,23 @@
boot.supportedFilesystems = [ "ntfs" ]; boot.supportedFilesystems = [ "ntfs" ];
boot.blacklistedKernelModules = [ "r8169" ]; boot.blacklistedKernelModules = [ "r8169" ];
systemd.services.disable-realtek-eee = {
description = "Disable Realtek Energy Efficient Ethernet";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
serviceConfig = {
Type = "oneshot"; fileSystems."/" =
ExecStart = "${pkgs.ethtool}/bin/ethtool --set-eee enp10s0 eee off"; { device = "/dev/disk/by-uuid/31fe479a-f4ef-4ee5-9cd9-d43ed1a3c88b";
RemainAfterExit = true; fsType = "ext4";
}; };
};
fileSystems."/boot" =
{ device = "/dev/disk/by-uuid/646A-D107";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
fileSystems."/" = { fileSystems."/home" =
device = "/dev/disk/by-uuid/563805a1-5277-4488-bbdd-c1a7ed37be76"; { device = "/dev/disk/by-uuid/6ac4f42b-09e3-43b3-8215-8ff9a3c0695e";
fsType = "ext4"; fsType = "ext4";
}; };
fileSystems."/boot" = {
#device = "/dev/disk/by-uuid/E846-D998";
device = "/dev/disk/by-uuid/19BE-8BAA";
fsType = "vfat";
options = [ "fmask=0077" "dmask=0077" ];
};
# Mount ntfs partition # Mount ntfs partition
# fileSystems."/run/media/627C3BDF7C3BAD23" = { # fileSystems."/run/media/627C3BDF7C3BAD23" = {
@@ -80,10 +69,10 @@
swapDevices = [ { swapDevices = [ {
device = "/var/lib/swapfile"; device = "/var/lib/swapfile";
size = 32*1024; size = 32*1024;
} ]; #resume-offset = 78399488 } ]; #resume-offset = 195323904
boot.resumeDevice = "/dev/disk/by-uuid/563805a1-5277-4488-bbdd-c1a7ed37be76"; # the unlocked drive mapping boot.resumeDevice = "/dev/disk/by-uuid/31fe479a-f4ef-4ee5-9cd9-d43ed1a3c88b"; # the unlocked drive mapping
boot.kernelParams = [ boot.kernelParams = [
"resume_offset=78399488" #sudo filefrag -v /var/lib/swapfile|awk 'NR==4{gsub(/\./,"");print $4;}' "resume_offset=195323904" #sudo filefrag -v /var/lib/swapfile|awk 'NR==4{gsub(/\./,"");print $4;}'
"r8125.aspm=0" # realtek network adapter fix "r8125.aspm=0" # realtek network adapter fix
]; ];
security.protectKernelImage = false; security.protectKernelImage = false;
@@ -0,0 +1,22 @@
{ pkgs, ... }:
{
# Keep the vendor driver tied to this host's selected kernel, including its
# build dependencies and module installation path supplied by nixpkgs.
boot.kernelPackages = pkgs.linuxPackages.extend (_final: prev: {
r8125 = prev.r8125.overrideAttrs {
version = "9.018.00";
# The mirror's top-level wrapper overrides BASEDIR with /lib/modules.
# Build in src directly so nixpkgs' kernel path reaches kbuild.
buildFlags = [ "-C" "src" "modules" ];
# Realtek's release mirrored by the DKMS maintainer. Pin the source rather
# than running the vendor installer or following a mutable branch.
src = pkgs.fetchFromGitHub {
owner = "awesometic";
repo = "realtek-r8125-dkms";
rev = "9a152bf920334aead090d2fb4d91f67a84923123"; # 9.018.00-1
hash = "sha256-yeQsyraNrms1Txm7ZAKeiPfF0tfN6WSHUo5DnvfFosw=";
};
};
});
}
@@ -0,0 +1,36 @@
diff --git a/src/meson.build b/src/meson.build
--- a/src/meson.build
+++ b/src/meson.build
@@ -1077,5 +1077,6 @@ wayland_protocols = [
['single-pixel-buffer', 'staging', 1, ],
['tablet', 'stable', 2, ],
+ ['tearing-control', 'staging', 1, ],
['text-input-unstable-v3', 'private', ],
['viewporter', 'stable', ],
['xdg-activation', 'staging', 1, ],
diff --git a/src/wayland/meta-wayland-dma-buf.c b/src/wayland/meta-wayland-dma-buf.c
--- a/src/wayland/meta-wayland-dma-buf.c
+++ b/src/wayland/meta-wayland-dma-buf.c
@@ -630,11 +630,22 @@ has_modifier (GArray *modifiers,
}
#ifdef HAVE_NATIVE_BACKEND
+static gboolean
+async_supports_modifier (MetaKmsPlane *plane,
+ uint32_t drm_format,
+ uint64_t drm_modifier)
+{
+ GArray *async_modifiers =
+ meta_kms_plane_get_async_modifiers_for_format (plane, drm_format);
+ return async_modifiers && has_modifier (async_modifiers, drm_modifier);
+}
+
static gboolean
crtc_supports_modifier (MetaCrtcKms *crtc_kms,
uint32_t drm_format,
- uint64_t drm_modifier)
+ uint64_t drm_modifier,
+ gboolean is_async)
{
MetaKmsPlane *plane = meta_crtc_kms_get_assigned_primary_plane (crtc_kms);
GArray *crtc_modifiers;
@@ -0,0 +1,59 @@
{ lib, pkgs, ... }:
let
# GNOME/mutter!3797, pinned because the MR is still under development.
mutterTearingRevision = "a8d56d423edde9e6d76f6b9cab663d82c65cf1a2";
mutterTearingPatch = pkgs.fetchurl {
url = "https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3797.diff";
hash = "sha256-3up5PsHX+BSQRKb9JS5bnJLPaTGmvV55M18tKkepIng=";
};
in
{
nixpkgs.overlays = [
(final: prev: {
mutter = prev.mutter.overrideAttrs (old: {
pname = "mutter-tearing";
# nixpkgs leaves Mutter's verbose topics compiled out by default.
# This is required for MUTTER_DEBUG=kms to emit the async commit flags.
mesonFlags = (old.mesonFlags or [ ]) ++ [ ];
# The MR currently targets Mutter 51. Apply it to the packaged Mutter
# 50 source, then resolve the four small context conflicts separately.
prePatch = ''
${old.prePatch or ""}
set +e
patch --batch -p1 --forward < ${mutterTearingPatch}
mr_status=$?
set -e
if [ "$mr_status" -ne 0 ]; then
reject_count="$(find . -name '*.rej' -type f | wc -l)"
if [ "$reject_count" -ne 3 ]; then
echo "Unexpected number of Mutter !3797 rejects: $reject_count" >&2
exit 1
fi
fi
patch --batch -p1 --forward < ${./mutter-50-tearing-compat.patch}
find . -name '*.rej' -type f -delete
'';
passthru = (old.passthru or { }) // {
tearingMr = 3797;
tearingRevision = mutterTearingRevision;
};
});
})
];
environment.sessionVariables = {
# Mutter keeps tearing support behind an experimental runtime switch.
MUTTER_DEBUG_EXPERIMENTAL_FEATURES = lib.mkDefault "tearing";
# Temporarily expose whether async atomic commits reach KMS or fall back
# to synchronized presentation. Remove this after collecting the log.
# MUTTER_DEBUG = lib.mkDefault "kms";
};
}
@@ -0,0 +1,83 @@
{ config, pkgs, lib, ... }:
let
cfg = config.services.tigervnc;
in
{
options.services.tigervnc = {
enable = lib.mkEnableOption "TigerVNC x0vncserver (mirrors :0)";
users = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: {
options = {
enableSharing = lib.mkOption { type = lib.types.bool; default = true; };
port = lib.mkOption { type = lib.types.int; default = 5901; };
localhost = lib.mkOption { type = lib.types.bool; default = false; };
#geometry = lib.mkOption { type = lib.types.str; default = ""; };
};
}));
default = { };
};
};
config = lib.mkIf cfg.enable {
environment.systemPackages = [ pkgs.tigervnc pkgs.xhost pkgs.xauth ];
systemd.user.services = lib.mapAttrs' (user: opts:
let svcName = "tigervnc-x0vncserver-${user}";
in {
name = svcName;
value = lib.mkIf opts.enableSharing {
description = "TigerVNC x0vncserver sharing :0 for ${user}";
after = [ "graphical-session.target" ];
partOf = [ "graphical-session.target" ];
wantedBy = [ "graphical-session.target" ];
path = [ pkgs.tigervnc pkgs.xhost pkgs.xauth pkgs.coreutils ];
script = let
# Build args array to avoid shell escaping hell
vncArgs = [
"-display :0"
"-rfbport ${toString opts.port}"
"-rfbauth $HOME/.vnc/passwd"
"-AcceptSetDesktopSize=0"
"-AlwaysShared"
] #++ lib.optionals (opts.geometry != "") [ "-Geometry ${opts.geometry}" ]
++ lib.optionals opts.localhost [ "-localhost" ];
in ''
set -euxo pipefail
# Password check
mkdir -p "$HOME/.vnc"
if [ ! -r "$HOME/.vnc/passwd" ]; then
echo "ERROR: Run: vncpasswd ~/.vnc/passwd" >&2
### CHANGE THE &gt; in the above line TO A GREATER THAN SIGN! ###
exit 1
fi
# X authority
xhost +local:
# Clean x0vncserver args
${pkgs.tigervnc}/bin/x0vncserver ${lib.concatStringsSep " " (map (arg: "${arg}") vncArgs)}
'';
preStop = ''
xhost -local:
pkill -f "x0vncserver.*${toString opts.port}"
'';
serviceConfig = {
Type = "simple";
Restart = "always";
RestartSec = "5s";
RuntimeDirectory = "vnc-${user}";
};
};
}
) cfg.users;
networking.firewall.allowedTCPPorts =
lib.mapAttrsToList (_: opts: opts.port) cfg.users;
};
}