Sway

From NixOS Wiki
Jump to: navigation, search

Sway is a tiling Wayland compositor and a drop-in replacement for the i3 window manager for X11. It works with your existing i3 configuration and supports most of i3's features, plus a few extras. i3 migration guide

Installation

You can install Sway by enabling it in NixOS directly, or by using Home Manager. Note that if you enable Sway using NixOS (via programs.sway.enable = true; in configuration.nix and not setting programs.sway.package), your Home Manager configurations for Sway will be used.

Using NixOS

Here is a minimal configuration:

{ config, pkgs, lib, ... }:
{
  environment.systemPackages = with pkgs; [
    grim # screenshot functionality
    slurp # screenshot functionality
    wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
    mako # notification system developed by swaywm maintainer
  ];

  # Enable the gnome-keyring secrets vault. 
  # Will be exposed through DBus to programs willing to store secrets.
  services.gnome.gnome-keyring.enable = true;

  # enable sway window manager
  programs.sway = {
    enable = true;
    wrapperFeatures.gtk = true;
  };
}

A few general comments:

  • There is some friction between GTK theming and sway. Currently the sway developers suggest using gsettings to set gtk theme attributes as described here [1]. There is currently a plan to allow GTK theme attributes to be set directly in the sway config.
  • Running sway as a systemd user service is not recommended [2] [3]

Using Home Manager

To set up Sway using Home Manager, first you must enable Polkit in your nix configuration:

Breeze-text-x-plain.png
/etc/nixos/configuration.nix
security.polkit.enable = true;


Then you can enable Sway in your home manager configuration. Here is a minimal example:

  wayland.windowManager.sway = {
    enable = true;
    config = rec {
      modifier = "Mod4";
      # Use kitty as default terminal
      terminal = "kitty"; 
      startup = [
        # Launch Firefox on start
        {command = "firefox";}
      ];
    };
  };

See Home Manager's Options for Sway for a complete list of configuration options.

You might need to active dbus manually from .zshrc to use i.e: dunst, see Dunst crashes if run as service

Brightness and volume

If you are on a laptop, you can set up brightness and volume function keys as follows:

Breeze-text-x-plain.png
/etc/nixos/configuration.nix
users.users.yourusername.extraGroups = [ "video" ];
programs.light.enable = true;


Breeze-text-x-plain.png
sway config
# Brightness
bindsym XF86MonBrightnessDown exec light -U 10
bindsym XF86MonBrightnessUp exec light -A 10

# Volume
bindsym XF86AudioRaiseVolume exec 'pactl set-sink-volume @DEFAULT_SINK@ +1%'
bindsym XF86AudioLowerVolume exec 'pactl set-sink-volume @DEFAULT_SINK@ -1%'
bindsym XF86AudioMute exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle'


Systemd services

Kanshi is an output configuration daemon. As explained above, we don't run sway itself as a systemd service. There are auxiliary daemons that we do want to run as systemd services, for example Kanshi [4], which implements monitor hot swapping. It would be enabled as follows:

Breeze-text-x-plain.png
/etc/nixos/configuration.nix
  # kanshi systemd service
  systemd.user.services.kanshi = {
    description = "kanshi daemon";
    serviceConfig = {
      Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };
  };


Breeze-text-x-plain.png
sway config
# give sway a little time to startup before starting kanshi.
exec sleep 5; systemctl --user start kanshi.service

When you launch sway, the systemd service is started.

Troubleshooting

Cursor is too tiny on HiDPI displays

Using Home Manager try configuring a general mouse cursor size and theme

home-manager.users.myUser = {

    home.pointerCursor = {
      name = "Adwaita";
      package = pkgs.gnome.adwaita-icon-theme;
      size = 24;
      x11 = {
        enable = true;
        defaultCursor = "Adwaita";
      };
    };

};

Replace myUser with your user running the graphical environment.

Missing fonts on Xorg applications

If fonts for certain languages are missing in Xorg applications (e.g. Japanese fonts don't appear in Discord) even though they're in the system, you can set them as default fonts in your configuration file

  fonts = {
    packages = with pkgs; [
      noto-fonts
      noto-fonts-cjk
      noto-fonts-emoji
      font-awesome
      source-han-sans
      source-han-sans-japanese
      source-han-serif-japanese
    ];
    fontconfig.defaultFonts = {
      serif = [ "Noto Serif" "Source Han Serif" ];
      sansSerif = [ "Noto Sans" "Source Han Sans" ];
    };
  };

Swaylock cannot be unlocked with the correct password

Add the following to your NixOS configuration.

  security.pam.services.swaylock = {};

The programs.sway.enable option does this automatically.

Inferior performance compared to other distributions

Enabling realtime may improve latency and reduce stuttering, specially in high load scenarios.

security.pam.loginLimits = [
  { domain = "@users"; item = "rtprio"; type = "-"; value = 1; }
];

Enabling this option allows any program run by the "users" group to request real-time priority.

Touchscreen input bound to the wrong monitor in multi-monitor setups

Using Home Manager, add the following to your Sway configuration:

  wayland.windowManager.sway = {
    config = {
      input = {
        "type:touch" = {
          # Replace touchscreen_output_identifier with the identifier of your touchscreen.
          map_to_output = touchscreen_output_identifier;
        };
      };
    };
  };