{ 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; { options.jade.desktop = { enable = mkEnableOption "Enable the i3 setup"; compositing = mkEnableOption "Enable compositing via picom"; }; config = mkIf cfg.enable { programs.kdeconnect.enable = true; fonts.fonts = with pkgs; [ nerdfonts montserrat noto-fonts atkinson-hyperlegible ]; hardware.bluetooth.enable = true; hardware.keyboard.uhk.enable = true; hardware.spacenavd.enable = true; programs.seahorse.enable = true; security.pam.services.jade.enableGnomeKeyring = true; networking.firewall.allowedTCPPorts = [ 8384 22000 ]; networking.firewall.allowedUDPPorts = [ 8080 22000 21027 ]; systemd.services."NetworkManager-wait-online".enable = false; qt.platformTheme = "qt5ct"; virtualisation.libvirtd.enable = true; boot.plymouth = { enable = true; #theme = "glow"; }; programs = { corectrl.enable = true; noisetorch.enable = true; adb.enable = true; }; nixpkgs.overlays = [ (import (builtins.fetchTarball "https://github.com/PrismLauncher/PrismLauncher/archive/develop.tar.gz")).overlay ]; environment.sessionVariables = rec { QT_QPA_PLATFORMTHEME = "qt5ct"; TERMINAL = "kitty"; }; services = { printing.enable = true; mullvad-vpn.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; package = pkgs.i3-gaps; extraPackages = with pkgs; [ gnome.gdm 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 libwacom wacomtablet xorg.xev ]; }; }; pipewire = { enable = true; alsa.enable = true; #alsa.support32Bit = true; pulse.enable = true; jack.enable = true; }; syncthing = rec { enable = true; user = "jade"; dataDir = "/home/${user}/Documents"; configDir = "/home/${user}/Documents/.config/syncthing"; }; }; # desktop things that arent the de {{{ networking = { networkmanager.wifi.backend = "iwd"; extraHosts = '' 127.0.0.1 www.youtube.com 127.0.0.1 www.reddit.com 127.0.0.1 www.tiktok.com 127.0.0.1 www.twitter.com 127.0.0.1 www.instagram.com 127.0.0.1 www.facebook.com 127.0.0.1 www.snapchat.com 127.0.0.1 youtube.com 127.0.0.1 reddit.com 127.0.0.1 tiktok.com 127.0.0.1 twitter.com 127.0.0.1 instagram.com 127.0.0.1 facebook.com 127.0.0.1 snapchat.com 127.0.0.1 google-analytics.com 127.0.0.1 stats.g.doubleclick.net 127.0.0.1 googleadservices.com 127.0.0.1 googletagmanager.com 127.0.0.1 googletagservices.com 127.0.0.1 googlesyndication.com ''; }; # }}} home-manager.users.jade = { pkgs, ... }: { home.packages = with pkgs; [ # from environment.systemPackages cleanup pavucontrol font-manager xdotool xorg.xwininfo gparted networkmanagerapplet pulseaudioFull speedtest-cli librewolf firefox vlc xfce.thunar xfce.tumbler xfce.thunar-archive-plugin gnome.file-roller uhk-agent cool-retro-term lutris xorg.xhost xdg-desktop-portal-gtk nheko obsidian audacity easyeffects virt-manager evince openrgb krita gimp inkscape-with-extensions virglrenderer ddccontrol-db firebird-emu obs-studio kdenlive fspy spacenav-cube-example cava spacenavd libspnav evolution godot colmap gitg gnome-builder gpick qdirstat ffmpeg_5 scribus libimobiledevice libimobiledevice-glue ifuse usbmuxd libusbmuxd gvfs gphoto2 gphoto2fs phockup digikam fluent-reader nextcloud-client # mullvad currently broken? mullvad-vpn # external libnotify 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 nomacs # image viewer xkeysnail gtk-engine-murrine playerctl xmacro pa_applet brightnessctl drawing # drwaing! libqalculate # needed by menu-qalc ddgr jq # needed by searchwolf brillo # kb backlight # pw manager bitwarden bitwarden-cli # custom scripts window-screenshot desktop-ctl em-record em-play em-play-loop ocr-screenshot menu-qalc pc-get pc-set searchwolf # themes gruvbox-dark-gtk gruvbox-dark-icons-gtk # meow oneko ]; services.kdeconnect = { enable = true; indicator = true; }; # i3 {{{ xsession = { enable = true; windowManager.i3 = { enable = true; config = { bars = []; terminal = "kitty"; workspaceAutoBackAndForth = true; focus = { followMouse = false; }; # 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-fill ${../other/wallpaper.jpg}"; always = true; notification = false; } { command = "picom"; } { command = "pkill nm-applet; nm-applet"; always = true; } { command = "pkill pa-applet; pa-applet"; always = true; } { command = "pkill oneko; oneko -tofocus -tora -position +-1+5 -fg palevioletred3 -bg pink -name 'Rose the desktop kitty'"; always = true; } { command = "mullvad-vpn --background"; always = true; } { command = "pkill polybar; polybar"; always = true; } { command = "bitwarden"; } ]; # }}} # 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; }; # }}} }; }; }; # }}} # Compositing {{{ services.picom = mkIf config.jade.desktop.compositing { enable = 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 = ""; 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 = ""; format-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 = 1; full-at = 96; battery = "BAT0"; adapter = "ADP1"; time-format = "%H:%M"; label-charging = "%percentage%% %time%"; format-charging = ""; label-discharging = "%percentage%% %time%"; format-discharging = " "; label-full = "%percentage%%"; format-full = " "; label-low = "%percentage%%"; format-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; }; }; }; # }}} # gtk {{{ gtk = { enable = true; cursorTheme = { package = pkgs.phinger-cursors; name = "phinger-cursors"; size = 30; }; font = { package = pkgs.atkinson-hyperlegible; name = "Atkinson Hyperlegible"; size = 11.5; }; iconTheme = { package = pkgs.gruvbox-dark-icons-gtk; name = "gruvbox-dark-icons"; }; theme = { package = pkgs.gruvbox-dark-gtk; name = "gruvbox-dark"; }; }; # }}} # Qt {{{ qt = { enable = true; platformTheme = "gtk"; }; # }}} }; }; }