nix-configs/modules/desktop/default.nix

379 lines
13 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.jade.desktop;
window-screenshot = pkgs.writeShellScriptBin "window-screenshot.sh" (builtins.readFile ../../scripts/desktop/window-screenshot.sh);
# desktop-ctl = pkgs.writeShellScriptBin "desktop-ctl.sh" (builtins.readFile ../scripts/desktop/desktop-ctl.sh);
desktop-ctl = import ../../scripts/desktop/desktopctl.nix { pkgs = pkgs; };
# search and open in browser
searchwolf = import ../../scripts/desktop/searchwolf.nix { pkgs = pkgs; };
# permaclip
pc-get = pkgs.writeShellScriptBin "pc-get.sh" (builtins.readFile ../../scripts/desktop/permaclip/pc-get.sh);
pc-set = pkgs.writeShellScriptBin "pc-set.sh" (builtins.readFile ../../scripts/desktop/permaclip/pc-set.sh);
em-record = pkgs.writeShellScriptBin "em-record.sh" (builtins.readFile ../../scripts/desktop/macros/record.sh);
em-play = pkgs.writeShellScriptBin "em-play.sh" (builtins.readFile ../../scripts/desktop/macros/play.sh);
em-play-loop = pkgs.writeShellScriptBin "em-play-loop.sh" (builtins.readFile ../../scripts/desktop/macros/play-loop.sh);
ocr-screenshot = pkgs.writeShellScriptBin "ocr-screenshot.sh" (builtins.readFile ../../scripts/desktop/ocr-screenshot.sh);
# rofi calculator copied from https://github.com/barbuk/menu-qalc
menu-qalc = pkgs.writeShellScriptBin "menu-qalc" (builtins.readFile ../../scripts/desktop/menu-qalc.sh);
#bitw = pkgs.buildGo118Module rec {
#pname = "bitw";
#version = "0.1.0";
#src = pkgs.fetchFromGitHub {
#owner = "mvdan";
#repo = "bitw";
#rev = "9da6ca0287ae8e4b1aa7fcdf7c4e8c2736718c3b";
#sha256 = "sha256-qe9y6BEsfsEiPFXlM/SFliSd+2fnfDMHyw/O6EE5hpA=";
#};
#nativeBuildInputs = with pkgs; [ gitMinimal ];
#doCheck = false;
#vendorHash = "sha256-KQr0DtyH3xzlFwsDl3MGLRRLQC4+EtdTOG7IhmNCzV4=";
#vendorHash = null;
#GOFLAGS = "-mod=readonly";
#proxyVendor = true;
#deleteVendor = true;
#preBuild = ''
#go mod vendor
#'';
#};
in with lib; {
imports = (mkIf cfg.enable [
./audio.nix
./gaming.nix
./creative.nix # TODO: more fine grained choices, not every setup needs fspy or rawtherapee
./compositing.nix
./ios-compat.nix
./syncthing.nix
./kdeconnect.nix
./themeing.nix
./cloud.nix
./networking.nix
./polybar.nix
./social.nix
./xkeysnail.nix
./mail.nix
]).content;
options.jade.desktop = {
enable = mkEnableOption "Enable the i3 setup";
};
config = mkIf cfg.enable {
fonts.fonts = with pkgs; [
nerdfonts montserrat noto-fonts
];
hardware.bluetooth.enable = true;
hardware.keyboard.uhk.enable = true;
hardware.spacenavd.enable = true;
programs.seahorse.enable = true;
security.pam.services.jade.enableGnomeKeyring = true;
virtualisation.libvirtd.enable = true;
boot.plymouth = {
enable = true;
#theme = "glow";
};
services = {
printing.enable = true;
gnome.gnome-keyring.enable = true;
xserver = {
layout = "us";
xkbVariant = "altgr-intl";
enable = true;
wacom.enable = true;
libinput = {
enable = true;
};
desktopManager = {
xterm.enable = false;
};
displayManager = {
defaultSession = "none+i3";
gdm.enable = true;
};
windowManager.i3 = {
enable = true;
extraPackages = with pkgs; [
gnome.gdm
i3lock-fancy
rofi
rofimoji
feh
xorg.xinput
dunst
arandr
flameshot
tesseract5
imagemagick
xclip
xmacro
libwacom
wacomtablet
xorg.xev
];
};
};
};
# sensible modules:
# - [x] audio
# - [x] compositing (picom configs)
# - [x] gaming (steam, lutris, prism...)
# - [x] cloud (pw manager, nextcloud, fluent reader)
# - [x] syncthing
# - [x] social (evolution, discord, matrix?)
# - [ ] set up mail accounts properly
# - [x] creative (obs, blender, gimp n shit)
# - [x] apple-stuff (ifuse etc)
# - [x] themeing
# - [x] vpn/networking stuff
# - [ ] keymap
# - [ ] seperate keymap by modules like autostarts
# - [x] kdeconnect
# - [x] polybar
# - [ ] bluetooth
# - [ ] spacenav support (with custom systemd service)
# - [ ] wacom config
# - [x] xkeysnail
# - [ ] oneko
# also useful:
# - every custom script its own flake n stuff
home-manager.users.jade = { pkgs, ... }: {
home.packages = with pkgs; [
# categories
# filemanager
xfce.thunar
xfce.tumbler
xfce.thunar-archive-plugin
gnome.file-roller
# media/file viewers
vlc
evince
nomacs
# from environment.systemPackages cleanup
font-manager
xdotool
xorg.xwininfo
gparted
librewolf
firefox
uhk-agent
cool-retro-term
xdg-desktop-portal-gtk
nheko
obsidian
virt-manager
ddccontrol-db
firebird-emu
godot
gitg
gpick
qdirstat
ffmpeg_5
spacenav-cube-example
spacenavd
libspnav
# external
libnotify
i3lock-fancy
rofi
rofimoji
feh
xorg.xinput
dunst
arandr
flameshot
tesseract5
imagemagick
xclip
polybar
kitty
xmacro
brightnessctl
drawing # drwaing!
libqalculate # needed by menu-qalc
ddgr jq # needed by searchwolf
brillo # kb backlight
# custom scripts
window-screenshot
desktop-ctl
em-record
em-play
em-play-loop
ocr-screenshot
menu-qalc
pc-get
pc-set
searchwolf
# meow
oneko
];
# i3 {{{
xsession = {
enable = true;
windowManager.i3 = {
enable = true;
config = {
bars = [];
workspaceAutoBackAndForth = true;
focus = {
followMouse = false;
};
# Startup {{{
startup = [
# wallpaper
{
command = "feh --bg-fill ${../../other/wallpaper.jpg}";
always = true;
notification = false;
}
# meowmeowmeow
{
command = "pkill oneko; oneko -tofocus -tora -position +-1+5 -fg palevioletred3 -bg pink -name 'Rose the desktop kitty'";
always = true;
}
];
# }}}
# 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}+Shift+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";
"${mod}+t" = "exec ocr-screenshot.sh";
# rofi fuckery
"${mod}+d" = "exec --no-startup-id rofi -show drun -theme ${../../other/rofi-themes/applauncher.rasi}";
"${mod}+space" = "exec --no-startup-id rofi -show combi -combi-show window#run -modes combi -theme ${../../other/rofi-themes/applauncher.rasi}";
"${mod}+i" = "exec --no-startup-id rofimoji -f alchemical_symbols anatolian_hieroglyphs 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 rofi -show \"desktopctl\" -modes \"desktopctl:${desktop-ctl.outPath}/bin/desktopctl\" -theme ${../../other/rofi-themes/applauncher.rasi}";
"${mod}+m" = "exec --no-startup-id menu-qalc";
"${mod}+o" = "exec --no-startup-id rofi -show searchwolf -modes \"searchwolf:${searchwolf.outPath}/bin/searchwolf\"";
# 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%-";
"XF86KbdBrightnessUp" = "exec brillo -kA 10.0";
"XF86KbdBrightnessDown" = "exec brillo -kU 10.0";
# macros
"${mod}+q" = "exec em-record.sh";
"${mod}+p" = "exec em-play.sh";
"${mod}+Shift+p" = "exec em-play-loop.sh";
# permaclip
"${mod}+c" = "exec rofi -show register -modes \"register:${pc-set.outPath}/bin/pc-set.sh\" -theme gruvbox-dark";
"${mod}+v" = "exec rofi -show register -modes \"register:${pc-get.outPath}/bin/pc-get.sh\" -theme gruvbox-dark";
};
# }}}
# Visuals {{{
fonts = {
names = [ "Atkinson Hyperlegible" ];
style = "Regular";
size = 9.0;
};
gaps = {
#top = 24;
inner = 15;
outer = 0;
smartGaps = true;
smartBorders = "on";
};
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;
};
# }}}
};
};
};
};
};
}