{ config, pkgs, user, firefox-addons, ... }: { # Home Manager needs a bit of information about you and the # paths it should manage. home.username = user; home.homeDirectory = "/home/${user}"; # Packages that should be installed to the user profile. home.packages = with pkgs; [ aseprite audacity blender darktable digikam discord drawio exiftool # For digikam famistudio feh digikam firefox flameshot gimp-with-plugins gnucash godot_4 grafx2 jellyfin-media-player keepassxc krita rawtherapee libreoffice lmms lutris moonlight-qt ncdu nextcloud-client nixpkgs-fmt obsidian pavucontrol picard rawtherapee rofi spotify sqlitebrowser steam syncthing ventoy-full vlc winetricks wineWowPackages.unstableFull yt-dlp ]; # WM/DE config gtk = { enable = true; font.name = "Victor Mono SemiBold 12"; theme = { name = "SolArc-Dark"; package = pkgs.solarc-gtk-theme; }; }; xsession = { enable = true; windowManager.bspwm = { enable = true; settings = { border_width = 10; focus_follows_pointer = true; }; extraConfig = '' bspc monitor DP-2 -d I II III IV V bspc monitor HDMI-1 -d VI VII VIII IX X polybar & ''; startupPrograms = [ "picom" "polybar primary" "polybar secondary" ]; }; }; services.sxhkd = { enable = true; keybindings = { "super + Return" = "kitty"; # # bspwm hotkeys # # quit/restart bspwm "super + alt + {q,r}" = "bspc {quit,wm -r}"; # close and kill "super + {_,shift + }w" = "bspc node -{c,k}"; # # state/flags # # set the window state "super + {t,shift + t,s,f}" = "bspc node -t {tiled,pseudo_tiled,floating,fullscreen}"; # set the node flags "super + ctrl + {m,x,y,z}" = "bspc node -g {marked,locked,sticky,private}"; # # focus/swap # # focus the node in the given direction "super + {_,shift + }{h,j,k,l}" = "bspc node -{f,s} {west,south,north,east}"; # focus the node for the given path jump "super + {p,b,comma,period}" = "bspc node -f @{parent,brother,first,second}"; # focus the next/previous window in the current desktop "super + {_,shift + }c" = "bspc node -f {next,prev}.local.!hidden.window"; # focus the next/previous desktop in the current monitor "super + bracket{left,right}" = "bspc desktop -f {prev,next}.local"; # focus the last node/desktop "super + {grave,Tab}" = "bspc {node,desktop} -f last"; # focus the older or newer node in the focus history "super + {o,i}" = '' bspc wm -h off; \ bspc node {older,newer} -f; \ bspc wm -h on ''; # focus or send to the given desktop "super + {_,shift + }{1-9,0}" = "bspc {desktop -f,node -d} '^{1-9,10}'"; # # move/resize # # expand a window by moving one of its side outward "super + alt + {h,j,k,l}" = " bspc node -z {left -20 0,bottom 0 20,top 0 -20,right 20 0}"; # contract a window by moving one of its side inward "super + alt + shift + {h,j,k,l}" = "bspc node -z {right -20 0,top 0 20,bottom 0 -20,left 20 0}"; # move a floating window "super + {Left,Down,Up,Right}" = " bspc node -v {-20 0,0 20,0 -20,20 0}"; "Super_L; @Super_L" = "rofi -show drun"; }; }; services.polybar = { enable = true; script = ""; # required but we start polybar via bspwm, so dont start it here. config = rec { colors = { background = "#282A2E"; # background = "#ff00ff"; background-alt = "#373B41"; foreground = "#C5C8C6"; primary = "#F0C674"; secondary = "#8ABEB7"; alert = "#A54242"; disabled = "#707880"; }; common-bar = { width = "100%"; height = "24pt"; radius = 10; #;dpi = 96 background = colors.background; foreground = colors.foreground; line-size = "3pt"; border-size = "4pt"; border-color = "#00000000"; padding-left = 0; padding-right = 1; module-margin = 1; separator = "|"; separator-foreground = colors.disabled; font-0 = "monospace;2"; wm-restack = "bspwm"; cursor-click = "pointer"; cursor-scroll = "ns-resize"; enable-ipc = true; }; "bar/primary" = common-bar // { monitor = "DP-2"; modules-left = "xworkspaces xwindow"; modules-right = "filesystem memory cpu wlan date"; }; "bar/secondary" = common-bar // { monitor = "HDMI-1"; modules-left = "xworkspaces"; modules-center = "date"; }; "module/xworkspaces" = { type = "internal/xworkspaces"; group-by-monitor = true; pin-workspaces = true; label-active = "%name%"; label-active-background = colors.background-alt; label-active-underline = colors.primary; label-active-padding = 1; label-occupied = "%name%"; label-occupied-padding = 1; label-urgent = "%name%"; label-urgent-background = colors.alert; label-urgent-padding = 1; label-empty = "%name%"; label-empty-foreground = colors.disabled; label-empty-padding = 1; }; }; extraConfig = '' [module/systray] type = internal/tray format-margin = 8pt tray-spacing = 16pt [module/xwindow] type = internal/xwindow label = %title:0:60:...% [module/filesystem] type = internal/fs interval = 25 mount-0 = / label-mounted = %{F#F0C674}%mountpoint%%{F-} %percentage_used%% label-unmounted = %mountpoint% not mounted label-unmounted-foreground = ''${colors.disabled} [module/pulseaudio] type = internal/pulseaudio format-volume-prefix = "VOL " format-volume-prefix-foreground = ''${colors.primary} format-volume = label-volume = %percentage%% label-muted = muted label-muted-foreground = ''${colors.disabled} [module/xkeyboard] type = internal/xkeyboard blacklist-0 = num lock label-layout = %layout% label-layout-foreground = ''${colors.primary} label-indicator-padding = 2 label-indicator-margin = 1 label-indicator-foreground = ''${colors.background} label-indicator-background = ''${colors.secondary} [module/memory] type = internal/memory interval = 2 format-prefix = "RAM " format-prefix-foreground = ''${colors.primary} label = %percentage_used:2%% [module/cpu] type = internal/cpu interval = 2 format-prefix = "CPU " 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/eth] inherit = network-base interface-type = wired label-connected = %{F#F0C674}%ifname%%{F-} %local_ip% [module/date] type = internal/date interval = 1 date = %l:%M%P date-alt = %Y-%m-%d %H:%M:%S label = %date% label-foreground = ''${colors.primary} [settings] screenchange-reload = true pseudo-transparency = true ; vim:ft=dosini ''; }; services.picom = { enable = true; backend = "glx"; activeOpacity = 0.9; inactiveOpacity = 0.6; shadow = true; vSync = true; settings = { blur = { method = "gaussian"; size = 50; deviation = 10.0; }; corner-radius = 15; }; }; # User software configurations programs = { bash = { shellAliases = { "git-override" = "git add . && git commit --amend --no-edit && git push --force-with-lease"; }; }; firefox = { enable = true; profiles.default = { settings = { "browser.newtabpage.activity-stream.default.sites" = "https://www.wikipedia.org/"; "browser.newtabpage.activity-stream.discoverystream.saveToPocketCard.enabled" = false; "browser.newtabpage.activity-stream.discoverystream.sendToPocket.enabled" = false; "browser.newtabpage.activity-stream.feeds.section.topstories" = false; "browser.newtabpage.activity-stream.feeds.system.topstories" = false; "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts" = false; "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned" = "duckduckgo"; "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.searchEngines" = "duckduckgo"; "browser.newtabpage.activity-stream.section.highlights.includePocket" = false; "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; "browser.newtabpage.activity-stream.system.showSponsored" = false; "browser.newtabpage.pinned" = [{ url = "https://duckduckgo.com"; label = "@duckduckgo"; searchTopSite = true; }]; "browser.topsites.contile.cachedTiles" = [ ]; "browser.topsites.contile.enabled" = false; # man fuck this shit, its the api that gets FF newpage shortcuts like FB, expedia, ... "browser.urlbar.suggest.quicksuggest.sponsored" = false; "extensions.autoDisableScopes" = 0; }; extensions = with firefox-addons; [ darkreader multi-account-containers simple-tab-groups ublock-origin umatrix ]; search = { force = true; default = "DuckDuckGo"; engines = { "Nix Packages" = { urls = [{ template = "https://search.nixos.org/packages"; params = [ { name = "type"; value = "packages"; } { name = "query"; value = "{searchTerms}"; } ]; }]; icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; definedAliases = [ "@np" ]; }; }; order = [ "DuckDuckGo" "Nix Packages" "Wikipedia" "Google" "Amazon" ]; }; }; }; git = { enable = true; userEmail = "alexmat2on@protonmail.com"; userName = "alex"; ignores = [ "*~" ]; extraConfig = { init.defaultBranch = "main"; }; }; kitty = { enable = true; # TODO figure out how to get atau-nixpkgs working from the flake with different systems # background_image ${atau-nixpkgs.atau-wallpapers}/share/backgrounds/atau-wallpapers/aos1.png extraConfig = '' background_tint 0.2 background_image_layout centered modify_font cell_width 110% window_border_width 1 window_margin_width 10 window_padding_width 2 ''; theme = "Rosé Pine Dawn"; font.package = pkgs.victor-mono; font.name = "Victor Mono"; font.size = 12; }; mpv = { enable = true; scriptOpts = { "ytdl_hook" = { "ytdl_path" = "${pkgs.yt-dlp}/bin/yt-dlp"; }; }; }; vscode = { enable = true; extensions = with pkgs.vscode-extensions; [ eamodio.gitlens jnoortheen.nix-ide scalameta.metals kamikillerto.vscode-colorize vscode-icons-team.vscode-icons ]; userSettings = { "security.workspace.trust.untrustedFiles" = "open"; "workbench.colorTheme" = "Default Dark Modern"; "files.autoSave" = "afterDelay"; "editor.formatOnSave" = true; "nix.formatterPath" = "nixpkgs-fmt"; "colorize.languages" = [ "javascript" "nix" ]; }; }; }; # This value determines the Home Manager release that your # configuration is compatible with. This helps avoid breakage # when a new Home Manager release introduces backwards # incompatible changes. # # You can update Home Manager without changing this value. See # the Home Manager release notes for a list of state version # changes in each release. home.stateVersion = "23.05"; home.enableNixpkgsReleaseCheck = true; # Let Home Manager install and manage itself. programs.home-manager.enable = true; }