Sway

From NixOS Wiki
Revision as of 11:30, 20 November 2019 by imported>Erictapen

Sway support in NixOS is still experimental, but with some quirks it's already possible to use it.

This article tries to give some hints for working setup. Feel free to integrate these changes in Nixpkgs!

  1. Systemd integration

In an [article on the Sway wiki](https://github.com/swaywm/sway/wiki/Systemd-integration), a way to integrate Sway with systemd user services is proposed. Starting sway that way has some benefits:

- Logging for Sway is done the same way it is done for every other user service. - Services like Waybar, kanshi, redshift can depend on `graphical-session.target` and can therefore be started as their own user service, including convenient service management and logging.

``` { config, pkgs, lib, ... }: {

 programs.sway = {
   enable = true;
   extraPackages = with pkgs; [
     swaylock # lockscreen
     swayidle
     xwayland # for legacy apps
     waybar # status bar
     mako # notification daemon
     kanshi # autorandr
   ];
 };
 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
       ;
     }
   )
 ];
 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 = 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;
   };
 };
 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;
 };
 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";
   };
 };

}

```