Sway: Difference between revisions

From NixOS Wiki
imported>Artturin
add theming and additional packages
RafTeog (talk | contribs)
 
(56 intermediate revisions by 33 users not shown)
Line 3: Line 3:


== Installation ==
== 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 <code>programs.sway.enable = true;</code> in <code>configuration.nix</code>), your Home Manager configurations for Sway will be ignored.


=== NixOS ===
=== Using NixOS ===
[https://search.nixos.org/options?query=sway NixOS options for sway]
Here is a minimal configuration:
 
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
programs.sway = {
{ config, pkgs, lib, ... }:
   enable = true;
{
  wrapperFeatures.gtk = true; # so that gtk works properly
   environment.systemPackages = with pkgs; [
  extraPackages = with pkgs; [
     grim # screenshot functionality
     swaylock
     slurp # screenshot functionality
     swayidle
     wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
     wl-clipboard
     mako # notification system developed by swaywm maintainer
     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
   ];
   ];
};


  # 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;
  };
}
</syntaxhighlight>
</syntaxhighlight>


=== Home Manager ===
A few general comments:
[https://rycee.gitlab.io/home-manager/options.html#opt-wayland.windowManager.sway.enable Home Manager options for sway]
* There is some friction between GTK theming and sway. Currently the sway developers suggest using gsettings to set gtk theme attributes as described here [https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland]. 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 [https://github.com/swaywm/sway/wiki/Systemd-integration#running-sway-itself-as-a---user-service] [https://github.com/swaywm/sway/issues/5160]


<syntaxhighlight lang="nix">
=== Using Home Manager ===
wayland.windowManager.sway = {
To set up Sway using [[Home Manager]], first you must enable [[Polkit]] in your nix configuration:
  enable = true;
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  wrapperFeatures.gtk = true ;
security.polkit.enable = true;
};
</nowiki>}}
home.packages = with pkgs; [
  swaylock
Then you can enable Sway in your home manager configuration. Here is a minimal example:
  swayidle
<syntaxhighlight lang="nix>
  wl-clipboard
  wayland.windowManager.sway = {
  mako # notification daemon
    enable = true;
   alacritty # Alacritty is the default terminal in the config
    config = rec {
  dmenu # Dmenu is the default in the config but i recommend wofi since its wayland native
      modifier = "Mod4";
];
      # Use kitty as default terminal
      terminal = "kitty";  
      startup = [
        # Launch Firefox on start
        {command = "firefox";}
      ];
    };
   };
</syntaxhighlight>
</syntaxhighlight>


