nixos_config/home/wm/sway.nix
2026-02-01 15:53:16 +01:00

510 lines
17 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ pkgs, config, hostName, lib, ... }:
let
# execs
uwsm = "${pkgs.uwsm}/bin/uwsm-app --";
swaymsg = "${pkgs.sway}/bin/swaymsg";
lock = "${pkgs.swaylock}/bin/swaylock --daemonize";
term = "${pkgs.kitty}/bin/kitty";
notify = "${pkgs.libnotify}/bin/notify-send";
nag = "${pkgs.sway}/bin/swaynag --edge bottom";
dmenu = "${pkgs.rofi-unwrapped}/bin/rofi";
espanso = "${pkgs.espanso-wayland}/bin/espanso cmd";
# keybinds
key_mod = "Mod4";
key_mod_misc = "Alt";
key_left = "Left";
key_right = "Right";
key_up = "Up";
key_down = "Down";
# other
display = status: "${swaymsg} 'output * power ${status}'";
hostnameOutput =
if hostName == "tower" then {
# Left monitor
DP-1 = {
mode = "1920x1080@143.981Hz";
transform = "90";
position = "0 0";
};
# Main monitor
DP-2 = {
mode = "3440x1440@99.982Hz";
position = "1080 250";
};
# Right monitor
DP-3 = {
mode = "1920x1080@143.981Hz";
position = "4520 250";
};
}
else if hostName == "electra" then {}
else {};
hostnameWorkspaceAssign =
if hostName == "tower" then [
{ output = "DP-2"; workspace = "1"; }
{ output = "DP-2"; workspace = "2"; }
{ output = "DP-2"; workspace = "3"; }
{ output = "DP-3"; workspace = "4"; }
{ output = "DP-3"; workspace = "5"; }
{ output = "DP-3"; workspace = "6"; }
{ output = "DP-1"; workspace = "7"; }
{ output = "DP-1"; workspace = "8"; }
{ output = "DP-1"; workspace = "9"; }
]
else if hostName == "electra" then []
else [];
hostnameServices =
if hostName == "tower" then {}
else if hostName == "electra" then {
swayidle = {
enable = true;
timeouts = [
{
timeout = 120;
command = "${notify} 'Locking in 5 seconds' -t 5000";
}
{
timeout = 125;
command = lock;
}
{
timeout = 125;
command = display "off";
resumeCommand = display "on";
}
{
timeout = 600;
command = "${pkgs.systemd}/bin/systemctl suspend";
}
]; # end timeouts
events = [
{
event = "before-sleep";
command = "display off; systemctl --user stop libinput-gestures; ${lock}";
}
{
event = "after-resume";
command = "display on; systemctl --user start libinput-gestures";
}
{
event = "lock";
command = (display "off") + "; " + lock;
}
{
event = "unlock";
command = display "on";
}
]; # end events
}; # end swayidle
}
else {};
hostnameInput1 =
if hostName == "tower" then "us"
else "se";
hostnameInput2 =
if hostName == "tower" then "se"
else "us";
in
{
wayland.windowManager.sway = {
enable = true;
wrapperFeatures.gtk = true;
config = {
modifier = "${key_mod}";
startup = [
{ command = "systemctl --user start libinput-gestures"; }
{ command = ''${uwsm} swaybg -m fill -i /home/alisceon/Pictures/system/bg.png'';}
];
bars = [ ];
input = {
"type:touchpad" = {
dwt = "enabled";
tap = "enabled";
natural_scroll = "disabled";
middle_emulation = "enabled";
click_method = "clickfinger";
clickfinger_button_map = "lrm";
scroll_factor = "0.6";
};
"type:mouse" = {
natural_scroll = "disabled";
accel_profile = "flat";
pointer_accel = "0.5";
};
"*" = {
xkb_layout = "${hostnameInput1},${hostnameInput2}";
xkb_options = "grp:win_space_toggle";
};
}; # end input
keybindings = {
# Workspaces
"${key_mod}+f" = "fullscreen";
"${key_mod}+Shift+f" = "floating toggle";
"${key_mod}+1" = "workspace number 1";
"${key_mod}+2" = "workspace number 2";
"${key_mod}+3" = "workspace number 3";
"${key_mod}+4" = "workspace number 4";
"${key_mod}+5" = "workspace number 5";
"${key_mod}+6" = "workspace number 6";
"${key_mod}+7" = "workspace number 7";
"${key_mod}+8" = "workspace number 8";
"${key_mod}+9" = "workspace number 9";
"${key_mod}+0" = "scratchpad show";
"${key_mod}+Shift+1" = "move container to workspace number 1; workspace 1";
"${key_mod}+Shift+2" = "move container to workspace number 2; workspace 2";
"${key_mod}+Shift+3" = "move container to workspace number 3; workspace 3";
"${key_mod}+Shift+4" = "move container to workspace number 4; workspace 4";
"${key_mod}+Shift+5" = "move container to workspace number 5; workspace 5";
"${key_mod}+Shift+6" = "move container to workspace number 6; workspace 6";
"${key_mod}+Shift+7" = "move container to workspace number 7; workspace 7";
"${key_mod}+Shift+8" = "move container to workspace number 8; workspace 8";
"${key_mod}+Shift+9" = "move container to workspace number 9; workspace 9";
"${key_mod}+Shift+0" = "move container to scratchpad; scratchpad show";
"${key_mod}+Ctrl+1" = "move container to workspace number 1";
"${key_mod}+Ctrl+2" = "move container to workspace number 2";
"${key_mod}+Ctrl+3" = "move container to workspace number 3";
"${key_mod}+Ctrl+4" = "move container to workspace number 4";
"${key_mod}+Ctrl+5" = "move container to workspace number 5";
"${key_mod}+Ctrl+6" = "move container to workspace number 6";
"${key_mod}+Ctrl+7" = "move container to workspace number 7";
"${key_mod}+Ctrl+8" = "move container to workspace number 8";
"${key_mod}+Ctrl+9" = "move container to workspace number 9";
"${key_mod}+Ctrl+0" = "move container to scratchpad";
# Focus
"${key_mod}+${key_left}" = "focus left";
"${key_mod}+${key_right}" = "focus right";
"${key_mod}+${key_down}" = "focus down";
"${key_mod}+${key_up}" = "focus up";
# Move
"${key_mod}+Shift+${key_left}" = "move left";
"${key_mod}+Shift+${key_down}" = "move down";
"${key_mod}+Shift+${key_up}" = "move up";
"${key_mod}+Shift+${key_right}" = "move right";
# Sparkly alt-tab
"${key_mod}+Tab" = "focus right";
"${key_mod}+Shift+Tab" = "focus left";
"${key_mod}+Ctrl+Tab" = "move right";
"${key_mod}+Ctrl+Shift+Tab" = "move left";
"${key_mod}+${key_mod_misc}+Tab" = "workspace next";
"${key_mod}+${key_mod_misc}+Shift+Tab" = "workspace prev";
# System
"Mod4+space" = ''exec ${notify} -t 2000 "$(xonsh ~/.nixos_config/util/get_xkb.xsh)"'';
"${key_mod}+Shift+r" = "reload";
"${key_mod}+Ctrl+r" = "restart";
"${key_mod}+Shift+Backspace" = "exec ${nag} -m 'TuneD profiles:' -Z 'Performance' 'tuned-adm profile accelerator-performance' -Z 'Balanced' 'tuned-adm profile balanced' -Z 'Power Save' 'tuned-adm profile powersave'";
"${key_mod}+Shift+q" = "kill";
"Alt+F4" = "kill";
# Locking and idle
"${key_mod}+L" = "exec ${lock}";
"${key_mod}+Escape" = "exec ${nag} -m 'Shutdown options:' -Z 'Power Off' 'systemctl poweroff' -Z 'Reboot' 'systemctl reboot' -Z 'Logout' 'swaymsg exit'";
# Apps
"${key_mod}+Return" = ''exec "${uwsm} ${term}"'';
"${key_mod}+d" = ''exec "${uwsm} ${dmenu} -show drun"'';
"${key_mod}+e" = ''exec "${uwsm} ${espanso} search"'';
"${key_mod}+Shift+e" = ''exec "${uwsm} ${espanso} toggle"'';
# Screenshot region
"${key_mod}+Shift+s" = "exec grimshot savecopy area";
"${key_mod}+Ctrl+s" = "exec grimshot savecopy output";
# media keys
"XF86AudioRaiseVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ +3%'";
"XF86AudioLowerVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ -3%'";
"XF86AudioMute" = "exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle'";
"XF86AudioPlay" = "exec 'playerctl play-pause'";
"XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 9";
"XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 3";
}; # end keybindings
window = {
titlebar = false;
commands = [
{ criteria = { all = true; }; command = "inhibit_idle fullscreen"; }
];
}; # end window
assigns = {
"1" = [{app_id = "chromium";}];
"2" = [{class = "steam";}];
"3" = [];
"4" = [{class = "Code";}];
"5" = [{app_id = "obsidian";}];
"6" = [];
"7" = [];
"8" = [{app_id = "discord";}];
"9" = [{app_id = "signal";}];
};
output = {} // hostnameOutput;
workspaceOutputAssign = hostnameWorkspaceAssign;
};
};
services = {
espanso = {
enable = true;
waylandSupport = true;
configs = {
default = {
toggle_key = "OFF";
preserve_clipboard = true;
show_notifications = true;
keyboard_layout = { layout="${hostnameInput1}"; };
};
};
matches = {
base = {
matches = [
{
trigger = ":ip ";
replace = "{{pubip}} ";
}
{
regex = ":em(?P<emname>\\S+) ";
replace = "{{emoji}} ";
vars = [
{
name = "emoji";
type = "shell";
params = {
cmd = "${pkgs.python3}/bin/python3 /home/alisceon/.nixos_config/util/get_emoji.py $ESPANSO_EMNAME";
};
}
];
}
];
};
global_vars = {
global_vars = [
{
name = "pubip";
type = "shell";
params = {
cmd = "curl -s https://ifconfig.me";
};
}
];
};
};
};
mako = {
enable = true;
settings = {
actions = true;
anchor = "top-center";
border-radius = 0;
default-timeout = 10000;
height = 100;
width = 600;
icons = true;
ignore-timeout = false;
layer = "overlay";
margin = 10;
markup = true;
}; #end settings
}; # end mako
gnome-keyring = {
enable = true;
components = [
"ssh"
"pkcs11"
"secrets"
];
};
} // hostnameServices; # end services
programs = {
rofi = {
enable = true;
package = pkgs.rofi-unwrapped;
terminal = term;
}; # end rofi
waybar = {
enable = true;
systemd = {
enable = true;
target = "graphical-session.target";
};
settings = {
mainBar = {
layer = "bottom";
position = "top";
height = 28;
spacing = 0;
modules-left = [
"sway/workspaces"
];
modules-center = [
"sway/window"
];
modules-right = [
"tray"
"idle_inhibitor"
"network"
"bluetooth"
"pulseaudio"
"battery"
"sway/language"
"clock"
];
"sway/workspaces" = {
on-click = "activate";
sort-by-number = true;
format = "{value}";
};
"sway/window" = {
max-length = 64;
};
"tray" = {
icon-size = 24;
spacing = 8;
};
"idle_inhibitor" = {
format = "| {icon}";
start-activated = true;
format-icons = {
activated = "🫨";
deactivated = "😴";
};
};
"sway/language" = {
format = "| {flag}";
tooltip-format = "{long}";
};
"clock" = {
interval = 60;
tooltip = true;
format = "| {:%H:%M} ";
tooltip-format = "{:%Y-%m-%d}";
};
"battery" = {
interval = 60;
format = "| {icon}{capacity}%";
format-charging = "| {icon}{capacity}%";
format-plugged = "| {icon}🔌{capacity}%";
states = {
critical = 10;
warning = 20;
good = 100;
full = 100;
over = 101;
};
format-icons = [ "🪫" "🪫" "🔋" "🔋" "🔋"];
};
"network" = {
tooltip-format = "{ifname} = {ipaddr}/{cidr}";
format-wifi = "| ";
format-ethernet = "| ";
format-linked = "| 🔗";
format-disconnected = "| 💥";
interval = 15;
on-click = "${uwsm} ${term} -e nmtui";
};
"bluetooth" = {
format-connected = "| ";
format-disconnected = "| ";
format-no-controller = "";
format-disabled = "";
interval = 15;
on-click = "${uwsm} ${term} -e bluetui";
};
"pulseaudio" = {
format = "| 🔊{volume}%";
format-muted = "| 🔈0%";
format-bluetooth = "| 🎧{volume}%";
on-click = "${uwsm} pavucontrol";
};
}; # end mainbar
}; # end settings
style = ''
button {
box-shadow: inset 0 -8px transparent;
border: none;
border-radius: 0;
}
''; # end style
}; # end waybar
swaylock = {
enable = true;
settings = {
ignore-empty-password = true;
indicator-caps-lock = true;
}; # end settings
}; # end swaylock
kitty = {
enable = true;
settings = {
confirm_os_window_close = 0;
enable_audio_bell = false;
window_padding_width = 2;
};
}; # end kitty
}; # end programs
gtk = {
enable = true;
gtk2.enable = true;
gtk3.enable = true;
gtk4.enable = true;
};
xdg = {
configFile."libinput-gestures.conf".text = ''
gesture pinch in 3 sh -c "echo key ctrl+w | ${pkgs.dotool}/bin/dotool"
gesture swipe left 3 ${swaymsg} workspace prev
gesture swipe right 3 ${swaymsg} workspace next
gesture swipe down 3 ${swaymsg} move container to scratchpad
gesture swipe up 3 ${swaymsg} fullscreen
gesture swipe down 4 ${lock}
gesture pinch out 3 ${swaymsg} floating toggle
gesture pinch in 4 ${swaymsg} kill
'';
configFile."electron-flags.conf".text = ''
--enable-features=WaylandWindowDecorations,AllowQt
--ozone-platform=wayland
--gtk-version=4
'';
mimeApps = {
enable = true;
defaultApplicationPackages = [
pkgs.gnome-text-editor
pkgs.evince
pkgs.vlc
pkgs.loupe
pkgs.nautilus
pkgs.chromium
];
defaultApplications = { # mostly redundant but the additional granularity is good for reducing friction
# Text
"text/*" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"application/xml" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"application/json" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"application/pdf" = [ "${pkgs.evince}/share/applications/org.gnome.Evince.desktop" ];
# Media
"video/*" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"audio/*" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
# Browser
"text/html" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ];
"application/xhtml+xml" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ];
"application/x-web-app-manifest+json" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ];
"application/xml-dtd" = [ "${pkgs.chromium}/share/applications/chromium.desktop" ];
# Images
"image/*" = [ "${pkgs.loupe}/share/applications/org.gnome.Loupe.desktop.desktop" ];
};
};
};
systemd.user.sessionVariables = {
# this right here offends me https://source.chromium.org/chromium/chromium/src/+/main:base/nix/xdg_util.cc;l=179-180
# setting GNOME_DESKTOP_SESSION_ID will fool some legacy systems into thinking we're running gnome
# this is an issue for xdg-open which can be circumvented by adding glib to the system which lets xdg-open fallback to gio-open
GNOME_DESKTOP_SESSION_ID = "999";
SHELL_THICCNESS = "LOW"; # instructs xonsh to default to a slim environment
};
} # end file