Sway: Difference between revisions

Phobos (talk | contribs)
m Added a section on automounting
DHCP (talk | contribs)
style fixes
 
(9 intermediate revisions by 2 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 can work with an existing i3 configuration and supports most of i3's features, plus a few extras.  
[https://swaywm.org/ 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. For users migrating from i3, see the [https://github.com/swaywm/sway/wiki/i3-Migration-Guide i3 migration guide].
[https://github.com/swaywm/sway/wiki/i3-Migration-Guide i3 migration guide]


== Setup ==
== Setup ==
Line 11: Line 10:
{
{
   environment.systemPackages = with pkgs; [
   environment.systemPackages = with pkgs; [
    grim # screenshot functionality
     wl-clipboard # Copy/Paste functionality.
    slurp # screenshot functionality
     mako # Notification utility.
     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.
   # Enables Gnome Keyring to store secrets for applications.  
  # Will be exposed through DBus to programs willing to store secrets.
   services.gnome.gnome-keyring.enable = true;
   services.gnome.gnome-keyring.enable = true;


   # enable Sway window manager
   # Enable Sway.
   programs.sway = {
   programs.sway = {
     enable = true;
     enable = true;
Line 46: Line 42:
Then you may enable Sway in your Home Manager configuration. Here is a minimal example:
Then you may enable Sway in your Home Manager configuration. Here is a minimal example:


{{File|3=wayland.windowManager.sway = {
{{File|3=
    enable = true;
wayland.windowManager.sway = {
    wrapperFeatures.gtk = true; # Fixes common issues with GTK 3 apps
  enable = true;
    config = rec {
  wrapperFeatures.gtk = true; # Fixes common issues with GTK 3 apps
      modifier = "Mod4";
  config = rec {
      # Use kitty as default terminal
    modifier = "Mod4";
      terminal = "kitty";  
    # Use kitty as default terminal
      startup = [
    terminal = "kitty";
        # Launch Firefox on start
    startup = [
        {command = "firefox";}
      # Launch Firefox on start
      ];
      { command = "firefox"; }
    };
    ];
  };|name=/etc/nixos/home.nix|lang=nix}}
  };
};
|name=/etc/nixos/home.nix|lang=nix}}


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


=== Systemd services ===
=== 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 [https://gitlab.freedesktop.org/emersion/kanshi], which implements monitor hot swapping. It would be enabled as follows:
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://gitlab.freedesktop.org/emersion/kanshi], which implements monitor hot swapping. It would be enabled as follows:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  # kanshi systemd service
# kanshi systemd service
  systemd.user.services.kanshi = {
systemd.user.services.kanshi = {
    description = "kanshi daemon";
  description = "kanshi daemon";
    environment = {
  environment = {
      WAYLAND_DISPLAY="wayland-1";
    WAYLAND_DISPLAY="wayland-1";
      DISPLAY = ":0";
    DISPLAY = ":0";
    };  
  };  
    serviceConfig = {
  serviceConfig = {
      Type = "simple";
    Type = "simple";
      ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
    };
   };
   };
};
</nowiki>}}
</nowiki>}}


Line 128: Line 119:
'';
'';
</syntaxhighlight>When launched directly from the TTY, Sway will not inherit the user environment. This may 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>
</syntaxhighlight>When launched directly from the TTY, Sway will not inherit the user environment. This may 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"];
wayland.windowManager.sway.systemd.variables = ["--all"];
</nowiki>}}
</nowiki>}}
=== Secret Service ===
It is recommended to enable a secret service provider such as [https://wiki.gnome.org/Projects/GnomeKeyring Gnome Keyring]. For more information on secret services check the [[Secret Service]] page.
Install and enable:
{{File|3=services.gnome.gnome-keyring.enable = true;|name=/etc/nixos/configuration.nix|lang=nix}}
In order to unlock the keyring through logins from greeters and screen locking utilities you will need to enable them through PAM.
{{File|3=security.pam.services = {
  greetd.enableGnomeKeyring = true;
  swaylock.enableGnomeKeyring = true;
  # If using a display manager such as GDM
  #gdm.enableGnomeKeyring = true;
};|name=/etc/nixos/configuration.nix|lang=nix}}


== Configuration ==
== Configuration ==
Line 135: Line 140:


=== Keyboard layout ===
=== Keyboard layout ===
Changing layout for all keyboards to German (de):<syntaxhighlight lang="console">
Changing layout for all keyboards to German (de):
<syntaxhighlight>
input * xkb_layout "de"
input * xkb_layout "de"
</syntaxhighlight>The same thing accomplished in Home Manager:<syntaxhighlight lang="nix">
</syntaxhighlight>The same thing accomplished in Home Manager:<syntaxhighlight lang="nix">
Line 142: Line 148:


=== High-DPI scaling ===
=== High-DPI scaling ===
Changing scale for all screens to factor 1.5:<syntaxhighlight lang="console">
Changing scale for all screens to factor 1.5:<syntaxhighlight>
output * scale 1.5
output * scale 1.5
</syntaxhighlight>
</syntaxhighlight>
Line 181: Line 187:
};|name=/etc/nixos/home.nix|lang=nix}}For an on screen display for audio and brightness, check [[swayosd]].
};|name=/etc/nixos/home.nix|lang=nix}}For an on screen display for audio and brightness, check [[swayosd]].


=== Touchpad ===
=== Input ===
 