== Info ==
See [https://nix-community.github.io/home-manager/options.xhtml#opt-wayland.windowManager.sway.enable Home Manager's Options for Sway] for a complete list of configuration options.


=== Clipboard ===
You might need to active dbus manually from .zshrc to use i.e: dunst, see [https://discourse.nixos.org/t/dunst-crashes-if-run-as-service/27671/2 Dunst crashes if run as service]


For clipboard support
=== Brightness and volume ===
<syntaxhighlight lang="nix">
If you are on a laptop, you can set up brightness and volume function keys as follows:
environment.systemPackages = with pkgs; [ wl-clipboard ];
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
</syntaxhighlight>
users.users.yourusername.extraGroups = [ "video" ];
programs.light.enable = true;


to use [https://github.com/brunelli/wl-clipboard-x11/ wl-clipboard-x11] which is a wrapper to use wl-clipboard as a drop-in replacement to X11 clipboard tools
</nowiki>}}


<syntaxhighlight lang="nix">
{{file|sway config|bash|
nixpkgs.overlays = [
  (self: super: {
    wl-clipboard-x11 = super.stdenv.mkDerivation rec {
    pname = "wl-clipboard-x11";
    version = "5";
 
    src = super.fetchFromGitHub {
      owner = "brunelli";
      repo = "wl-clipboard-x11";
      rev = "v${version}";
      sha256 = "1y7jv7rps0sdzmm859wn2l8q4pg2x35smcrm7mbfxn5vrga0bslb";
    };
 
    dontBuild = true;
    dontConfigure = true;
    propagatedBuildInputs = [ super.wl-clipboard ];
    makeFlags = [ "PREFIX=$(out)" ];
    };
 
    xsel = self.wl-clipboard-x11;
    xclip = self.wl-clipboard-x11;
  })
];
</syntaxhighlight>
{{Note|This will recompile all packages that have xclip or xsel in their dependencies|warn}}


=== Polkit ===
# Brightness
bindsym XF86MonBrightnessDown exec light -U 10
bindsym XF86MonBrightnessUp exec light -A 10


<syntaxhighlight lang="nix">
# Volume
environment.systemPackages = with pkgs; [ polkit_gnome ];
bindsym XF86AudioRaiseVolume exec 'pactl set-sink-volume @DEFAULT_SINK@ +1%'
</syntaxhighlight>
bindsym XF86AudioLowerVolume exec 'pactl set-sink-volume @DEFAULT_SINK@ -1%'
bindsym XF86AudioMute exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle'
}}


nix generated sway config
=== Systemd services ===
<syntaxhighlight lang="nix">
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 [https://sr.ht/~emersion/kanshi/], which implements monitor hot swapping. It would be enabled as follows:
${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
</syntaxhighlight>
  # kanshi systemd service
  systemd.user.services.kanshi = {
    description = "kanshi daemon";
    serviceConfig = {
      Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };
  };
</nowiki>}}


normal sway config
{{file|sway config|bash|
<syntaxhighlight lang="bash">
# give sway a little time to startup before starting kanshi.
# NixOS
exec sleep 5; systemctl --user start kanshi.service
exec /run/current-system/sw/libexec/polkit-gnome-authentication-agent-1
}}
# Home Manager
When you launch sway, the systemd service is started.  
exec ~/.nix-profile/libexec/polkit-gnome-authentication-agent-1
</syntaxhighlight>


=== Theming ===
=== Using greeter ===
Installing a greeter based on [https://search.nixos.org/options?channel=unstable&show=services.greetd.settings&from=0&size=50&sort=relevance&type=packages&query=greetd greetd] is the most straightforward way to launch Sway.


==== Gtk ====
Tuigreet does not even need a separate compositor to launch.


<syntaxhighlight lang="nix">
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
environment.systemPackages = with pkgs; [
services.greetd = {                                                     
   gtk-engine-murrine
  enable = true;                                                        
  gtk_engines
   settings = {                                                         
  gsettings-desktop-schemas
    default_session = {                                                 
   lxappearance
      command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway";
];
      user = "greeter";                                                 
</syntaxhighlight>
    };                                                                 
open lxappearance and pick your themes
   };                                                                   
};                                                                      
</nowiki>}}


read [https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland GTK3 settings on Wayland]
== Troubleshooting ==


==== Qt ====
=== Cursor is too tiny on HiDPI displays ===


<syntaxhighlight lang="nix">
Using [[Home Manager]] try configuring a general mouse cursor size and theme
programs.qt5ct.enable = true;
</syntaxhighlight>
open qt5ct and pick your theme


=== Additional packages ===
<syntaxhighlight lang="nix>


