nixos_config/home/wm/sway.nix
2025-12-11 20:23:32 +01:00

769 lines
24 KiB
Nix

{ pkgs, config, hostName, lib, ... }:
let
# execs
swaymsg = "${pkgs.sway}/bin/swaymsg";
lock = "${pkgs.swaylock}/bin/swaylock --daemonize";
term = "${pkgs.kitty}/bin/kitty";
dmenu = "${pkgs.rofi}/bin/rofi -show drun";
notify = "${pkgs.libnotify}/bin/notify-send";
nag = "${pkgs.sway}/bin/swaynag --edge bottom --font '${style_font} ${style_font_sz}'";
# keybinds
key_mod = "Mod4";
key_mod_misc = "Alt";
key_left = "Left";
key_right = "Right";
key_up = "Up";
key_down = "Down";
# style
style_font = "Inconsolata";
style_font_sz = "12";
style_font_bold = "${style_font}-Bold";
color_blue_1 = "#99c1f1";
color_blue_2 = "#62a0ea";
color_blue_3 = "#3584e4";
color_blue_4 = "#1c71d8";
color_blue_5 = "#1a5fb4";
color_green_1 = "#8ff0a4";
color_green_2 = "#57e389";
color_green_3 = "#33d17a";
color_green_4 = "#2ec27e";
color_green_5 = "#26a269";
color_yellow_1 = "#f9f06b";
color_yellow_2 = "#f8e45c";
color_yellow_3 = "#f6d32d";
color_yellow_4 = "#f5c211";
color_yellow_5 = "#e5a50a";
color_orange_1 = "#ffbe6f";
color_orange_2 = "#ffa348";
color_orange_3 = "#ff7800";
color_orange_4 = "#e66100";
color_orange_5 = "#c64600";
color_red_1 = "#f66151";
color_red_2 = "#ed333b";
color_red_3 = "#e01b24";
color_red_4 = "#c01c28";
color_red_5 = "#a51d2d";
color_purple_1 = "#dc8add";
color_purple_2 = "#c061cb";
color_purple_3 = "#9141ac";
color_purple_4 = "#813d9c";
color_purple_5 = "#613583";
color_brown_1 = "#cdab8f";
color_brown_2 = "#b5835a";
color_brown_3 = "#986a44";
color_brown_4 = "#865e3c";
color_brown_5 = "#63452c";
color_light_1 = "#ffffff";
color_light_2 = "#f6f5f4";
color_light_3 = "#d8d8d8";
color_light_4 = "#c0c0c0";
color_light_5 = "#9b9b9b";
color_dark_1 = "#757575";
color_dark_2 = "#666666";
color_dark_3 = "#494949";
color_dark_4 = "#333333";
color_dark_5 = "#000000";
color_f_bg = color_dark_3;
color_f_text = color_light_1;
color_uf_bg = color_dark_4;
color_uf_text = color_light_4;
color_alert_bg = color_red_5;
color_alert_text = color_light_1;
color_inv_bg = color_light_4;
color_inv_text = color_dark_5;
# 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 {};
in
{
wayland.windowManager.sway = {
enable = true;
wrapperFeatures.gtk = true;
config = {
modifier = "${key_mod}";
startup = [
{ command = "systemctl --user start libinput-gestures"; }
{ command = "swaybg -m fill -i /home/alisceon/Pictures/system/bg.png";}
];
bars = [
{ command = "${pkgs.waybar}/bin/waybar"; }
];
fonts = {
names = ["${style_font}"];
size = style_font_sz;
};
input = {
"type:touchpad" = {
dwt = "enabled";
tap = "enabled";
natural_scroll = "disabled";
middle_emulation = "enabled";
click_method = "clickfinger";
clickfinger_button_map = "lrm";
};
"type:mouse" = {
natural_scroll = "disabled";
accel_profile = "flat";
};
"*" = {
xkb_layout = "us,se";
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}+Escape" = "exec ${nag} -m 'Shutdown options:' -B 'Power Off' 'systemctl poweroff' -B 'Reboot' 'systemctl reboot' -B 'Logout' 'swaymsg exit'";
"${key_mod}+Return" = "exec ${term}";
"${key_mod}+Shift+q" = "kill";
"${key_mod}+F4" = "kill";
# Locking and idle
"${key_mod}+L" = "exec ${lock}";
# Apps
"${key_mod}+d" = "exec ${dmenu}";
#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 10";
"XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 10";
}; # end keybindings
window = {
titlebar = false;
commands = [
{ criteria = { all = true; }; command = "inhibit_idle fullscreen"; }
];
};
colors = {
background = color_dark_5;
focused = {
border = color_f_bg;
background = color_f_bg;
text = color_light_1;
indicator = color_f_bg;
childBorder = color_f_bg;
};
focusedInactive = {
border = color_f_bg;
background = color_f_bg;
text = color_light_1;
indicator = color_f_bg;
childBorder = color_f_bg;
};
unfocused = {
border = color_uf_bg;
background = color_uf_bg;
text = color_uf_text;
indicator = color_uf_bg;
childBorder = color_uf_bg;
};
urgent = {
border = color_alert_bg;
background = color_alert_bg;
text = color_alert_text;
indicator = color_alert_bg;
childBorder = color_alert_bg;
};
placeholder = {
border = color_dark_3;
background = color_dark_3;
text = color_light_4;
indicator = color_dark_3;
childBorder = color_dark_3;
};
}; # end colors
assigns = {
"1" = [{app_id = "firefox";}];
"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 = {
mako = {
enable = true;
settings = {
actions = true;
anchor = "top-center";
background-color = color_f_bg;
border-color = color_f_bg;
border-radius = 0;
default-timeout = 10000;
font = "${style_font} ${style_font_sz}";
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;
font = "${style_font} ${style_font_sz}";
theme = let
inherit (config.lib.formats.rasi) mkLiteral;
in {
"*" = {
bg = mkLiteral color_uf_bg;
fg = mkLiteral color_f_text;
ac = mkLiteral color_f_bg;
background-color = mkLiteral "transparent";
};
"#window" = {
background-color = mkLiteral "@bg";
location = mkLiteral "center";
width = mkLiteral "30%";
};
"#prompt" = {
text-color = mkLiteral "@fg";
};
"#textbox-prompt-colon" = {
text-color = mkLiteral "@fg";
};
"#entry" = {
text-color = mkLiteral "@fg";
blink = mkLiteral "true";
};
"#inputbar" = {
children = mkLiteral "[ prompt, entry ]";
text-color = mkLiteral "@fg";
padding = mkLiteral "5px";
};
"#listview" = {
columns = mkLiteral "1";
lines = mkLiteral "6";
cycle = mkLiteral "true";
dynamic = mkLiteral "true";
};
"#mainbox" = {
border = mkLiteral "3px";
border-color = mkLiteral "@ac";
children = mkLiteral "[ inputbar, listview ]";
padding = mkLiteral "10px";
};
"#element" = {
text-color = mkLiteral "@fg";
padding = mkLiteral "5px";
};
"#element-icon" = {
text-color = mkLiteral "@fg";
size = mkLiteral "32px";
};
"#element-text" = {
text-color = mkLiteral "@fg";
padding = mkLiteral "5px";
};
"#element selected" = {
border = mkLiteral "3px";
border-color = mkLiteral "@ac";
text-color = mkLiteral "@fg";
background-color = mkLiteral "@ac";
};
}; # end theme
}; # end rofi
waybar = {
enable = true;
settings = {
mainBar = {
layer = "bottom";
position = "top";
height = 32;
spacing = 0;
modules-left = [
"sway/workspaces"
];
modules-center = [
"sway/window"
];
modules-right = [
"tray"
"network"
"pulseaudio"
"battery"
"clock"
];
"sway/workspaces" = {
on-click = "activate";
sort-by-number = true;
format = "{value}";
};
"sway/window" = {
max-length = 64;
};
"tray" = {
icon-size = 24;
spacing = 8;
};
"clock" = {
interval = 60;
tooltip = true;
format = "| {:%Y-%m-%d %R} ";
tooltip-format = "{:%A}";
};
"battery" = {
states = {
critical = 10;
warning = 20;
good = 90;
full = 100;
over = 101;
};
interval = 30;
format = "| Bat {capacity}% ";
format-charging = "| Chr {capacity}% ";
format-plugged = "| Plg {capacity}% ";
};
"network" = {
format-wifi = "| WiFi up ";
format-ethernet = "";
tooltip-format = "{ifname} = {ipaddr}/{cidr}";
format-linked = "| {ifname} (no ip) ";
format-disconnected = "| Disconnected ";
format-alt = "| {essid}: {ipaddr} ";
interval = 10;
};
"pulseaudio" = {
# "scroll-step" = 1; # %; can be a float
format = "| Sound: {volume}% ";
format-muted = "| Sound: x% ";
};
}; # end mainbar
}; # end settings
style = ''
* {
font-family: ${style_font_bold};
font-size: ${style_font_sz}pt;
}
window#waybar {
color: ${color_f_text};
background-color: ${color_uf_bg};
transition-property: background-color;
transition-duration: .5s;
}
window#waybar.hidden {
opacity: 0.2;
}
/*
window#waybar.empty {
background-color: transparent;
}
window#waybar.solo {
background-color: ${color_purple_1};
}
*/
button {
box-shadow: inset 0 -8px transparent;
border: none;
border-radius: 0;
}
button:hover {
color: ${color_f_text};
background: ${color_f_bg};
}
#workspaces button {
color: ${color_uf_text};
background-color: ${color_uf_bg};
}
#workspaces button:hover {
color: ${color_f_text};
background: ${color_f_bg};
}
#workspaces button.focused {
color: ${color_inv_text};
background-color: ${color_inv_bg};
}
#workspaces button.urgent {
color: ${color_alert_text};
background-color: ${color_alert_bg};
}
#battery,
#clock,
#network,
#pulseaudio,
#tray,
#window,
#workspaces {
margin: 0 2px;
}
.modules-left > widget:first-child > #workspaces {
margin-left: 0;
}
.modules-right > widget:last-child > #workspaces {
margin-right: 0;
}
#battery {
color: ${color_f_text};
background-color: transparent;
}
#battery.critical.discharging {
animation: blink 1s infinite;
color: ${color_red_2};
}
#battery.warning.discharging {
animation: blink 1s infinite;
color: ${color_orange_2};
}
#battery.good {
animation: none;
color: ${color_f_text};
}
#battery.full.charging {
color: ${color_green_2};
}
#battery.over.charging {
color: ${color_green_2};
}
#clock {
color: ${color_f_text};
background-color: transparent;
}
label:focus {
color: ${color_f_text};
background-color: transparent;
}
#network {
color: ${color_f_text};
background-color: transparent;
}
#network.disconnected {
color: ${color_f_text};
background-color: transparent;
}
#pulseaudio {
color: ${color_f_text};
background-color: transparent;
}
#pulseaudio.muted {
color: ${color_f_text};
background-color: transparent;
}
#tray {
background-color: transparent;
}
#tray > .passive {
-gtk-icon-effect: dim;
}
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: transparent;
}
''; # end style
}; # end waybar
swaylock = {
enable = true;
settings = {
color = color_uf_bg;
font = style_font;
font-size = style_font_sz;
ignore-empty-password = true;
indicator-caps-lock = true;
indicator-radius = 50;
indicator-thickness = 10;
}; # end settings
}; # end swaylock
kitty = {
enable = true;
font = {
name = style_font;
size = lib.toInt style_font_sz;
};
settings = {
confirm_os_window_close = 0;
enable_audio_bell = false;
window_padding_width = 2;
foreground = color_f_text;
background = color_uf_bg;
};
}; # end kitty
}; # end programs
gtk = {
enable = true;
gtk2.enable = true;
gtk3.enable = true;
gtk4.enable = true;
colorScheme = "dark";
theme.name = "Adwaita-Dark";
cursorTheme.name = "Adwaita-Dark";
font.package = pkgs.inconsolata;
font.name = "Inconsolata";
font.size = 14;
iconTheme.name = "Adwaita-Dark";
iconTheme.package = pkgs.adwaita-icon-theme;
};
xdg.configFile."libinput-gestures.conf".text = ''
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 pinch in 3 ${swaymsg} floating enable
gesture pinch out 3 ${swaymsg} floating disable
gesture pinch in 4 ${swaymsg} kill
gesture swipe up 4 ${lock}
'';
xdg.configFile."electron-flags.conf".text = ''
--enable-features=WaylandWindowDecorations,AllowQt
--ozone-platform=wayland
--gtk-version=4
'';
xdg.configFile."chromium-flags.conf".text = ''
--enable-features=WaylandWindowDecorations,AllowQt
--ozone-platform=wayland
--gtk-version=4
'';
xdg.mimeApps = {
enable = true;
defaultApplications ={
# Text
"text/plain" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"text/markdown" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"text/x-markdown" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"text/csv" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ];
"text/xml" = [ "${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" ];
# Media
"video/mp4" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"audio/mpeg" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"audio/ogg" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"audio/wav" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"audio/flac" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"video/x-matroska" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"video/webm" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"video/avi" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
"video/mkv" = [ "${pkgs.vlc}/share/applications/vlc.desktop" ];
# Browser
"text/html" = [ "${pkgs.firefox}/share/applications/firefox.desktop" ];
"application/xhtml+xml" = [ "${pkgs.firefox}/share/applications/firefox.desktop" ];
"application/x-web-app-manifest+json" = [ "${pkgs.firefox}/share/applications/firefox.desktop" ];
"application/xml-dtd" = [ "${pkgs.firefox}/share/applications/firefox.desktop" ];
# Images
"image/png" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/jpeg" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/gif" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/bmp" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/webp" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/svg+xml" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/svg+xml-compressed" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/tiff" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/apng" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
"image/heic" = [ "${pkgs.swayimg}/share/applications/swayimg.desktop" ];
};
};
# this right here offends me https://source.chromium.org/chromium/chromium/src/+/main:base/nix/xdg_util.cc;l=179-180
systemd.user.sessionVariables = {
GNOME_DESKTOP_SESSION_ID = "999";
};
} # end file