nixos/modules/desktop/sway.nix

310 lines
9.2 KiB
Nix
Raw Normal View History

2023-08-04 13:08:58 +02:00
{ home-manager, lib, pkgs, ... }: {
2023-08-01 15:35:09 +02:00
# https://nixos.wiki/wiki/Sway
2023-08-16 02:31:35 +02:00
# Polkit is required to configure sway with home-manager
2023-08-04 13:08:58 +02:00
security.polkit.enable = true;
2023-08-01 15:35:09 +02:00
home-manager.users.caspervk = {
wayland.windowManager.sway = {
enable = true;
2023-08-16 02:31:35 +02:00
# Execute sway with required environment variables for GTK applications
wrapperFeatures = {
gtk = true;
};
2023-08-01 15:35:09 +02:00
config = {
input = {
"type:keyboard" = {
2023-08-01 15:35:09 +02:00
xkb_layout = "us";
xkb_variant = "altgr-intl";
2023-08-04 13:08:58 +02:00
repeat_delay = "250";
};
"type:touchpad" = {
2023-08-01 15:35:09 +02:00
tap = "enabled";
natural_scroll = "enable";
2023-08-01 16:55:53 +02:00
dwt = "disabled"; # don't disable-while-typing
2023-08-01 15:35:09 +02:00
};
2023-08-12 18:44:46 +02:00
"type:pointer" = {
2023-08-16 02:31:35 +02:00
accel_profile = "flat";
2023-08-20 21:06:33 +02:00
pointer_accel = "0.4"; # pointer SPEED, not acceleration
2023-08-14 01:46:41 +02:00
};
};
output = {
"*" = {
bg = "${./img/background.png} fill";
2023-08-12 18:44:46 +02:00
};
2023-08-01 15:35:09 +02:00
};
2023-08-01 16:55:53 +02:00
modifier = "Mod4"; # super
2023-08-04 13:08:58 +02:00
keybindings = lib.mkOptionDefault {
2023-08-17 01:51:37 +02:00
# Menu
2023-08-23 23:22:12 +02:00
"Mod4+backspace" = "exec wofi";
"Mod4+p" = "exec clipman pick -t wofi";
2023-08-17 01:51:37 +02:00
# Lock
2023-08-04 13:08:58 +02:00
"Mod4+Escape" = "exec loginctl lock-session";
2023-08-17 01:51:37 +02:00
# Mod+a focuses parent, but there is no way (by default) to focus child
"Mod4+x" = "focus child";
2023-08-12 18:44:46 +02:00
# Move workspace between outputs
"Mod4+Control+Shift+h" = "move workspace to output left";
"Mod4+Control+Shift+l" = "move workspace to output right";
2023-08-04 13:08:58 +02:00
# Brightness
2023-08-20 16:22:08 +02:00
"XF86MonBrightnessUp" = "exec brightnessctl set +5%";
"XF86MonBrightnessDown" = "exec brightnessctl set -5%";
2023-08-04 13:08:58 +02:00
# Volume
2023-08-20 16:22:36 +02:00
"XF86AudioRaiseVolume" = "exec 'wpctl set-volume --limit=1.5 @DEFAULT_AUDIO_SINK@ 2%+'";
"XF86AudioLowerVolume" = "exec 'wpctl set-volume --limit=1.5 @DEFAULT_AUDIO_SINK@ 2%-'";
"XF86AudioMute" = "exec 'wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle'";
2023-08-13 19:29:18 +02:00
# Media
"XF86AudioPlay" = "exec 'playerctl play-pause'";
"XF86AudioNext" = "exec 'playerctl next'";
"XF86AudioPrev" = "exec 'playerctl previous'";
2023-08-04 13:08:58 +02:00
};
2023-08-14 01:46:41 +02:00
focus = {
followMouse = "no";
};
2023-08-21 00:30:10 +02:00
gaps = {
smartBorders = "no_gaps";
};
window = {
titlebar = false;
};
colors = {
focused = {
background = "#31447f";
border = "#31447f";
childBorder = "#31447f";
indicator = "#3bacf0";
text = "#ffffff";
};
};
2023-08-01 15:35:09 +02:00
terminal = "alacritty";
2023-08-04 13:08:58 +02:00
bars = [{ command = "${pkgs.waybar}/bin/waybar"; }];
2023-08-01 15:35:09 +02:00
};
};
2023-08-04 13:08:58 +02:00
2023-08-16 02:31:35 +02:00
# https://github.com/Alexays/Waybar/wiki/Configuration
# https://github.com/Alexays/Waybar/blob/master/resources/config
2023-08-04 13:08:58 +02:00
programs.waybar =
let
mkDefaultConfig = pkgs.stdenv.mkDerivation {
name = "waybarDefaultConfig";
src = "${pkgs.waybar}/etc/xdg/waybar";
installPhase = ''
2023-08-16 02:31:35 +02:00
# JSON isn't valid if it contains comments
2023-08-04 13:08:58 +02:00
sed 's#//.*##' config | ${pkgs.jq}/bin/jq > $out
'';
};
defaultConfig = builtins.fromJSON (lib.readFile "${mkDefaultConfig}");
in
{
enable = true;
settings = {
bar = lib.mkMerge [
defaultConfig
{
2023-08-20 21:06:33 +02:00
modules-right = lib.mkForce [ "tray" "idle_inhibitor" "pulseaudio" "backlight" "network" "battery" "clock" ];
2023-08-04 13:38:13 +02:00
battery = {
states = lib.mkForce {
warning = 15;
critical = 5;
};
};
2023-08-04 13:08:58 +02:00
clock = {
interval = 5;
locale = "da_DK.UTF-8";
format = "{:%a %e. %b %H:%M}";
calendar = {
mode = "year";
mode-mon-col = 6;
weeks-pos = "left";
};
};
}
];
};
2023-08-20 21:06:33 +02:00
# https://github.com/Alexays/Waybar/wiki/Styling
# https://github.com/Alexays/Waybar/blob/master/resources/style.css
style = ''
window#waybar {
color: white;
background-color: rgba(0, 0, 0, 0.5);
border-bottom: 1px solid rgba(0, 0, 0, 0.5);
transition-duration: 0s;
}
#workspaces button {
color: white;
box-shadow: inset 0 3px transparent;
border: none;
border-radius: 0;
}
#workspaces button.focused {
2023-08-21 00:30:10 +02:00
box-shadow: inset 0 3px #FF9E3B;
2023-08-20 21:06:33 +02:00
background-color: transparent;
}
#workspaces button:hover {
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
background: rgba(0, 0, 0, 0.25);
text-shadow: inherit;
}
#mode {
background-color: rgba(255, 255, 255, 0.4);
border: none;
}
#tray, #idle_inhibitor, #pulseaudio, #backlight, #network, #battery, #clock {
background-color: transparent;
padding: 0 10px;
}
'';
2023-08-04 13:08:58 +02:00
};
2023-08-16 02:31:35 +02:00
# https://github.com/swaywm/swaylock
2023-08-14 01:46:41 +02:00
programs.swaylock = {
enable = true;
settings = {
image = "${./img/lockscreen.png}";
};
};
2023-08-16 02:31:35 +02:00
# https://github.com/swaywm/swayidle
2023-08-04 13:08:58 +02:00
services.swayidle =
let
2023-08-14 01:46:41 +02:00
lock = "${pkgs.swaylock}/bin/swaylock --daemonize";
2023-08-04 13:08:58 +02:00
in
{
enable = true;
events = [
{ event = "lock"; command = lock; }
{ event = "before-sleep"; command = lock; }
];
timeouts = [
{ timeout = 600; command = lock; }
];
};
2023-08-13 19:43:24 +02:00
2023-08-23 23:22:12 +02:00
# https://hg.sr.ht/~scoopta/wofi
programs.wofi = {
2023-08-17 01:51:37 +02:00
enable = true;
2023-08-23 23:22:12 +02:00
settings = {
show = "drun";
allow_images = true;
gtk_dark = true;
insensitive = true;
prompt = ""; # hides 'drun' from the search bar
2023-08-17 01:51:37 +02:00
};
};
2023-08-16 02:31:35 +02:00
# https://sr.ht/~emersion/kanshi/
2023-08-13 19:43:24 +02:00
services.kanshi = {
enable = true;
profiles = {
# Output names ("criteria") from `swaymsg -t get_outputs`.
2023-08-14 02:40:13 +02:00
omega.outputs = [
2023-08-13 19:43:24 +02:00
{
criteria = "ASUSTek COMPUTER INC ROG XG27AQ M3LMQS370969";
mode = "2560x1440@144Hz";
position = "0,0";
2023-08-16 02:31:35 +02:00
adaptiveSync = false; # seems to flicker
2023-08-13 19:43:24 +02:00
}
{
criteria = "BNQ BenQ XL2411Z SCD06385SL0";
mode = "1920x1080@144Hz";
position = "2560,0";
}
];
2023-08-14 02:40:13 +02:00
zeta.outputs = [
{
criteria = "Chimei Innolux Corporation 0x14D2 Unknown";
mode = "1920x1080@60Hz";
}
];
2023-08-13 19:43:24 +02:00
};
};
2023-08-17 00:47:48 +02:00
2023-08-23 01:39:04 +02:00
# Gammestep automatically adjusts the screen's colour temperature. It's
# basically redshift for wayland.
# https://gitlab.com/chinstrap/gammastep
# https://nixos.wiki/wiki/Gammastep
services.gammastep = {
enable = true;
dawnTime = "07:00";
duskTime = "23:00";
temperature = {
day = 6500; # neutral
night = 4500;
};
};
2023-08-17 00:47:48 +02:00
home.sessionVariables = {
# The firefox-wayland package works with wayland without any further
# configuration, but tor-browser doesn't.
MOZ_ENABLE_WAYLAND = 1;
};
2023-08-01 15:35:09 +02:00
};
2023-08-16 02:31:35 +02:00
# Connect swaylock to PAM. If this isn't done, swaylock needs the suid flag
security.pam.services.swaylock.text = ''
auth include login
'';
# https://nixos.wiki/wiki/Fonts
fonts = {
fonts = with pkgs; [
# Nerd Fonts patches glyph icons, such as from Font Awesome, into existing fonts
(nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
font-awesome # waybar uses Font Awesome icons directly
];
fontDir.enable = true; # TODO?
enableDefaultFonts = true;
fontconfig.defaultFonts = {
monospace = [ "JetBrainsMonoNL Nerd Font" ]; # NL = NoLigatures
};
};
2023-08-01 15:35:09 +02:00
# Audio
2023-08-16 02:31:35 +02:00
# https://nixos.wiki/wiki/PipeWire
2023-08-01 15:35:09 +02:00
services.pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
jack.enable = true;
pulse.enable = true;
};
2023-08-21 22:17:30 +02:00
# The RealtimeKit system services allows user processes to gain realtime scheduling priority
security.rtkit.enable = true;
2023-08-16 02:31:35 +02:00
environment.systemPackages = with pkgs; [
2023-08-20 16:22:08 +02:00
brightnessctl
2023-08-16 02:31:35 +02:00
clipman # TODO
gnome3.adwaita-icon-theme # cursor TODO
grim # screenshot TODO
pavucontrol # PulseAudio Volume Control gui
playerctl # media control cli for keybinds
slurp # wayland region selector; for grim(shot)
wdisplays # gui for ad-hoc display configuration
wl-clipboard # wl-copy/wl-paste commands
wl-mirror # screen mirroing; wl-mirror (slurp -f%o -o)
2023-08-17 01:51:37 +02:00
wtype # xdotool for wayland
2023-08-16 02:31:35 +02:00
];
2023-08-01 15:35:09 +02:00
2023-08-21 22:18:07 +02:00
# xdg portal allows applications secury access to resources outside their sandbox.
# In particular, this allows screen sharing on Wayland via PipeWire and file open/save dialogues in Firefox.
# https://wiki.archlinux.org/title/XDG_Desktop_Portal
# https://mozilla.github.io/webrtc-landing/gum_test.html
xdg.portal = {
enable = true;
wlr.enable = true;
};
2023-08-01 16:49:22 +02:00
hardware.opengl = {
enable = true;
2023-08-01 16:55:53 +02:00
extraPackages = with pkgs; [ intel-media-driver ];
2023-08-01 16:49:22 +02:00
};
2023-08-01 15:35:09 +02:00
}