home-manager.users.myUser = {


{{app|waybar|Highly customizable Wayland bar for Sway and Wlroots based compositors|https://github.com/Alexays/Waybar|waybar}}
    home.pointerCursor = {
{{app|autotiling|Script for sway and i3 to automatically switch the horizontal / vertical window split orientation|https://github.com/nwg-piotr/autotiling|autotiling}}
      name = "Adwaita";
{{app|gammastep|Reduces bluelight and saves your eyes|https://gitlab.com/chinstrap/gammastep|gammastep}}
      package = pkgs.gnome.adwaita-icon-theme;
{{app|clipman|Simple clipboard manager for Wayland|https://github.com/yory8/clipman/|clipman}}
      size = 24;
{{app|wofi|Launcher/menu program for wlroots based wayland compositors such as sway|https://hg.sr.ht/~scoopta/wofi|wofi}}
      x11 = {
{{app|flashfocus|Simple focus animations for tiling window managers|https://github.com/fennerm/flashfocus|flashfocus}}
        enable = true;
{{app|wf-recorder|Screen recorder for wlroots-based compositors such as sway|https://github.com/ammen99/wf-recorder|wf-recorder}}
        defaultCursor = "Adwaita";
more packages here [https://github.com/swaywm/sway/wiki/i3-Migration-Guide i3 migration guide]
      };
    };


};
</syntaxhighlight>


=== Systemd integration ===
Replace <code>myUser</code> with your user running the graphical environment.


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:
=== Missing fonts on Xorg applications ===


* Logging for Sway is done the same way it is done for every other user service.
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
* Services like Waybar, kanshi, redshift can depend on <code>graphical-session.target</code> and can therefore be started as their own user service, including convenient service management and logging.


'''Don't forget to additionally start <code>sway-session.target</code>with one of the methods described in the sway wiki.'''
<syntaxhighlight lang="nix>
<syntaxhighlight lang="nix">
{ config, pkgs, lib, ... }: {


   programs.sway = {
   fonts = {
     enable = true;
     packages = with pkgs; [
    extraPackages = with pkgs; [
       noto-fonts
       swaylock # lockscreen
      noto-fonts-cjk
       swayidle
       noto-fonts-emoji
       xwayland # for legacy apps
       font-awesome
       waybar # status bar
       source-han-sans
       mako # notification daemon
       source-han-sans-japanese
       kanshi # autorandr
       source-han-serif-japanese
     ];
     ];
    fontconfig.defaultFonts = {
      serif = [ "Noto Serif" "Source Han Serif" ];
      sansSerif = [ "Noto Sans" "Source Han Sans" ];
    };
   };
   };


  environment = {
</syntaxhighlight>
    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!
=== Swaylock cannot be unlocked with the correct password ===
      "sway/config".source = ./dotfiles/sway/config;
 
      "xdg/waybar/config".source = ./dotfiles/waybar/config;
Add the following to your NixOS configuration.
      "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).
<syntaxhighlight lang="nix>
  environment.systemPackages = with pkgs; [
   security.pam.services.swaylock = {};
    (
</syntaxhighlight>
      pkgs.writeTextFile {
        name = "startsway";
        destination = "/bin/startsway";
        executable = true;
        text = ''
          #! ${pkgs.bash}/bin/bash


          # first import environment variables from the login manager
The <code>programs.sway.enable</code> option does this automatically.
          systemctl --user import-environment
          # then start the service
          exec systemctl --user start sway.service
        '';
      }
    )
  ];


  systemd.user.targets.sway-session = {
=== Inferior performance compared to other distributions ===
    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 = {
Enabling realtime may improve latency and reduce stuttering, specially in high load scenarios.
    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 = {
<syntaxhighlight lang="nix">
    enable = true;
security.pam.loginLimits = [
    # 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.
  { domain = "@users"; item = "rtprio"; type = "-"; value = 1; }
    package = pkgs.redshift-wlr;
];
  };
</syntaxhighlight>


  programs.waybar.enable = true;
Enabling this option allows any program run by the "users" group to request real-time priority.


  systemd.user.services.kanshi = {
=== WLR Error when trying to launch sway ===
    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";
    };
  };


}
When this happens on a new nixos system, enabling opengl in configuration.nix may fix this issue. 


<syntaxhighlight lang="nix">
hardware.opengl.enable = true;
</syntaxhighlight>
</syntaxhighlight>
[[Category:Window managers]]
[[Category:Window managers]]
[[Category:Applications]]

Latest revision as of 00:59, 3 May 2024

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), your Home Manager configurations for Sway will be ignored.

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:

/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:

/etc/nixos/configuration.nix
users.users.yourusername.extraGroups = [ "video" ];
programs.light.enable = true;
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:

/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'';
    };
  };
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.

Using greeter

Installing a greeter based on greetd is the most straightforward way to launch Sway.

Tuigreet does not even need a separate compositor to launch.

/etc/nixos/configuration.nix
services.greetd = {                                                      
  enable = true;                                                         
  settings = {                                                           
    default_session = {                                                  
      command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway";
      user = "greeter";                                                  
    };                                                                   
  };                                                                     
};

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.

WLR Error when trying to launch sway

When this happens on a new nixos system, enabling opengl in configuration.nix may fix this issue.

hardware.opengl.enable = true;