Sway: Difference between revisions
imported>Dkrejsa Without 'pkgs.dbus' in envionrment.systemPackages, dbus-update-activation-environment is not available in the path |
→Systemd services: Original snippet does not allow kanshi to connect to the display |
||
(21 intermediate revisions by 11 users not shown) | |||
Line 2: | Line 2: | ||
[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 == | ||
You can install Sway by enabling it in NixOS directly, or by using [[Home Manager]] | 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"> | <syntaxhighlight lang="nix"> | ||
{ config, pkgs, lib, ... }: | { config, pkgs, lib, ... }: | ||
{ | { | ||
environment.systemPackages = with pkgs; [ | environment.systemPackages = with pkgs; [ | ||
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 | ||
mako # notification system developed by swaywm maintainer | 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; | |||
# | |||
# | |||
services. | |||
# enable | # enable Sway window manager | ||
programs.sway = { | programs.sway = { | ||
enable = true; | enable = true; | ||
Line 98: | Line 28: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
A few general comments: | A few general comments: | ||
* There is some friction between GTK theming and | * 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 | * 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] | ||
=== Using Home Manager === | === Using Home Manager === | ||
Line 144: | Line 58: | ||
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 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] | ||
=== 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://sr.ht/~emersion/kanshi/], which implements monitor hot swapping. It would be enabled as follows: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
# kanshi systemd service | |||
systemd.user.services.kanshi = { | |||
description = "kanshi daemon"; | |||
environment = { | |||
WAYLAND_DISPLAY="wayland-1"; | |||
DISPLAY = ":0"; | |||
}; | |||
serviceConfig = { | |||
Type = "simple"; | |||
ExecStart = ''${pkgs.kanshi}/bin/kanshi -c kanshi_config_file''; | |||
}; | |||
}; | |||
</nowiki>}} | |||
{{file|sway config|bash| | |||
# 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 [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>}} | |||
== 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> | |||
=== High-DPI scaling === | |||
Changing scale for all screens to factor 1.5<syntaxhighlight lang="console"> | |||
output * scale 1.5 | |||
</syntaxhighlight> | |||
=== Brightness and volume === | === Brightness and volume === | ||
Line 150: | Line 117: | ||
users.users.yourusername.extraGroups = [ "video" ]; | users.users.yourusername.extraGroups = [ "video" ]; | ||
programs.light.enable = true; | programs.light.enable = true; | ||
environment.systemPackages = [ pkgs.pulseaudio ]; | |||
</nowiki>}} | </nowiki>}} | ||
Line 164: | Line 131: | ||
bindsym XF86AudioMute exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle' | bindsym XF86AudioMute exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle' | ||
}} | }} | ||
== Troubleshooting == | == Troubleshooting == | ||
Line 211: | Line 159: | ||
=== Missing fonts on Xorg applications === | === 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 | 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> | <syntaxhighlight lang="nix> | ||
Line 255: | Line 203: | ||
Enabling this option allows any program run by the "users" group to request real-time priority. | 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> | |||
=== Touchscreen input bound to the wrong monitor in multi-monitor setups === | |||
See this [https://github.com/swaywm/sway/issues/6590#issue-1021207180 GitHub issue for Sway] and the solution give in [https://github.com/swaywm/sway/issues/6590#issuecomment-938724355 this response]. | |||
Using [[Home Manager]] add the following to your Sway configuration: | |||
<syntaxhighlight lang="nix"> | |||
wayland.windowManager.sway = { | |||
[...] | |||
config = { | |||
[...] | |||
input = { | |||
[...] | |||
"type:touch" = { | |||
# Replace touchscreen_output_identifier with the identifier of your touchscreen. | |||
map_to_output = touchscreen_output_identifier; | |||
}; | |||
}; | |||
}; | |||
}; | |||
</syntaxhighlight> | |||
== Tips and tricks == | |||
=== Toggle monitor modes script === | |||
Following script toggles screen / monitor modes if executed. It can also be mapped to a specific key in Sway. | |||
First add the Flake input required for the script<syntaxhighlight lang="nix"> | |||
{ | |||
inputs = { | |||
[...] | |||
wl-togglescreens.url = "git+https://git.project-insanity.org/onny/wl-togglescreens.git?ref=main"; | |||
}; | |||
outputs = {self, nixpkgs, ...}@inputs: { | |||
nixosConfigurations.myhost = inputs.nixpkgs.lib.nixosSystem { | |||
system = "x86_64-linux"; | |||
specialArgs.inputs = inputs; | |||
[...] | |||
</syntaxhighlight>Map the script binary to a specific key<syntaxhighlight lang="nix"> | |||
{ config, pkgs, lib, inputs, ... }:{ | |||
home-manager.users.onny = { | |||
programs = { | |||
[...] | |||
wayland.windowManager.sway = { | |||
enable = true; | |||
config = { | |||
[...] | |||
keybindings = lib.mkOptionDefault{ | |||
[...] | |||
"XF86Display" = "exec ${inputs.wl-togglescreens.packages.x86_64-linux.wl-togglescreens}/bin/wl-togglescreens"; | |||
}; | |||
}; | |||
}; | |||
}; | |||
</syntaxhighlight> | |||
[[Category:Window managers]] | [[Category:Window managers]] | ||
[[Category:Applications]] | [[Category:Applications]] |