{ config, options, lib, pkgs, ... }: with lib; with lib.my; let cfg = config.modules.desktop; in { config = mkIf config.services.xserver.enable { assertions = [ { assertion = (countAttrs (n: v: n == "enable" && value) cfg) < 2; message = "Can't have more than one desktop environment enabled at a time"; } { assertion = let srv = config.services; in srv.xserver.enable || srv.sway.enable || !(anyAttrs (n: v: isAttrs v && anyAttrs (n: v: isAttrs v && v.enable)) cfg); message = "Can't enable a desktop app without a desktop environment"; } ]; user.packages = with pkgs; [ feh # image viewer xclip xdotool libqalculate # calculator cli w/ currency conversion (makeDesktopItem { name = "scratch-calc"; desktopName = "Calculator"; icon = "calc"; exec = ''scratch "${tmux}/bin/tmux new-session -s calc -n calc qalc"''; categories = "Development"; }) ]; fonts = { enableFontDir = true; enableGhostscriptFonts = true; fonts = with pkgs; [ ubuntu_font_family dejavu_fonts fira-code fira-code-symbols symbola noto-fonts noto-fonts-cjk font-awesome-ttf siji ]; fontconfig.defaultFonts = { sansSerif = ["Fira Sans"]; monospace = ["Fira Code"]; }; }; ## Apps/Services services.xserver.displayManager.lightdm.greeters.mini.user = config.user.name; services.picom = { backend = "glx"; vSync = true; opacityRules = [ # "100:class_g = 'Firefox'" # "100:class_g = 'Vivaldi-stable'" "100:class_g = 'VirtualBox Machine'" # Art/image programs where we need fidelity "100:class_g = 'Gimp'" "100:class_g = 'Inkscape'" "100:class_g = 'aseprite'" "100:class_g = 'krita'" "100:class_g = 'feh'" "100:class_g = 'mpv'" "100:class_g = 'Rofi'" "100:class_g = 'Peek'" "99:_NET_WM_STATE@:32a = '_NET_WM_STATE_FULLSCREEN'" ]; shadowExclude = [ # Put shadows on notifications, the scratch popup and rofi only "! name~='(rofi|scratch|Dunst)$'" ]; settings = { blur-background-exclude = [ "window_type = 'dock'" "window_type = 'desktop'" "class_g = 'Rofi'" "_GTK_FRAME_EXTENTS@:c" ]; # Unredirect all windows if a full-screen opaque window is detected, to # maximize performance for full-screen windows. Known to cause # flickering when redirecting/unredirecting windows. unredir-if-possible = true; # GLX backend: Avoid using stencil buffer, useful if you don't have a # stencil buffer. Might cause incorrect opacity when rendering # transparent content (but never practically happened) and may not work # with blur-background. My tests show a 15% performance boost. # Recommended. glx-no-stencil = true; # Use X Sync fence to sync clients' draw calls, to make sure all draw # calls are finished before picom starts drawing. Needed on # nvidia-drivers with GLX backend for some users. xrender-sync-fence = true; }; }; # Try really hard to get QT to respect my GTK theme. env.GTK_DATA_PREFIX = [ "${config.system.path}" ]; env.QT_QPA_PLATFORMTHEME = "gtk2"; qt5 = { style = "gtk2"; platformTheme = "gtk2"; }; # Also, read xresources files in ~/.config/xtheme/* and init scripts in # ~/.config/xsessions/*, so I can centralize my theme config files. services.xserver.displayManager.sessionCommands = let cfg = config.services.xserver.desktopManager.wallpaper; in '' export GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc" source "$XDG_CONFIG_HOME"/xsession/*.sh xrdb -merge "$XDG_CONFIG_HOME"/xtheme/* if [ -e "$XDG_DATA_HOME/wallpaper" ]; then ${pkgs.feh}/bin/feh --bg-${cfg.mode} \ ${optionalString cfg.combineScreens "--no-xinerama"} \ --no-fehbg \ $XDG_DATA_HOME/wallpaper fi ''; # Clean up leftovers, as much as we can system.userActivationScripts.cleanupHome = '' pushd "${homeDir}" rm -rf .compose-cache .nv .pki .dbus .fehbg [ -s .xsession-errors ] || rm -f .xsession-errors* popd ''; }; }