Sway: Difference between revisions

Lulu (talk | contribs)
Remove duplicated entry "Touchscreen input bound to the wrong monitor in multi-monitor setups"
Phobos (talk | contribs)
mNo edit summary
 
(20 intermediate revisions by 14 users not shown)
Line 1: Line 1:
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.  
Sway is a tiling Wayland compositor and a drop-in replacement for the i3 window manager for X11. It can work with an existing i3 configuration and supports most of i3's features, plus a few extras.  
[https://github.com/swaywm/sway/wiki/i3-Migration-Guide i3 migration guide]
[https://github.com/swaywm/sway/wiki/i3-Migration-Guide i3 migration guide]


== Installation ==
== Setup ==
You can install Sway by enabling it in NixOS directly, or by using [[Home Manager]], or both.
You can install Sway by enabling it in NixOS directly, or by using [[Home Manager]], or both.


=== Using NixOS ===
=== Using NixOS ===
Here is a minimal configuration:
Here is a minimal configuration:
<syntaxhighlight lang="nix">
 
{ config, pkgs, lib, ... }:
{{File|3={ config, pkgs, lib, ... }:
{
{
   environment.systemPackages = with pkgs; [
   environment.systemPackages = with pkgs; [
Line 26: Line 26:
     wrapperFeatures.gtk = true;
     wrapperFeatures.gtk = true;
   };
   };
}
}|name=/etc/nixos/configuration.nix|lang=nix}}
</syntaxhighlight>
 
By default, the Sway module in NixOS comes with a set of extra packages, including the <code>foot</code> terminal, <code>swayidle</code>, <code>swaylock</code>, and <code>wmenu</code>, which can be configured under  <code>[https://search.nixos.org/options?show=programs.sway.extraPackages programs.sway.extraPackages]</code> option. You may also want to include <code>wl-clipboard</code> for clipboard functionality and <code>slurp</code> for screenshot region selection. Additionally, for a more customizable bar implementation than <code>sway-bar</code>, <code>waybar</code> can be enabled with <code>programs.waybar.enable</code>.
 
The default Sway configuration is symlinked to <code>/etc/sway/config</code> and <code>/etc/sway/config.d/nixos.conf</code>. The latter file contains dbus and systemd configuration that is critical to using apps that depend on XDG desktop portals with Sway, and should be included in any custom configuration files.


A few general comments:
A few general comments:
Line 34: Line 37:


=== Using Home Manager ===
=== Using Home Manager ===
To set up Sway using [[Home Manager]], first you must enable [[Polkit]] in your nix configuration:
To set up Sway using [[Home Manager]], first you must enable [[Polkit]] in your NixOS configuration:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
security.polkit.enable = true;
security.polkit.enable = true;
Line 40: Line 43:
   
   
Then you can enable Sway in your home manager configuration. Here is a minimal example:
Then you can enable Sway in your home manager configuration. Here is a minimal example:
<syntaxhighlight lang="nix>
 
  wayland.windowManager.sway = {
{{File|3=wayland.windowManager.sway = {
     enable = true;
     enable = true;
    wrapperFeatures.gtk = true; # Fixes common issues with GTK 3 apps
     config = rec {
     config = rec {
       modifier = "Mod4";
       modifier = "Mod4";
Line 52: Line 56:
       ];
       ];
     };
     };
   };
   };|name=/etc/nixos/home.nix|lang=nix}}
</syntaxhighlight>


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.
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.


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]
You may need to activate 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]
 
=== Brightness and volume ===
If you are on a laptop, you can set up brightness and volume function keys as follows:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
users.users.yourusername.extraGroups = [ "video" ];
programs.light.enable = true;


{{Note|
It's recommended to enable a [[Secret Service]] provider, like GNOME Keyring:
{{file|home.nix|nix|<nowiki>
services.gnome-keyring.enable = true;
</nowiki>}}
</nowiki>}}
{{file|sway config|bash|
# 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'
}}
}}


