Sway: Difference between revisions

Axka (talk | contribs)
m nix->NixOS
Tie-ling (talk | contribs)
dimming, screen sharing, inhibit idle
 
(9 intermediate revisions by 7 users not shown)
Line 29: Line 29:
</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>.
</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 simlinked 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.
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 97: 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>}}
</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>


== Configuration ==
== Configuration ==
Line 113: Line 126:


=== Keyboard layout ===
=== Keyboard layout ===
Changing layout for all keyboards to German (de)<syntaxhighlight lang="console">
Changing layout for all keyboards to German (de):<syntaxhighlight lang="console">
input * xkb_layout "de"
input * xkb_layout "de"
</syntaxhighlight>The same thing accomplished in Home Manager:<syntaxhighlight lang="nix">
wayland.windowManager.sway.input."*".xkb_layout = "de";
</syntaxhighlight>
</syntaxhighlight>


=== 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 lang="console">
output * scale 1.5
output * scale 1.5
</syntaxhighlight>
</syntaxhighlight>
Line 144: Line 159:
== 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>
 
In ~/.config/sway/config
<syntaxhighlight>
seat "*" xcursor_theme Adwaita 32
</syntaxhighlight>


<syntaxhighlight lang="nix>
==== 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 160: Line 190:
         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 216: Line 245:


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>


Line 279: Line 310:
       };
       };
     };
     };
</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]]