Difference between revisions of "Sway"
From NixOS Wiki
m (pactl is not in the nixpkgs, enable pulseaudio instead) |
Danielbarter (talk | contribs) |
||
Line 1: | Line 1: | ||
− | Sway is a tiling | + | 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. |
[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 == | == Installation == | ||
− | === | + | Here is a minimal configuration where everything you would expect (like screen sharing and gtk themes) work: |
− | + | <syntaxhighlight lang="nix"> | |
+ | { config, pkgs, lib, ... }: | ||
+ | |||
+ | let | ||
+ | # bash script to let dbus know about important env variables and | ||
+ | # propogate 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; [ | |
− | + | 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 | swaylock | ||
swayidle | swayidle | ||
− | wl-clipboard | + | grim # screenshot functionality |
− | + | slurp # screenshot functionality | |
− | + | 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 | ||
]; | ]; | ||
− | |||
+ | |||
+ | services.pipewire = { | ||
+ | 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 | ||
+ | programs.sway = { | ||
+ | enable = true; | ||
+ | wrapperFeatures.gtk = true; | ||
+ | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | and here are the relevent things you should add to your sway config: | |
− | |||
− | + | {{file|sway config|bash| | |
− | + | ||
− | + | set $menu bemenu-run | |
− | + | ||
− | + | # screenshots | |
− | + | bindsym $mod+c exec grim -g "$(slurp)" /tmp/$(date +'%H:%M:%S.png') | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | exec dbus-sway-environment | |
+ | exec configure-gtk | ||
− | + | }} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Brightness and volume === | === Brightness and volume === | ||
− | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
− | |||
users.users.yourusername.extraGroups = [ "video" ]; | users.users.yourusername.extraGroups = [ "video" ]; | ||
# or | # or | ||
Line 94: | Line 128: | ||
# Brightness | # Brightness | ||
− | bindsym XF86MonBrightnessDown exec | + | bindsym XF86MonBrightnessDown exec light -U 10 |
− | bindsym XF86MonBrightnessUp exec | + | bindsym XF86MonBrightnessUp exec light -A 10 |
# Volume | # Volume | ||
Line 103: | Line 137: | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Additional packages === | === Additional packages === | ||
Line 187: | Line 147: | ||
{{app|wofi|Launcher/menu program for wlroots based wayland compositors such as sway|https://hg.sr.ht/~scoopta/wofi|wofi}} | {{app|wofi|Launcher/menu program for wlroots based wayland compositors such as sway|https://hg.sr.ht/~scoopta/wofi|wofi}} | ||
{{app|flashfocus|Simple focus animations for tiling window managers|https://github.com/fennerm/flashfocus|flashfocus}} | {{app|flashfocus|Simple focus animations for tiling window managers|https://github.com/fennerm/flashfocus|flashfocus}} | ||
− | |||
{{app|i3-ratiosplit|Configurable window size on creation|https://github.com/333fred/i3-ratiosplit|i3-ratiosplit}} | {{app|i3-ratiosplit|Configurable window size on creation|https://github.com/333fred/i3-ratiosplit|i3-ratiosplit}} | ||
Line 193: | Line 152: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
[[Category:Window managers]] | [[Category:Window managers]] |
Revision as of 15:54, 4 June 2022
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
Here is a minimal configuration where everything you would expect (like screen sharing and gtk themes) work:
{ config, pkgs, lib, ... }:
let
# bash script to let dbus know about important env variables and
# propogate 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; [
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
slurp # screenshot functionality
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
];
services.pipewire = {
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
programs.sway = {
enable = true;
wrapperFeatures.gtk = true;
};
and here are the relevent things you should add to your sway config:
sway config
set $menu bemenu-run
# screenshots
bindsym $mod+c exec grim -g "$(slurp)" /tmp/$(date +'%H:%M:%S.png')
exec dbus-sway-environment
exec configure-gtk
Brightness and volume
/etc/nixos/configuration.nix
users.users.yourusername.extraGroups = [ "video" ];
# or
programs.light.enable = true;
hardware.pulseaudio.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'
Additional packages
- waybar — Highly customizable Wayland bar for Sway and Wlroots based compositors
- autotiling — Script for sway and i3 to automatically switch the horizontal / vertical window split orientation
- gammastep — Reduces bluelight and saves your eyes
- clipman — Simple clipboard manager for Wayland
- wofi — Launcher/menu program for wlroots based wayland compositors such as sway
- flashfocus — Simple focus animations for tiling window managers
- i3-ratiosplit — Configurable window size on creation
more packages here i3 migration guide