Jump to content

Sway: Difference between revisions

imported>Danielbarter
mNo edit summary
 
(32 intermediate revisions by 25 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.


Here is a minimal configuration where everything you would expect (like screen sharing and gtk themes) work:
=== Using NixOS ===
Here is a minimal configuration:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
{ config, pkgs, lib, ... }:
{ config, pkgs, lib, ... }:
let
  # bash script to let dbus know about important env variables and
  # propagate them to relevent services run at the end of sway config
  # see
  # https://github.com/emersion/xdg-desktop-portal-wlr/wiki/"It-doesn't-work"-Troubleshooting-Checklist
  # note: this is pretty much the same as  /etc/sway/config.d/nixos.conf but also restarts 
  # some user services to make sure they have the correct environment variables
  dbus-sway-environment = pkgs.writeTextFile {
    name = "dbus-sway-environment";
    destination = "/bin/dbus-sway-environment";
    executable = true;
    text = ''
  dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway
  systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr
  systemctl --user start pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr
      '';
  };
  # currently, there is some friction between sway and gtk:
  # https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland
  # the suggested way to set gtk settings is with gsettings
  # for gsettings to work, we need to tell it where the schemas are
  # using the XDG_DATA_DIR environment variable
  # run at the end of sway config
  configure-gtk = pkgs.writeTextFile {
      name = "configure-gtk";
      destination = "/bin/configure-gtk";
      executable = true;
      text = let
        schema = pkgs.gsettings-desktop-schemas;
        datadir = "${schema}/share/gsettings-schemas/${schema.name}";
      in ''
        export XDG_DATA_DIRS=${datadir}:$XDG_DATA_DIRS
        gnome_schema=org.gnome.desktop.interface
        gsettings set $gnome_schema gtk-theme 'Dracula'
        '';
  };
in
{
{
   environment.systemPackages = with pkgs; [
   environment.systemPackages = with pkgs; [
    alacritty # gpu accelerated terminal
    sway
    dbus-sway-environment
    configure-gtk
    wayland
    glib # gsettings
    dracula-theme # gtk theme
    gnome3.adwaita-icon-theme  # default gnome cursors
    swaylock
    swayidle
     grim # screenshot functionality
     grim # screenshot functionality
     slurp # screenshot functionality
     slurp # screenshot functionality
     wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
     wl-clipboard # wl-copy and wl-paste for copy/paste from stdin / stdout
    bemenu # wayland clone of dmenu
     mako # notification system developed by swaywm maintainer
     mako # notification system developed by swaywm maintainer
   ];
   ];


 
   # Enable the gnome-keyring secrets vault.  
  services.pipewire = {
   # Will be exposed through DBus to programs willing to store secrets.
    enable = true;
   services.gnome.gnome-keyring.enable = true;
    alsa.enable = true;
    pulse.enable = true;
  };
 
 
  # xdg-desktop-portal works by exposing a series of D-Bus interfaces
   # known as portals under a well-known name
  # (org.freedesktop.portal.Desktop) and object path
   # (/org/freedesktop/portal/desktop).
  # The portal interfaces include APIs for file access, opening URIs,
  # printing and others.
   services.dbus.enable = true;
  xdg.portal = {
    enable = true;
    wlr.enable = true;
    # gtk portal needed to make gtk apps happy
    extraPortals = [ pkgs.xdg-desktop-portal-gtk ];
    gtkUsePortal = true;
  };


   # enable sway window manager
   # enable sway window manager
Line 99: Line 29:
</syntaxhighlight>
</syntaxhighlight>


and here are the relevent things you should add to your sway config:
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 [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]


{{file|sway config|bash|
=== Using Home Manager ===
 
To set up Sway using [[Home Manager]], first you must enable [[Polkit]] in your nix configuration:
set $menu bemenu-run
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
 
security.polkit.enable = true;
# screenshots
</nowiki>}}
bindsym $mod+c exec grim  -g "$(slurp)" /tmp/$(date +'%H:%M:%S.png')
Then you can enable Sway in your home manager configuration. Here is a minimal example:
<syntaxhighlight lang="nix>
  wayland.windowManager.sway = {
    enable = true;
    config = rec {
      modifier = "Mod4";
      # Use kitty as default terminal
      terminal = "kitty";
      startup = [
        # Launch Firefox on start
        {command = "firefox";}
      ];
    };
  };
</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.


exec dbus-sway-environment
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]
exec configure-gtk
 
}}
 
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 [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]
* This wiki page was gutted and rewritten in June 2022. See [https://discourse.nixos.org/t/some-lose-ends-for-sway-on-nixos-which-we-should-fix/17728] for the related discussion.


=== Brightness and volume ===
=== Brightness and volume ===
Line 140: Line 80:


=== Systemd services ===
=== Systemd services ===
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:
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:
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
   # kanshi systemd service
   # kanshi systemd service
Line 147: Line 87:
     serviceConfig = {
     serviceConfig = {
       Type = "simple";
       Type = "simple";
       ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file';
       ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file'';
     };
     };
   };
   };
Line 158: Line 98:
When you launch sway, the systemd service is started.  
When you launch sway, the systemd service is started.  


=== 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.
Tuigreet does not even need a separate compositor to launch.
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
services.greetd = {                                                     
  enable = true;                                                       
  settings = {                                                         
    default_session = {                                                 
      command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd sway";
      user = "greeter";                                                 
    };                                                                 
  };                                                                   
};                                                                     
</nowiki>}}
== Troubleshooting ==
=== Cursor is too tiny on HiDPI displays ===
Using [[Home Manager]] try configuring a general mouse cursor size and theme
<syntaxhighlight lang="nix>
home-manager.users.myUser = {
    home.pointerCursor = {
      name = "Adwaita";
      package = pkgs.gnome.adwaita-icon-theme;
      size = 24;
      x11 = {
        enable = true;
        defaultCursor = "Adwaita";
      };
    };
};
</syntaxhighlight>
Replace <code>myUser</code> 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
<syntaxhighlight lang="nix>
  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" ];
    };
  };
</syntaxhighlight>
=== Swaylock cannot be unlocked with the correct password ===
Add the following to your NixOS configuration.
<syntaxhighlight lang="nix>
  security.pam.services.swaylock = {};
</syntaxhighlight>
The <code>programs.sway.enable</code> option does this automatically.
=== Inferior performance compared to other distributions ===
Enabling realtime may improve latency and reduce stuttering, specially in high load scenarios.
<syntaxhighlight lang="nix">
security.pam.loginLimits = [
  { domain = "@users"; item = "rtprio"; type = "-"; value = 1; }
];
</syntaxhighlight>
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. 
<syntaxhighlight lang="nix">
hardware.opengl.enable = true;
</syntaxhighlight>
[[Category:Window managers]]
[[Category:Window managers]]
[[Category:Applications]]
4

edits