nixOS/modules/desktop.nix
Sergei Poljanski 1320decc26
desktop: patch mutter crash on grabs by cancelled touches
meta_wayland_touch_cancel() clears focus_surface on active touches
but keeps their serials until the finger lifts. A client asking for
a move/resize grab with such a serial (anotherim-js's resize edges
by touch) makes touch_can_grab_surface() dereference NULL and takes
down gnome-shell (four crashes on 2026-10-13, same address).

Carry a one-line NULL check until nixpkgs' mutter has a fix; it is
not upstream as of mutter 50.2 / main.

Assisted-by: Claude:opus-5
2026-10-13 06:31:49 +04:00

80 lines
2.7 KiB
Nix

# Desktop environment, display, and audio configuration
{ config, pkgs, lib, ... }:
{
# AMD GPU
hardware.graphics = {
enable = true;
enable32Bit = true; # For Steam/Wine
};
# Enable the X11 windowing system.
services.xserver.enable = true;
# Enable the GNOME Desktop Environment.
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
# gnome-shell segfaults in touch_can_grab_surface() when a client asks for
# a move/resize grab with the serial of a cancelled touch (NULL
# focus_surface). Not fixed upstream as of mutter 50.2 / main 2026-10-13.
# Drop once nixpkgs' mutter carries a fix.
nixpkgs.overlays = [
(final: prev: {
mutter = prev.mutter.overrideAttrs (old: {
patches = (old.patches or [ ]) ++ [ ../patches/mutter-touch-cancelled-grab.patch ];
});
})
];
# Let systemd-logind own all sleep/idle policy. gsd-power otherwise
# second-guesses suspend-then-hibernate and re-wakes the machine before
# HibernateDelaySec elapses (observed on P14s G6 AMD). Set via dconf
# system db (gsettings-overrides only compiles desktop/shell/mutter
# schemas, so a g-s-d plugin override there is silently dropped).
programs.dconf.profiles.user.databases = [{
settings = {
"org/gnome/settings-daemon/plugins/power" = {
sleep-inactive-battery-type = "nothing";
sleep-inactive-ac-type = "nothing";
power-button-action = "nothing";
};
};
}];
# Configure keymap in X11
services.xserver.xkb = {
layout = "us,ru";
variant = "";
options = "grp:alt_shift_toggle";
};
# Enable CUPS to print documents.
services.printing.enable = true;
# Enable sound with pipewire.
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
# If you want to use JACK applications, uncomment this
# jack.enable = true;
};
# Enable touchpad support (enabled default in most desktopManager).
# services.xserver.libinput.enable = true;
# P14s G6 AMD: the F4 mic-mute LED (platform::micmute) is driven by the
# kernel's `audio-micmute` trigger, which follows the HD-audio codec's
# hardware capture-mute. PipeWire mutes in software at the node level and
# never touches that codec mute, so the trigger reports "muted" (LED lit)
# permanently while the mic actually works. Detach the trigger and force
# the LED off at boot. Verified: writing brightness=0 clears it, so the EC
# is fine — this is purely a trigger/software-mute mismatch.
services.udev.extraRules = ''
ACTION=="add", SUBSYSTEM=="leds", KERNEL=="platform::micmute", ATTR{trigger}="none", ATTR{brightness}="0"
'';
}