diff --git a/modules/programs/hyprland/default.nix b/modules/programs/hyprland/default.nix index f869398..6e9407a 100644 --- a/modules/programs/hyprland/default.nix +++ b/modules/programs/hyprland/default.nix @@ -18,108 +18,141 @@ in }; config = mkIf cfg.enable { - home-manager.users.moritz = { - imports = [ inputs.hyprland.homeManagerModules.default ]; - programs.waybar = { - enable = true; - package = pkgs.waybar-hyprland; - systemd = { - enable = true; - target = "hyprland-session.target"; - }; - settings = { - mainBar = { - layer = "top"; - position = "top"; - height = 30; - output = [ - "eDP-1" - "HDMI-A-1" - "HDMI-A-2" - ]; - modules-left = [ "wlr/workspaces" ]; - modules-center = [ "hyprland/window" ]; - modules-right = [ "network" "memory" "cpu" "battery" "clock" ]; - modules = { - "wlr/workspaces" = { - on-click = "activate"; - }; - }; - }; - }; - }; + # enable nix module + programs.hyprland = { + enable = true; + package = null; # because we use the home-manager module + }; + + # enable home-manager module + home-manager.users.moritz = { + # import home-manager module + imports = [ inputs.hyprland.homeManagerModules.default ]; wayland.windowManager.hyprland = { enable = true; package = hyprland; extraConfig = import ./config.nix args; }; + }; - services.swayidle = { + + # add waybar as a status bar + home-manager.users.moritz.programs.waybar = { + enable = true; + + # use package with hyprland support for switching workspaces + package = pkgs.waybar-hyprland; + + # start using systemd service + systemd = { enable = true; - events = [ - { - event = "before-sleep"; - command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; - } - { - event = "lock"; - command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; - } - ]; - timeouts = [ - { - timeout = 300; - command = "${hyprland}/bin/hyprctl dispatch dpms off"; - resumeCommand = "${hyprland}/bin/hyprctl dispatch dpms on"; - } - { - timeout = 310; - command = "${pkgs.systemd}/bin/loginctl lock-session"; - } - ]; + target = "hyprland-session.target"; }; - # start swayidle as part of hyprland, not sway - systemd.user.services.swayidle.Install.WantedBy = lib.mkForce [ "hyprland-session.target" ]; - xdg.configFile."hypr/hyprpaper.conf" = { - text = - let - setWallpaper = wallpaper: '' - preload = ${wallpaper} - wallpaper = ,${wallpaper} - ''; - in - setWallpaper "/home/moritz/.config/wallpapers/a_short_walk.png"; - onChange = "${pkgs.systemd}/bin/systemctl restart --user hyprpaper.service"; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 30; + output = [ + "eDP-1" + "HDMI-A-1" + "HDMI-A-2" + ]; + modules-left = [ "wlr/workspaces" ]; + modules-center = [ "hyprland/window" ]; + modules-right = [ "network" "memory" "cpu" "battery" "clock" ]; + modules = { + "wlr/workspaces" = { + on-click = "activate"; + }; + }; + }; }; }; + + + # lock screen after timeout + home-manager.users.moritz.services.swayidle = { + enable = true; + events = [ + { + event = "before-sleep"; + command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; + } + { + event = "lock"; + command = "${pkgs.swaylock-effects}/bin/swaylock -fF"; + } + ]; + timeouts = [ + { + timeout = 300; + command = "${hyprland}/bin/hyprctl dispatch dpms off"; + resumeCommand = "${hyprland}/bin/hyprctl dispatch dpms on"; + } + { + timeout = 310; + command = "${pkgs.systemd}/bin/loginctl lock-session"; + } + ]; + }; + # start swayidle as part of hyprland, not sway + systemd.user.services.swayidle.Install.WantedBy = lib.mkForce [ "hyprland-session.target" ]; + + # adds pam module for swaylock + security.pam.services.swaylock = { }; + + + # start hyprpaper daemon using systemd unit (to set wallpaper) systemd.user.services.hyprpaper = { enable = true; path = [ pkgs.hyprpaper ]; wantedBy = [ "hyprland-session.target" ]; - after = [ "display-manager.service" ]; + after = [ "hyprland-session.target" ]; script = "hyprpaper"; }; + # set hyprpaper conf (for setting initial background) + xdg.configFile."hypr/hyprpaper.conf" = { + text = + let + setWallpaper = wallpaper: '' + preload = ${wallpaper} + wallpaper = ,${wallpaper} + ''; + in + setWallpaper "/home/moritz/.config/wallpapers/a_short_walk.png"; + onChange = "${pkgs.systemd}/bin/systemctl restart --user hyprpaper.service"; + }; + + + # only consider graphical-session.target started when hyprland-sesstion.target is reached + systemd.user.targets.hyprland-session = { + wantedBy = [ "graphical-session.target" ]; + }; + + + # add user packages for wayland and hyprland in particular users.users.moritz.packages = with pkgs; [ - swayidle - swaylock-effects + # pulse audio cli pamixer + # control media playback playerctl + # control brightness brightnessctl + # screenshot tool for hyprland grimblast + # region select for wayland (for screensharing) + slurp + # clipboard tool for wayland wl-clipboard ]; - security.pam.services.swaylock = { }; - - programs.hyprland = { - enable = true; - package = null; - }; + # additional environment variables environment.sessionVariables = { XDG_CURRENT_DESKTOP = "Hyprland"; @@ -130,8 +163,7 @@ in QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; QT_QPA_PLATFORMTHEME = "qt5ct"; _JAVA_AWT_WM_NONEREPARENTING = "1"; - } // - (if cfg.nvidiaSupport then + } // (optionalAttrs cfg.nvidiaSupport { LIBVA_DRIVER_NAME = "nvidia"; XDG_SESSION_TYPE = "wayland"; @@ -139,10 +171,12 @@ in __GLX_VENDOR_LIBRARY_NAME = "nvidia"; WLR_NO_HARDWARE_CURSORS = "1"; __GL_VRR_ALLOWED = "0"; - } else { }); + }); + services = { dbus.enable = true; + # use pipewire (needed for screensharing) pipewire = { enable = true; alsa.enable = true; @@ -158,12 +192,14 @@ in user = "moritz"; }; defaultSession = "hyprland"; - sessionPackages = [ hyprland ]; + sessionPackages = [ hyprland ]; # can't set the defaultSession otherwise }; }; }; security.rtkit.enable = true; + + # dekstop portal (for screensharing) xdg.portal = { enable = true; wlr.enable = true;