NixOS/Suckless/suckless.nix
2026-03-30 13:10:42 +07:00

121 lines
3.7 KiB
Nix

# Suckless configuration entry point
# X11 window manager setup with dwm, st, and related tools
{ pkgs, ... }:
{
imports = [
./dwm/dwm.nix
./st/st.nix
./slstatus.nix
];
# ============================================================================
# X11 Display Server
# ============================================================================
services.xserver = {
enable = true;
# Keyboard layout
xkb.layout = "us";
displayManager.startx.enable = true;
# Auto-lock after 10 minutes of inactivity
xautolock = {
enable = true;
time = 10;
locker = "${pkgs.slock}/bin/slock";
};
};
# Input (libinput)
services.libinput.enable = true;
# Tablet/stylus support
services.xserver.wacom.enable = true;
# Accelerometer for auto-rotation
hardware.sensor.iio.enable = true;
# ============================================================================
# Screen Locker
# ============================================================================
programs.slock = {
enable = true;
package = pkgs.slock;
};
# ============================================================================
# XDG Portal for X11
# ============================================================================
xdg.portal = {
enable = true;
extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
config.common.default = "gtk";
};
# ============================================================================
# X11 ecosystem packages
# ============================================================================
environment.systemPackages = with pkgs; [
# Clipboard
xclip
# Wallpaper
xwallpaper
# Numlock on startup
numlockx
# Touchpad gestures
libinput-gestures
# Auto-rotate based on accelerometer (with wallpaper switching, mobile only)
(writeShellScriptBin "auto-rotate" ''
export DISPLAY=''${DISPLAY:-:0}
WALLPAPER_DIR="$HOME/NixOS/Wallpapers"
${iio-sensor-proxy}/bin/monitor-sensor | while read -r line; do
# Skip rotation when docked (would mess up monitor positions)
[[ $(${autorandr}/bin/autorandr --detected) != "mobile" ]] && continue
case "$line" in
*"normal"*)
${xorg.xrandr}/bin/xrandr --output eDP-1 --rotate normal
${xwallpaper}/bin/xwallpaper --output eDP-1 --zoom "$WALLPAPER_DIR/siege.png"
;;
*"left-up"*)
${xorg.xrandr}/bin/xrandr --output eDP-1 --rotate left
${xwallpaper}/bin/xwallpaper --output eDP-1 --zoom "$WALLPAPER_DIR/pearl.jpg"
;;
*"right-up"*)
${xorg.xrandr}/bin/xrandr --output eDP-1 --rotate right
${xwallpaper}/bin/xwallpaper --output eDP-1 --zoom "$WALLPAPER_DIR/pearl.jpg"
;;
*"bottom-up"*)
${xorg.xrandr}/bin/xrandr --output eDP-1 --rotate inverted
${xwallpaper}/bin/xwallpaper --output eDP-1 --zoom "$WALLPAPER_DIR/siege.png"
;;
esac
done
'')
];
# ============================================================================
# Polkit authentication agent
# ============================================================================
security.polkit.enable = true;
systemd.user.services.polkit-gnome-authentication-agent-1 = {
description = "polkit-gnome-authentication-agent-1";
wantedBy = [ "graphical-session.target" ];
wants = [ "graphical-session.target" ];
after = [ "graphical-session.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
Restart = "on-failure";
RestartSec = 1;
TimeoutStopSec = 10;
};
};
}