Line 85: Line 75:
   systemd.user.services.kanshi = {
   systemd.user.services.kanshi = {
     description = "kanshi daemon";
     description = "kanshi daemon";
    environment = {
      WAYLAND_DISPLAY="wayland-1";
      DISPLAY = ":0";
    };
     serviceConfig = {
     serviceConfig = {
       Type = "simple";
       Type = "simple";
Line 103: Line 97:
Tuigreet does not even need a separate compositor to launch.
Tuigreet does not even need a separate compositor to launch.


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|||<nowiki>
services.greetd = {                                                       
services.greetd = {                                                       
   enable = true;                                                         
   enable = true;                                                         
   settings = {                                                           
   settings = {                                                           
     default_session = {                                                   
     default_session = {                                                   
       command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway";
       command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd sway";
       user = "greeter";                                                   
       user = "greeter";                                                   
     };                                                                   
     };                                                                   
   };                                                                     
   };                                                                     
};                                                                       
};                                                                       
</nowiki>|name=/etc/nixos/configuration.nix|lang=nix}}
=== Automatic startup on boot ===
The snippet below will start Sway immediately on startup, without a greeter and '''without login prompt'''. Only consider using this in conjunction with [[Full Disk Encryption]]!
<syntaxhighlight lang="nix">
services.getty = {
  autologinUser = "your_username";
  autologinOnce = true;
};
environment.loginShellInit = ''
    [[ "$(tty)" == /dev/tty1 ]] && sway
'';
</syntaxhighlight>When launched directly from the TTY sway won't inherit the user environment. This can cause issues with systemd user services such as application launchers or swayidle. To fix this add the following to your home-manager configuration:{{file|home.nix|nix|<nowiki>
wayland.windowManager.sway.systemd.variables = ["--all"];
</nowiki>}}
</nowiki>}}
== Configuration ==
Sway can be configured for specific users using Home-Manager or manually through configuration files. Default is <code>/etc/sway/config</code> and custom user configuration in <code>~/.config/sway/config</code>.
=== Keyboard layout ===
Changing layout for all keyboards to German (de):<syntaxhighlight lang="console">
input * xkb_layout "de"
</syntaxhighlight>The same thing accomplished in Home Manager:<syntaxhighlight lang="nix">
wayland.windowManager.sway.input."*".xkb_layout = "de";
</syntaxhighlight>
=== High-DPI scaling ===
Changing scale for all screens to factor 1.5:<syntaxhighlight lang="console">
output * scale 1.5
</syntaxhighlight>
=== Brightness and volume ===
You can set up brightness and volume function keys as follows by binding the key codes to their corresponding commands in your sway config. The following configurations accomplish this using <code>light</code> and <code>pulseaudio</code>:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
users.users.yourusername.extraGroups = [ "video" ];
programs.light.enable = true;
environment.systemPackages = [ pkgs.pulseaudio ];
</nowiki>}}
{{file|sway config|bash|
# 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'
}}


== Troubleshooting ==
== Troubleshooting ==


=== Cursor is too tiny on HiDPI displays ===
=== Cursor is missing icons or too tiny on HiDPI displays ===


Using [[Home Manager]] try configuring a general mouse cursor size and theme
==== With programs.sway ====
<syntaxhighlight lang="nix>
{
  programs.sway.extraPackages = with pkgs; [
    adwaita-icon-theme # mouse cursor and icons
    gnome-themes-extra # dark adwaita theme
    ...
  ];
}
</syntaxhighlight>


<syntaxhighlight lang="nix>
In ~/.config/sway/config
<syntaxhighlight>
seat "*" xcursor_theme Adwaita 32
</syntaxhighlight>
 
==== With Home Manager ====


