nix-configs/modules/desktop.nix
2022-09-02 12:26:33 +02:00

395 lines
15 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.jade.desktop;
# Screenshot scripts {{{
window-screenshot = pkgs.writeShellScriptBin "window-screenshot.sh" ''
unset x y w h
eval $(xwininfo -id $(xdotool getactivewindow) |
sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
-e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
-e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
-e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
echo -n "''$x ''$y ''$w ''$h"
flameshot gui --region "''${w}x''${h}+''${x}+''${y}" -c -p ~/Pictures/screenshots/
'';
# }}}
# Desktop ctl {{{
desktop-ctl = pkgs.writeShellScriptBin "desktop-ctl.sh" ''
items="lock screen;log out;toggle picom;shut down;reboot;update all"
selection=$(echo $items | rofi -sep ";" -dmenu)
case $selection in
"lock screen")
i3lock-fancy
;;
"log out")
pkill i3
;;
"toggle picom")
pkill picom || picom --experimental-backend -b
;;
"shut down")
shutdown now
;;
"reboot")
systemctl reboot
;;
esac
'';
# }}}
# Macro scripts {{{
em-record = pkgs.writeShellScriptBin "em-record.sh" ''
register=$(ls $HOME/xmacros | rofi -dmenu)
count=$(echo "2;5;10;20;50;100" | rofi -dmenu -sep ";" -l 5)
for i in $(seq $count); do
echo $i
xmacroplay "$DISPLAY" < $HOME/xmacros/$register
done
register=$(ls $HOME/xmacros | rofi -dmenu)
xmacrorec2 > $HOME/xmacros/$register
'';
em-play = pkgs.writeShellScriptBin "em-play.sh" ''
register=$(ls $HOME/xmacros | rofi -dmenu)
xmacroplay "$DISPLAY" < $HOME/xmacros/$register
'';
em-play-loop = pkgs.writeShellScriptBin "em-play-loop.sh" ''
register=$(ls $HOME/xmacros | rofi -dmenu)
count=$(echo "2;5;10;20;50;100" | rofi -dmenu -sep ";" -l 5)
for i in $(seq $count); do
echo $i
xmacroplay "$DISPLAY" < $HOME/xmacros/$register
done
'';
# }}}
in with lib; {
options.jade.desktop = {
enable = mkEnableOption "Enable the i3 setup";
compositing = mkEnableOption "Enable compositing via picom";
};
config = mkIf cfg.enable {
home-manager.users.jade = { pkgs, ... }: {
home.packages = with pkgs; [
# external
i3lock-fancy rofi rofimoji volumeicon feh xorg.xinput dunst
arandr lxappearance gruvbox-dark-gtk gruvbox-dark-icons-gtk
gruvterial-theme flameshot tesseract5 imagemagick xclip polybar kitty
xkeysnail gtk-engine-murrine playerctl xmacro
# custom scripts
window-screenshot desktop-ctl em-record em-play em-play-loop
pa_applet
brightnessctl
];
# i3 {{{
xsession = {
enable = true;
windowManager.i3 = {
enable = true;
package = pkgs.i3-gaps;
config = {
bars = [];
terminal = "kitty";
workspaceAutoBackAndForth = true;
# Startup {{{
startup = [
# Keyboard remapping
{ command = "xhost +"; }
{ command = "xkeysnail ${../other/xkeysnail.py}"; always = true; }
{ command = "sleep 4 && setxkbmap -layout us -variant altgr-intl"; always = true; }
{ command = "feh --bg-scale ${../other/wallpaper.jpg}"; always = true; notification = false; }
{ command = "picom --experimental-backend"; }
{ command = "nm-applet"; }
{ command = "pa-applet"; }
];
# }}}
# Assigns {{{
assigns = {
"1" = [ { class = "discord"; } { class = "nheko"; } ];
"2" = [ { class = "librewolf"; } ];
};
# }}}
# Keyboard shortcuts {{{
modifier = "Mod4";
modes = {
resize = with {
# mod = builtins.break config.xsession.windowManager.i3.config.modifier;
mod = builtins.break "Mod4";
}; {
aaa = builtins.break "a";
"${mod}+h" = "resize shrink width 10 px or 10 ppt";
"${mod}+j" = "resize grow height 10 px or 10 ppt";
"${mod}+k" = "resize shrink height 10 px or 10 ppt";
"${mod}+l" = "resize grow width 10 px or 10 ppt";
"Return" = "mode default";
"Escape" = "mode default";
"${mod}+r" = "mode default";
};
};
keybindings = with {
#mod = config.xsession.windowManager.i3.config.modifier;
mod = "Mod4";
}; lib.mkOptionDefault {
# switch window focus
"${mod}+h" = "focus left";
"${mod}+j" = "focus down";
"${mod}+k" = "focus up";
"${mod}+l" = "focus right";
# move windows
"${mod}+Shift+h" = "move left";
"${mod}+Shift+j" = "move down";
"${mod}+Shift+k" = "move up";
"${mod}+Shift+l" = "move right";
# layout shit
"${mod}+shift+semicolon" = "split h";
"${mod}+semicolon" = "split v";
"${mod}+f" = "fullscreen toggle";
"${mod}+Shift+w" = "layout tabbed";
"${mod}+e" = "layout toggle split";
"${mod}+Shift+space" = "floating toggle";
# focus parents/children
"${mod}+Shift+a" = "focus parent";
"${mod}+c" = "focus child";
# screenshot
"${mod}+w" = "exec window-screenshot.sh";
"${mod}+s" = "exec flameshot gui -c -p $HOME/Pictures/screenshots";
"${mod}+a" = "exec flameshot screen -c -p $HOME/Pictures/screenshots";
# rofi fuckery
"${mod}+d" = "exec --no-startup-id rofi -show drun";
"${mod}+space" = "exec --no-startup-id -show window";
"${mod}+i" = "exec --no-startup-id rofimoji -f alchemical_symbols emojis braille_patterns box_drawing chess_symbols emoticons geometric_shapes gothic greek_extended math mathematical_alphanumeric_symbols mathematical_operators miscellaneous_symbols miscellaneous_mathematical_symbols-a miscellaneous_mathematical_symbols-b miscellaneous_symbols_and_arrows miscellaneous_symbols_and_pictographs miscellaneous_technical modi modifier_tone_letters musical_symbols nerd_font number_forms shorthand_format_controls specials variation_selectors vertical_forms -a copy";
"${mod}+Shift+e" = "exec --no-startup-id desktop-ctl.sh";
# rofi calculator, https://github.com/barbuk/menu-qalc
# "${mod}+m" = "exec --no-startup-id ="
# audio
"XF86AudioRaiseVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status";
"XF86AudioLowerVolume" = "exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status";
"XF86AudioMute" = "exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status";
"XF86AudioMicMute" = "exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status";
"XF86AudioNext" = "exec playerctl next";
"XF86AudioPrev" = "exec playerctl previous";
"XF86AudioPause" = "exec playerctl pause";
"XF86AudioPlay" = "exec playerctl play";
"XF86AudioStop" = "exec playerctl stop";
"XF86MonBrightnessUp" = "exec brightnessctl set 5%+";
"XF86MonBrightnessDown" = "exec brightnessctl set 5%-";
# macros
"${mod}+q" = "exec em-record.sh";
"${mod}+p" = "exec em-play.sh";
"${mod}+Shift+p" = "exec em-play-loop.sh";
};
# }}}
# Visuals {{{
fonts = {
names = [ "Montserrat" ];
style = "Regular";
size = 9.0;
};
gaps = {
inner = 15;
outer = 0;
smartGaps = false;
};
colors = {
background = "#1d2021";
focused = { background = "#282828"; border = "#504945"; childBorder = "#7c6f64"; indicator = "#504945"; text = "#ebdbb2"; };
focusedInactive = { background = "#1d2021"; border = "#504945"; childBorder = "#665c54"; indicator = "#664c54"; text = "#d5c4a1"; };
placeholder = { background = "#1d2021"; border = "#00ff00"; childBorder = "#504945"; indicator = "#504945"; text = "#928374"; };
unfocused = { background = "#1d2021"; border = "#3c3836"; childBorder = "#504945"; indicator = "#504945"; text = "#bdae93"; };
urgent = { background = "#9d0006"; border = "#cc241d"; childBorder = "#3c3836"; indicator = "#fb4943"; text = "#ebdbb2"; };
};
window = {
border = 2;
titlebar = false;
};
# }}}
};
};
};
# }}}
# Compositing {{{
services.picom = mkIf config.jade.desktop.compositing {
enable = true;
experimentalBackends = true;
backend = "glx";
shadow = true;
shadowOffsets = [ 25 15 ];
shadowOpacity = 0.045;
shadowExclude = [
"class_g = 'Conky'"
"class_g ?= 'Notify-osd'"
"class_g = 'Cairo-clock'"
"_GTK_FRAME_EXTENTS@:c"
"class_g != 'Rofi'"
];
vSync = true;
opacityRules = [
"90:class_g = 'kitty'"
"80:class_g = 'Signal'"
"80:class_g = 'Rofi'"
"80:class_g = 'discord'"
"80:class_g = 'Mailspring'"
"85:class_g = 'nheko'"
"75:class_g = 'obsidian'"
];
settings = {
# blur
#"detect-client-opacity = true;"
#"blur-method = \"gaussian\""
#"blur-size = 30"
#"blur-deviation = 15"
#"blur-background-fixed = true"
"detect-client-opacity" = true;
"blur-method" = "gaussian";
"blur-size" = 30;
"blur-deviation" = 15;
"blur-background-fixed" = true;
# fading rofi
"fading" = true;
"fade-in-step" = 0.25;
"fade-out-step" = 0.2;
"fade-delta" = 20;
"fade-exclude" = [ "class_g != 'Rofi'" ];
# use damage information
"use-damage" = true;
};
};
# }}}
# Polybar {{{
services.polybar = {
enable = true;
script = "pkill polybar; polybar & disown";
settings = {
colors = {
background = "#282828";
background-alt = "#3c3836";
foreground = "#ebdbb2";
primary = "#d65d0e";
secondary = "#fe8019";
alert = "#cc241d";
disabled = "#504945";
};
"bar/status" = {
# Style
width = "100%";
height = "24px";
radius = 0;
tray-position = "center";
background = "\${colors.background}";
foreground = "\${colors.foreground}";
line-size = "4px";
border-color = "#00000000";
padding-left = 0;
padding-right = 1;
module-margin = 1;
separator = "|";
separator-foreground = "\${colors.disabled}";
font-0 = "FiraCode Nerd Font";
modules-left = "xworkspaces xwindow";
modules-right = "memory cpu wlan battery date";
cursor-click = "pointer";
cursor-scroll = "ns-resize";
enable-ipc = true;
wm-restack = "i3";
override-redirect = false;
};
"module/xworkspaces" = {
type = "internal/xworkspaces";
label-active = "";
label-active-padding = 1;
label-occupied = "";
label-occupied-padding = 1;
label-urgent = "";
label-urgent-foreground = "\${colors.alert}";
label-urgent-padding = 1;
label-empty = "";
label-empty-foreground = "\${colors.disabled}";
label-empty-padding = 1;
};
"module/xwindow" = {
type = "internal/xwindow";
label = "%title:0:60:...%";
};
"module/memory" = {
type = "internal/memory";
interval = 2;
format-prefix = " ";
format-prefix-foreground = "\${colors.primary}";
label = "%percentage_used:2%%";
};
"module/cpu" = {
type = "internal/cpu";
interval = "2";
format-prefix = " ";
format-prefix-foreground = "\${colors.primary}";
label = "%percentage:2%%";
};
"network-base" = {
type = "internal/network";
interval = 5;
format-connected = "<label-connected>";
format-disconnected = "<label-disconnected>";
label-disconnected = "%{F#F0C674}%ifname%%{F#707880} disconnected";
};
"module/wlan" = {
"inherit" = "network-base";
interface-type = "wireless";
label-connected = "%{F#F0C674}%ifname%%{F-} %essid% %local_ip%";
};
"module/battery" = {
type = "internal/battery";
poll-interval = 5;
full-at = 96;
battery = "BAT0";
adapter = "ADP1";
time-format = "%H:%M";
label-charging = "%percentage%% %time%";
format-charging = "<ramp-capacity> <label-charging>";
label-discharging = "%percentage%% %time%";
format-discharging = "<ramp-capacity> <label-discharging>";
label-full = "%percentage%%";
format-full = " <label-full>";
label-low = "%percentage%%";
format-low = " <label-low>";
ramp.capacity = [ "" "" "" "" "" "" "" "" "" "" ];
};
"module/date" = {
type = "internal/date";
interval = 1;
date = "%Y-%m-%d %H:%M:%S";
label = "%date%";
label-foreground = "\${colors.foreground}";
};
"settings" = {
screenchange-reload = true;
pseudo-transparency = true;
};
};
};
# }}}
};
};
}