{ config , lib , pkgs , inputs , ... } @ args: with lib; let cfg = config.my.programs.river; in { options.my.programs.river = { enable = mkEnableOption "river"; keyboardLayouts = mkOption { type = types.listOf types.str; description = "list of keyboard layouts"; default = [ "de" "us" ]; }; monitors = mkOption { type = types.listOf types.str; description = "monitor settings"; default = [ ",preferred,auto,1" ]; }; }; config = mkIf cfg.enable { programs.river.enable = true; my = { programs = { wallpaper.enable = true; foot.enable = true; tofi.enable = true; }; wallpapers.enable = true; services = { dunst.enable = true; wallpaper = { enable = true; # target = "hyprland-session.target"; }; # spotify-player.target = "hyprland-session.target"; }; }; home-manager.users.moritz = { # enable home-manager module wayland.windowManager.river = { enable = true; package = pkgs.river.overrideAttrs (old: { src = inputs.river; version = lib.my.mkVersionInput inputs.river; # HACK: to change wlroots to 0.17.x buildInputs = with pkgs; [ libGL libevdev libinput libxkbcommon pixman udev wayland-protocols wlroots_0_17 xorg.libX11 ]; }); settings = { border-width = 2; declare-mode = [ "locked" "normal" "passthrough" ]; map = { normal = { "Super Q" = "close"; "Super Return" = "spawn footclient"; "Super+Shift Return" = "spawn foot"; "Super R" = ''spawn 'exec $(tofi-run --fuzzy-match=true)' ''; }; }; }; }; # add waybar as a status bar programs.waybar = { enable = true; # start using systemd service systemd = { enable = true; # target = "hyprland-session.target"; }; settings = { mainBar = { start_hidden = true; layer = "top"; position = "top"; height = 20; modules-left = [ "river/mode" ]; modules-center = [ "river/window" ]; modules-right = [ "network" "memory" "cpu" "battery" "clock" ]; }; }; }; # lock screen after timeout programs.swaylock = { enable = true; settings = { color = "000000"; }; }; services.swayidle = { enable = true; events = [ { event = "before-sleep"; command = "${getExe pkgs.swaylock} -fF"; } { event = "lock"; command = "${getExe pkgs.swaylock} -fF"; } ]; timeouts = let lockTimeout = 10; in [ { timeout = lockTimeout * 60 - 10; command = "${pkgs.libnotify}/bin/notify-send 'Locking screen!'"; } { timeout = lockTimeout * 60 + 10; command = "${pkgs.systemd}/bin/loginctl lock-session"; } ]; # systemdTarget = "hyprland-session.target"; }; }; # adds pam module for swaylock security.pam.services.swaylock = { }; # add user packages for wayland and hyprland in particular users.users.moritz.packages = with pkgs; [ brightnessctl # control brightness grimblast # screenshot tool for hyprland pamixer # pulse audio cli playerctl # control media playback slurp # region select for wayland (for screensharing) wdisplays # manage monitors wl-clipboard # clipboard tool for wayland ]; # additional environment variables # environment.sessionVariables = # { # XDG_CURRENT_DESKTOP = "Hyprland"; # XDG_SESSION_TYPE = "wayland"; # XDG_SESSION_DESKTOP = "Hyprland"; # QT_AUTO_SCREEN_SCALE_FACTOR = "1"; # QT_QPA_PLATFORM = "wayland;xcb"; # QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; # QT_QPA_PLATFORMTHEME = "qt5ct"; # _JAVA_AWT_WM_NONEREPARENTING = "1"; # } // (optionalAttrs cfg.nvidiaSupport # { # LIBVA_DRIVER_NAME = "nvidia"; # GBM_BACKEND = "nvidia-drm"; # __GLX_VENDOR_LIBRARY_NAME = "nvidia"; # WLR_NO_HARDWARE_CURSORS = "1"; # __GL_VRR_ALLOWED = "0"; # }); services = { dbus.enable = true; # use pipewire (needed for screensharing) pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; }; xserver = { enable = true; displayManager = { lightdm.enable = true; autoLogin = { enable = true; user = "moritz"; }; defaultSession = "river"; }; }; }; security.rtkit.enable = true; # home-manager.users.moritz.systemd.user.services = # let # units = [ "waybar" ]; # mkAfter = _: { # Unit = { # After = [ "hyprland-session.target" ]; # Wants = [ "hyprland-session.target" ]; # }; # }; # in # genAttrs units mkAfter; # # systemd.user.services = # let # units = [ "pipewire" "xdg-desktop-portal" "xdg-desktop-portal-hyprland" "wireplumber" ]; # mkAfter = _: { # after = [ "hyprland-session.target" ]; # wants = [ "hyprland-session.target" ]; # }; # in # genAttrs units mkAfter; }; }