{ pkgs, ... }: { programs.sway = { enable = true; wrapperFeatures.gtk = true; # so that gtk works properly extraPackages = with pkgs; [ swaylock swayidle xwayland # for legacy apps waybar wl-clipboard mako # notification daemon alacritty # Alacritty is the default terminal in the config dmenu # Dmenu is the default in the config but i recommend wofi since its wayland native kanshi # replacement for autorandr sway-contrib.grimshot imv # image viewer ]; extraSessionCommands = '' export SDL_VIDEODRIVER=wayland # needs qt5.qtwayland in systemPackages export QT_QPA_PLATFORM=wayland export QT_WAYLAND_DISABLE_WINDOWDECORATION="1" # Fix for some Java AWT applications (e.g. Android Studio), # use this if they aren't displayed properly: export _JAVA_AWT_WM_NONREPARENTING=1 ''; }; #environment = { #etc = { ## Put config files in /etc. Note that you also can put these in ~/.config, but then you can't manage them with NixOS anymore! #"sway/config".source = ./dotfiles/sway/config; #"xdg/waybar/config".source = ./dotfiles/waybar/config; #"xdg/waybar/style.css".source = ./dotfiles/waybar/style.css; #}; #}; # Here we but a shell script into path, which lets us start sway.service (after importing the environment of the login shell). environment.systemPackages = with pkgs; [ ( pkgs.writeTextFile { name = "startsway"; destination = "/bin/startsway"; executable = true; text = '' #! ${pkgs.bash}/bin/bash # first import environment variables from the login manager systemctl --user import-environment # then start the service exec systemctl --user start sway.service ''; } ) ]; # use gdm for authentication services.xserver.enable = true; services.xserver.displayManager.gdm = { enable = true; wayland = true; }; services.redshift = { enable = true; # Redshift with wayland support isn't present in nixos-19.09 atm. You have to cherry-pick the commit from https://github.com/NixOS/nixpkgs/pull/68285 to do that. package = pkgs.redshift-wlr; temperature.night = 3500; }; systemd.user.targets.sway-session = { description = "Sway compositor session"; documentation = [ "man:systemd.special(7)" ]; bindsTo = [ "graphical-session.target" ]; wants = [ "graphical-session-pre.target" ]; after = [ "graphical-session-pre.target" ]; }; systemd.user.services.sway = { description = "Sway - Wayland window manager"; documentation = [ "man:sway(5)" ]; bindsTo = [ "graphical-session.target" ]; wants = [ "graphical-session-pre.target" ]; after = [ "graphical-session-pre.target" ]; # We explicitly unset PATH here, as we want it to be set by # systemctl --user import-environment in startsway environment.PATH = pkgs.lib.mkForce null; serviceConfig = { Type = "simple"; ExecStart = '' ${pkgs.dbus}/bin/dbus-run-session ${pkgs.sway}/bin/sway --debug ''; Restart = "on-failure"; RestartSec = 1; TimeoutStopSec = 10; }; }; systemd.user.services.swayidle = { description = "Idle Manager for Wayland"; documentation = [ "man:swayidle(1)" ]; wantedBy = [ "sway-session.target" ]; partOf = [ "graphical-session.target" ]; path = [ pkgs.bash ]; serviceConfig = { ExecStart = '' ${pkgs.swayidle}/bin/swayidle -w -d \ timeout 300 '${pkgs.sway}/bin/swaymsg "output * dpms off"' \ resume '${pkgs.sway}/bin/swaymsg "output * dpms on"' ''; }; }; programs.waybar.enable = true; systemd.user.services.kanshi = { description = "Kanshi output autoconfig "; wantedBy = [ "graphical-session.target" ]; partOf = [ "graphical-session.target" ]; serviceConfig = { # kanshi doesn't have an option to specifiy config file yet, so it looks # at .config/kanshi/config ExecStart = '' ${pkgs.kanshi}/bin/kanshi ''; RestartSec = 5; Restart = "always"; }; }; }