==== Touchpad ====
See the [https://www.mankier.com/5/sway-input sway-input man page] for options.
See the [https://www.mankier.com/5/sway-input sway-input man page] for options.
{{File|3=wayland.windowManager.sway =  
{{File|3=
   {
wayland.windowManager.sway = {
    enable = true;
   enable = true;
    config.input = {
  config.input = {
      "type:touchpad" = {
    "type:touchpad" = {
        # Enables or disables tap for specified input device.
      # Enables or disables tap for specified input device.
        tap = "enabled";
      tap = "enabled";
        # Enables or disables natural (inverted) scrolling for the specified input device.
      # Enables or disables natural (inverted) scrolling for the specified input device.
        natural_scroll = "enabled";
      natural_scroll = "enabled";
        # Enables or disables disable-while-typing for the specified input device.
      # Enables or disables disable-while-typing for the specified input device.
        dwt = "enabled";
      dwt = "enabled";
      };
     };
     };
   };|name=/etc/nixos/home.nix|lang=nix}}
   };
};
|name=/etc/nixos/home.nix|lang=nix}}


== Troubleshooting ==
== Troubleshooting ==
Line 221: Line 230:


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


sway.enable = true;
};|name=/etc/nixos/home.nix|lang=nix}}
};|name=/etc/nixos/home.nix|lang=nix}}


Line 238: Line 246:


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


Line 262: Line 268:


<syntaxhighlight lang="nix>
<syntaxhighlight lang="nix>
  security.pam.services.swaylock = {};
security.pam.services.swaylock = {};
</syntaxhighlight>
</syntaxhighlight>


Line 299: Line 305:
Using [[Home Manager]] add the following to your Sway configuration:
Using [[Home Manager]] add the following to your Sway configuration:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
  wayland.windowManager.sway = {
wayland.windowManager.sway = {
    [...]
  [...]
    config = {
  config = {
      [...]
    [...]
      input = {
    input = {
        [...]
      [...]
        "type:touch" = {
      "type:touch" = {
          # Replace touchscreen_output_identifier with the identifier of your touchscreen.
        # Replace touchscreen_output_identifier with the identifier of your touchscreen.
          map_to_output = touchscreen_output_identifier;
        map_to_output = touchscreen_output_identifier;
        };
      };
      };
    };
    };
  };
  };
};
</syntaxhighlight>
</syntaxhighlight>


Line 358: Line 364:
     };
     };
</syntaxhighlight>
</syntaxhighlight>
=== Screenshots ===
Screenshots using grim, slurp, and [https://github.com/XodTech/grimshot grimshot] for selection screenshots/full screen screenshots.
Install tools
{{File|3=environment.systemPackages = with pkgs; [
  grim
  slurp
  sway-contrib.grimshot
];|name=/etc/nixos/configuration.nix|lang=nix}}
Example Home Manager configuration.
{{File|3=wayland.windowManager.sway = {
  enable = true;
  config = let
    modifier = config.wayland.windowManager.sway.config.modifier;
    in {
    modifier = "Mod4";
    keybindings = lib.mkOptionDefault {
      # Super + Shift + S
      # Screenshot a selection that saves to ~/Screenshots and copies to clipboard.
      "${modifier}+Shift+s" = "exec selection=$(slurp) && grim -g \"$selection\" - {{!}} tee ~/Screenshots/$(date +%Y-%m-%d_%H-%M-%S).png {{!}} wl-copy";
     
      # Print Screen Button
      # Screenshot the currently focused screen, save to ~/Screenshots and copy to clipboard.
      "Print" = "exec grimshot save output - {{!}} tee ~/Screenshots/$(date +%Y-%m-%d_%H-%M-%S).png {{!}} wl-copy";
    };
  };
};|name=/etc/nixos/home.nix|lang=nix}}


=== Screen sharing ===
=== Screen sharing ===
Line 374: Line 410:
}|name=/etc/nixos/configuration.nix|lang=nix}}{{Tip|Make sure that you do not have conflicting definitions for xdg.portal in Home Manager.}}
}|name=/etc/nixos/configuration.nix|lang=nix}}{{Tip|Make sure that you do not have conflicting definitions for xdg.portal in Home Manager.}}


=== Auto mounting USB storage devices (e.g. Flash Drives) ===
=== Auto mounting ===
 
==== USB storage devices (e.g. Flash Drives) ====
You can use [https://github.com/coldfix/udiskie udiskie] to automatically mount external storage medias.
You can use [https://github.com/coldfix/udiskie udiskie] to automatically mount external storage medias.


Line 384: Line 422:


See related info on [[USB storage devices]].
See related info on [[USB storage devices]].
==== MTP (Android Phone Storage) ====
File managers that support [https://wiki.gnome.org/Projects/gvfs GVfs], such as [[Thunar]], can mount MTP devices using GVfs. See the page on [[MTP]] for related information.
{{File|3=services.gvfs.enable = true;|name=/etc/nixos/configuration.nix|lang=nix}}
=== SwayFX ===
[https://github.com/WillPower3309/swayfx SwayFX] is a fork of Sway that adds eye-candy effects, installing it is as simple as replacing your Sway package with SwayFX. Check the [[SwayFX]] page on the wiki for additional details.
{{File|3=wayland.windowManager.sway = {
  enable = true;
  package = pkgs.swayfx;
 
  # Needed to build without errors.
  checkConfig = false;
   
  # SwayFX options must be configured through extraConfig.
  extraConfig = ''
    shadows enable
    corner_radius 11
    blur_radius 7
    blur_passes 2
  '';
};|name=/etc/nixos/home.nix|lang=nix}}


=== Screen dimming with wl-gammarelay-rs ===
=== Screen dimming with wl-gammarelay-rs ===
Add <code>wl-gammarelay-rs</code> to programs.sway.extraPackages, then add the following to sway config:
Add <code>wl-gammarelay-rs</code> to <code>programs.sway.extraPackages</code>, then add the following to sway config:
<syntaxhighlight>
<syntaxhighlight>
# start daemon
# start daemon