home-manager.users.myUser = {
Using [[Home Manager]] try configuring a general mouse cursor size and theme. The reason that your cursor might be missing in some applications, is because <code>XCURSOR_THEME</code>is missing, which will cause applications relying on <code>XWAYLAND</code> to misbehave. Setting <code>sway.enable = true</code>, combined with the <code>name</code>, <code>package</code> and size will set the correct environment variables, which sway will then use.


<syntaxhighlight lang="nix">home-manager.users.myUser = {
     home.pointerCursor = {
     home.pointerCursor = {
       name = "Adwaita";
       name = "Adwaita";
       package = pkgs.gnome.adwaita-icon-theme;
       package = pkgs.adwaita-icon-theme;
       size = 24;
       size = 24;
       x11 = {
       x11 = {
Line 133: Line 192:
         defaultCursor = "Adwaita";
         defaultCursor = "Adwaita";
       };
       };
      sway.enable = true;
     };
     };
 
};</syntaxhighlight>
};
</syntaxhighlight>


Replace <code>myUser</code> with your user running the graphical environment.
Replace <code>myUser</code> with your user running the graphical environment.
Line 189: Line 247:


When this happens on a new nixos system, enabling opengl in configuration.nix may fix this issue.   
When this happens on a new nixos system, enabling opengl in configuration.nix may fix this issue.   
{{Note|<code>hardware.opengl</code> was renamed to <code>hardware.graphics</code> in NixOS 24.11.}}


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
hardware.opengl.enable = true;
hardware.graphics.enable = true;
</syntaxhighlight>
</syntaxhighlight>
=== Systemd user services missing environment variables (PATH, etc) ===
When sway is launched with out display manager systemd won't inherit the users environment variables. To fix this add the following to your home-manager configuration:
{{File|3=wayland.windowManager.sway.systemd.variables = ["--all"];|name=home.nix|lang=nix}}


=== Touchscreen input bound to the wrong monitor in multi-monitor setups ===
=== Touchscreen input bound to the wrong monitor in multi-monitor setups ===
Line 214: Line 278:
   };
   };
</syntaxhighlight>
</syntaxhighlight>
=== GTK apps take an exceptionally long time to start ===
This occurs because GTK apps make blocking calls to freedesktop portals to be displayed. If Sway is not integrated with dbus and systemd, it will not be able to communicate via the <code>org.freedesktop.portal.Desktop</code> portal. To fix this, see the [[Sway#Using NixOS|description]] of default Sway configurations earlier. Adding the following to your sway configuration, if it is not already present, may resolve the issue:
include /etc/sway/config.d/*
== Tips and tricks ==
== Tips and tricks ==


Line 247: Line 316:
       };
       };
     };
     };
</syntaxhighlight>
=== Screen sharing with Firefox, Chromium ===
<syntaxhighlight lang="nix">
{ pkgs, ... }:
{
  # xdg portal + pipewire = screensharing
  xdg.portal = {
    enable = true;
    wlr.enable = true;
  };
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    pulse.enable = true;
  };
}
</syntaxhighlight>
=== Screen dimming with  wl-gammarelay-rs ===
Add <code>wl-gammarelay-rs</code> to programs.sway.extraPackages, then add the following to sway config:
<syntaxhighlight>
# start daemon
exec wl-gammarelay-rs
# bind shortcut to reset brightness
bindsym $mod+Control+0 exec busctl --user set-property rs.wl-gammarelay / rs.wl.gammarelay Brightness d 1
# bind shortcut to dim screen for a particular output
bindsym $mod+Control+Underscore exec busctl --user set-property rs.wl-gammarelay /outputs/DP_1 rs.wl.gammarelay Brightness d 0.5
</syntaxhighlight>
=== Inhibit swayidle/suspend when fullscreen ===
Add to sway config:
<syntaxhighlight>
# When you use `for_window` the command you give is not executed
# immediately. It is stored in a list and the command is executed
# every time a window opens or changes (eg. title) in a way that
# matches the criteria.
# inhibit idle for fullscreen apps
for_window [app_id="^.*"] inhibit_idle fullscreen
</syntaxhighlight>
</syntaxhighlight>
[[Category:Window managers]]
[[Category:Window managers]]
[[Category:Applications]]
[[Category:Applications]]