{ lib, pkgs, config, utils, ... }: let inherit (lib) concatMapStrings literalExpression mkDefault mkEnableOption mkIf mkOption types ; cfg = config.services.desktopManager.budgie; nixos-background-light = pkgs.nixos-artwork.wallpapers.nineish; nixos-background-dark = pkgs.nixos-artwork.wallpapers.nineish-dark-gray; nixos-gsettings-overrides = pkgs.budgie-gsettings-overrides.override { inherit (cfg) extraGSettingsOverrides extraGSettingsOverridePackages; inherit nixos-background-dark nixos-background-light; }; nixos-background-info = pkgs.writeTextFile { name = "nixos-background-info"; text = '' Nineish ${nixos-background-light.gnomeFilePath} zoom solid #d1dcf8 #e3ebfe Nineish Dark Gray ${nixos-background-dark.gnomeFilePath} zoom solid #151515 #262626 ''; destination = "/share/gnome-background-properties/nixos.xml"; }; budgie-control-center' = pkgs.budgie-control-center.override { enableSshSocket = config.services.openssh.startWhenNeeded; }; notExcluded = pkg: utils.disablePackageByName pkg config.environment.budgie.excludePackages; in { meta.teams = [ lib.teams.budgie ]; imports = [ (lib.mkRenamedOptionModule [ "services" "xserver" "desktopManager" "budgie" ] [ "services" "desktopManager" "budgie" ] ) ]; options = { services.desktopManager.budgie = { enable = mkEnableOption "the Budgie desktop"; sessionPath = mkOption { description = '' Additional list of packages to be added to the session search path. Useful for GSettings-conditional autostart. Note that this should be a last resort; patching the package is preferred (see GPaste). ''; type = types.listOf types.package; default = [ ]; example = literalExpression "[ pkgs.gpaste ]"; }; extraGSettingsOverrides = mkOption { description = "Additional GSettings overrides."; type = types.lines; default = ""; }; extraGSettingsOverridePackages = mkOption { description = "List of packages for which GSettings are overridden."; type = types.listOf types.path; default = [ ]; }; extraPlugins = mkOption { description = "Extra plugins for the Budgie desktop"; type = types.listOf types.package; default = [ ]; example = literalExpression "[ pkgs.budgie-analogue-clock-applet ]"; }; }; environment.budgie.excludePackages = mkOption { description = "Which packages Budgie should exclude from the default environment."; type = types.listOf types.package; default = [ ]; example = literalExpression "[ pkgs.mate-terminal ]"; }; }; config = mkIf cfg.enable { services.displayManager.sessionPackages = with pkgs; [ budgie-desktop ]; services.xserver.displayManager.lightdm.greeters.slick = { enable = mkDefault true; theme = mkDefault { name = "Qogir"; package = pkgs.qogir-theme; }; iconTheme = mkDefault { name = "Qogir"; package = pkgs.qogir-icon-theme; }; cursorTheme = mkDefault { name = "Qogir"; package = pkgs.qogir-icon-theme; }; }; services.desktopManager.budgie.sessionPath = [ pkgs.budgie-desktop-view ]; environment.extraInit = '' ${concatMapStrings (p: '' if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name} fi if [ -d "${p}/lib/girepository-1.0" ]; then export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib fi '') cfg.sessionPath} '' + lib.optionalString config.services.gnome.gcr-ssh-agent.enable '' # Hack: https://bugzilla.redhat.com/show_bug.cgi?id=2250704 still # applies to sessions not managed by systemd. if [ -z "$SSH_AUTH_SOCK" ] && [ -n "$XDG_RUNTIME_DIR" ]; then export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gcr/ssh" fi ''; # https://docs.buddiesofbudgie.org/10.10/developer/workflow/building-budgie-desktop/#compositor-recommendations programs.labwc.enable = mkDefault true; programs.gtklock.enable = mkDefault true; environment.systemPackages = with pkgs; [ # Budgie Desktop. budgie-backgrounds budgie-control-center' budgie-desktop-services (budgie-desktop-with-plugins.override { plugins = cfg.extraPlugins; }) budgie-desktop-view budgie-session # Required by Budgie Menu. gnome-menus # Required by Budgie Control Center. zenity # Provides `gsettings`. glib # Update user directories. xdg-user-dirs ] ++ lib.optional config.networking.networkmanager.enable pkgs.networkmanagerapplet ++ (utils.removePackagesByName [ bluejay nemo eom pluma atril engrampa mate-calc mate-system-monitor vlc # Supplemental tooling. # See budgie-desktop's with-runtime-dependencies meson option. gammastep grim killall mesa-demos # eglinfo slurp swaybg swayidle wdisplays wlopm # Desktop themes. qogir-theme qogir-icon-theme nixos-background-info # Default settings. nixos-gsettings-overrides ] config.environment.budgie.excludePackages) ++ cfg.sessionPath; # Both budgie-desktop-view and nemo defaults to this emulator. programs.gnome-terminal.enable = mkDefault (notExcluded pkgs.gnome-terminal); # Fonts. fonts.packages = [ pkgs.noto-fonts pkgs.hack-font ]; fonts.fontconfig.defaultFonts = { sansSerif = mkDefault [ "Noto Sans" ]; monospace = mkDefault [ "Hack" ]; }; environment.pathsToLink = [ "/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173 ]; # GSettings overrides. environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas"; # Required by Budgie Desktop. services.xserver.updateDbusEnvironment = true; programs.dconf.enable = true; # Required by Budgie's Polkit Dialog. security.polkit.enable = mkDefault true; # Required by Budgie Panel plugins and/or Budgie Control Center panels. networking.networkmanager.enable = mkDefault true; # for BCC's Network panel. programs.nm-applet.enable = config.networking.networkmanager.enable; # Budgie has no Network applet. programs.nm-applet.indicator = true; # Budgie uses AppIndicators. hardware.bluetooth.enable = mkDefault true; # for Budgie's Status Indicator and Bluejay. xdg.portal.enable = mkDefault true; # for BCC's Applications panel. xdg.portal.extraPortals = with pkgs; [ xdg-desktop-portal-gtk # provides a XDG Portals implementation. xdg-desktop-portal-wlr # for screenshot and screencast. ]; xdg.portal.configPackages = mkDefault [ pkgs.budgie-desktop ]; services.geoclue2.enable = mkDefault true; # for BCC's Privacy > Location Services panel. services.upower.enable = config.powerManagement.enable; # for Budgie's Status Indicator and BCC's Power panel. services.libinput.enable = mkDefault true; # for BCC's Mouse panel. services.colord.enable = mkDefault true; # for BCC's Color panel. services.gnome.at-spi2-core.enable = mkDefault true; # for BCC's A11y panel. services.accounts-daemon.enable = mkDefault true; # for BCC's Users panel. services.udisks2.enable = mkDefault true; # for BCC's Details panel. # For BCC's Online Accounts panel. services.gnome.gnome-online-accounts.enable = mkDefault true; # For BCC's Printers panel. services.printing.enable = mkDefault true; services.system-config-printer.enable = config.services.printing.enable; # For BCC's Sharing panel. services.dleyna.enable = mkDefault true; services.gnome.gnome-user-share.enable = mkDefault true; services.gnome.rygel.enable = mkDefault true; # Other default services. services.gnome.evolution-data-server.enable = mkDefault true; services.gnome.glib-networking.enable = mkDefault true; services.gnome.gnome-keyring.enable = mkDefault true; services.gnome.gcr-ssh-agent.enable = mkDefault true; services.gnome.gnome-settings-daemon.enable = mkDefault true; services.gvfs.enable = mkDefault true; # Register packages for DBus. services.dbus.packages = [ budgie-control-center' pkgs.budgie-desktop-services ]; # Shell integration for MATE Terminal. programs.bash.vteIntegration = true; programs.zsh.vteIntegration = true; }; }