362 lines
12 KiB
Nix
362 lines
12 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
utils,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.services.desktopManager.plasma6;
|
|
|
|
inherit (pkgs) kdePackages;
|
|
inherit (lib)
|
|
literalExpression
|
|
mkDefault
|
|
mkIf
|
|
mkOption
|
|
mkPackageOption
|
|
types
|
|
;
|
|
|
|
activationScript = ''
|
|
# will be rebuilt automatically
|
|
rm -fv "$HOME/.cache/ksycoca"*
|
|
'';
|
|
in
|
|
{
|
|
options = {
|
|
services.desktopManager.plasma6 = {
|
|
enable = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
description = "Enable the Plasma 6 (KDE 6) desktop environment.";
|
|
};
|
|
|
|
enableQt5Integration = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = "Enable Qt 5 integration (theming, etc). Disable for a pure Qt 6 system.";
|
|
};
|
|
|
|
notoPackage = mkPackageOption pkgs "Noto fonts - used for UI by default" {
|
|
default = [ "noto-fonts" ];
|
|
example = "noto-fonts-lgc-plus";
|
|
};
|
|
};
|
|
|
|
environment.plasma6.excludePackages = mkOption {
|
|
description = "List of default packages to exclude from the configuration";
|
|
type = types.listOf types.package;
|
|
default = [ ];
|
|
example = literalExpression "[ pkgs.kdePackages.elisa ]";
|
|
};
|
|
};
|
|
|
|
imports = [
|
|
(lib.mkRenamedOptionModule
|
|
[ "services" "xserver" "desktopManager" "plasma6" "enable" ]
|
|
[ "services" "desktopManager" "plasma6" "enable" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "services" "xserver" "desktopManager" "plasma6" "enableQt5Integration" ]
|
|
[ "services" "desktopManager" "plasma6" "enableQt5Integration" ]
|
|
)
|
|
(lib.mkRenamedOptionModule
|
|
[ "services" "xserver" "desktopManager" "plasma6" "notoPackage" ]
|
|
[ "services" "desktopManager" "plasma6" "notoPackage" ]
|
|
)
|
|
];
|
|
|
|
config = mkIf cfg.enable {
|
|
assertions = [
|
|
{
|
|
assertion = cfg.enable -> !config.services.xserver.desktopManager.plasma5.enable;
|
|
message = "Cannot enable plasma5 and plasma6 at the same time!";
|
|
}
|
|
];
|
|
|
|
qt.enable = true;
|
|
programs.xwayland.enable = true;
|
|
environment.systemPackages =
|
|
with kdePackages;
|
|
let
|
|
requiredPackages = [
|
|
qtwayland # Hack? To make everything run on Wayland
|
|
qtsvg # Needed to render SVG icons
|
|
|
|
# Frameworks with globally loadable bits
|
|
frameworkintegration # provides Qt plugin
|
|
kauth # provides helper service
|
|
kcoreaddons # provides extra mime type info
|
|
kded # provides helper service
|
|
kfilemetadata # provides Qt plugins
|
|
kguiaddons # provides geo URL handlers
|
|
kiconthemes # provides Qt plugins
|
|
kimageformats # provides Qt plugins
|
|
qtimageformats # provides optional image formats such as .webp and .avif
|
|
kio # provides helper service + a bunch of other stuff
|
|
kio-admin # managing files as admin
|
|
kio-extras # stuff for MTP, AFC, etc
|
|
kio-fuse # fuse interface for KIO
|
|
kpackage # provides kpackagetool tool
|
|
kservice # provides kbuildsycoca6 tool
|
|
kunifiedpush # provides a background service and a KCM
|
|
kwallet # provides helper service
|
|
kwallet-pam # provides helper service
|
|
kwalletmanager # provides KCMs and stuff
|
|
plasma-activities # provides plasma-activities-cli tool
|
|
solid # provides solid-hardware6 tool
|
|
phonon-vlc # provides Phonon plugin
|
|
|
|
# Core Plasma parts
|
|
kwin
|
|
kscreen
|
|
libkscreen
|
|
kscreenlocker
|
|
kactivitymanagerd
|
|
kde-cli-tools
|
|
kglobalacceld # keyboard shortcut daemon
|
|
kwrited # wall message proxy, not to be confused with kwrite
|
|
baloo # system indexer
|
|
milou # search engine atop baloo
|
|
kdegraphics-thumbnailers # pdf etc thumbnailer
|
|
polkit-kde-agent-1 # polkit auth ui
|
|
plasma-desktop
|
|
plasma-workspace
|
|
drkonqi # crash handler
|
|
kde-inotify-survey # warns the user on low inotifywatch limits
|
|
|
|
# Application integration
|
|
libplasma # provides Kirigami platform theme
|
|
plasma-integration # provides Qt platform theme
|
|
kde-gtk-config # syncs KDE settings to GTK
|
|
|
|
# Artwork + themes
|
|
breeze
|
|
breeze-icons
|
|
breeze-gtk
|
|
ocean-sound-theme
|
|
plasma-workspace-wallpapers
|
|
pkgs.hicolor-icon-theme # fallback icons
|
|
qqc2-breeze-style
|
|
qqc2-desktop-style
|
|
|
|
# misc Plasma extras
|
|
kdeplasma-addons
|
|
pkgs.xdg-user-dirs # recommended upstream
|
|
|
|
# Plasma utilities
|
|
kmenuedit
|
|
kinfocenter
|
|
plasma-systemmonitor
|
|
ksystemstats
|
|
libksysguard
|
|
systemsettings
|
|
kcmutils
|
|
];
|
|
optionalPackages =
|
|
[
|
|
plasma-browser-integration
|
|
konsole
|
|
(lib.getBin qttools) # Expose qdbus in PATH
|
|
ark
|
|
elisa
|
|
gwenview
|
|
okular
|
|
kate
|
|
khelpcenter
|
|
dolphin
|
|
baloo-widgets # baloo information in Dolphin
|
|
dolphin-plugins
|
|
spectacle
|
|
ffmpegthumbs
|
|
krdp
|
|
xwaylandvideobridge # exposes Wayland windows to X11 screen capture
|
|
]
|
|
++ lib.optionals config.services.flatpak.enable [
|
|
# Since PackageKit Nix support is not there yet,
|
|
# only install discover if flatpak is enabled.
|
|
discover
|
|
];
|
|
in
|
|
requiredPackages
|
|
++ utils.removePackagesByName optionalPackages config.environment.plasma6.excludePackages
|
|
++ lib.optionals config.services.desktopManager.plasma6.enableQt5Integration [
|
|
breeze.qt5
|
|
plasma-integration.qt5
|
|
pkgs.plasma5Packages.kwayland-integration
|
|
(
|
|
# Only symlink the KIO plugins, so we don't accidentally pull any services
|
|
# like KCMs or kcookiejar
|
|
let
|
|
kioPluginPath = "${pkgs.plasma5Packages.qtbase.qtPluginPrefix}/kf5/kio";
|
|
inherit (pkgs.plasma5Packages) kio;
|
|
in
|
|
pkgs.runCommand "kio5-plugins-only" { } ''
|
|
mkdir -p $out/${kioPluginPath}
|
|
ln -s ${kio}/${kioPluginPath}/* $out/${kioPluginPath}
|
|
''
|
|
)
|
|
kio-extras-kf5
|
|
]
|
|
# Optional and hardware support features
|
|
++ lib.optionals config.hardware.bluetooth.enable [
|
|
bluedevil
|
|
bluez-qt
|
|
pkgs.openobex
|
|
pkgs.obexftp
|
|
]
|
|
++ lib.optional config.networking.networkmanager.enable plasma-nm
|
|
++ lib.optional config.hardware.pulseaudio.enable plasma-pa
|
|
++ lib.optional config.services.pipewire.pulse.enable plasma-pa
|
|
++ lib.optional config.powerManagement.enable powerdevil
|
|
++ lib.optional config.services.printing.enable print-manager
|
|
++ lib.optional config.services.colord.enable colord-kde
|
|
++ lib.optional config.services.hardware.bolt.enable plasma-thunderbolt
|
|
++ lib.optional config.services.samba.enable kdenetwork-filesharing
|
|
++ lib.optional config.services.xserver.wacom.enable wacomtablet
|
|
++ lib.optional config.services.flatpak.enable flatpak-kcm;
|
|
|
|
environment.pathsToLink = [
|
|
# FIXME: modules should link subdirs of `/share` rather than relying on this
|
|
"/share"
|
|
"/libexec" # for drkonqi
|
|
];
|
|
|
|
environment.etc."X11/xkb".source = config.services.xserver.xkb.dir;
|
|
|
|
# Add ~/.config/kdedefaults to XDG_CONFIG_DIRS for shells, since Plasma sets that.
|
|
# FIXME: maybe we should append to XDG_CONFIG_DIRS in /etc/set-environment instead?
|
|
environment.sessionVariables.XDG_CONFIG_DIRS = [ "$HOME/.config/kdedefaults" ];
|
|
|
|
# Needed for things that depend on other store.kde.org packages to install correctly,
|
|
# notably Plasma look-and-feel packages (a.k.a. Global Themes)
|
|
#
|
|
# FIXME: this is annoyingly impure and should really be fixed at source level somehow,
|
|
# but kpackage is a library so we can't just wrap the one thing invoking it and be done.
|
|
# This also means things won't work for people not on Plasma, but at least this way it
|
|
# works for SOME people.
|
|
environment.sessionVariables.KPACKAGE_DEP_RESOLVERS_PATH = "${kdePackages.frameworkintegration.out}/libexec/kf6/kpackagehandlers";
|
|
|
|
# Enable GTK applications to load SVG icons
|
|
programs.gdk-pixbuf.modulePackages = [ pkgs.librsvg ];
|
|
|
|
fonts.packages = [
|
|
cfg.notoPackage
|
|
pkgs.hack-font
|
|
];
|
|
fonts.fontconfig.defaultFonts = {
|
|
monospace = [
|
|
"Hack"
|
|
"Noto Sans Mono"
|
|
];
|
|
sansSerif = [ "Noto Sans" ];
|
|
serif = [ "Noto Serif" ];
|
|
};
|
|
|
|
programs.gnupg.agent.pinentryPackage = mkDefault pkgs.pinentry-qt;
|
|
programs.kde-pim.enable = mkDefault true;
|
|
programs.ssh.askPassword = mkDefault "${kdePackages.ksshaskpass.out}/bin/ksshaskpass";
|
|
|
|
# Enable helpful DBus services.
|
|
services.accounts-daemon.enable = true;
|
|
# when changing an account picture the accounts-daemon reads a temporary file containing the image which systemsettings5 may place under /tmp
|
|
systemd.services.accounts-daemon.serviceConfig.PrivateTmp = false;
|
|
|
|
services.power-profiles-daemon.enable = mkDefault true;
|
|
services.system-config-printer.enable = mkIf config.services.printing.enable (mkDefault true);
|
|
services.udisks2.enable = true;
|
|
services.upower.enable = config.powerManagement.enable;
|
|
services.libinput.enable = mkDefault true;
|
|
|
|
# Extra UDEV rules used by Solid
|
|
services.udev.packages = [
|
|
# libmtp has "bin", "dev", "out" outputs. UDEV rules file is in "out".
|
|
pkgs.libmtp.out
|
|
pkgs.media-player-info
|
|
];
|
|
|
|
# Set up Dr. Konqi as crash handler
|
|
systemd.packages = [ kdePackages.drkonqi ];
|
|
systemd.services."drkonqi-coredump-processor@".wantedBy = [ "systemd-coredump@.service" ];
|
|
|
|
xdg.icons.enable = true;
|
|
xdg.icons.fallbackCursorThemes = mkDefault [ "breeze_cursors" ];
|
|
|
|
xdg.portal.enable = true;
|
|
xdg.portal.extraPortals = [
|
|
kdePackages.kwallet
|
|
kdePackages.xdg-desktop-portal-kde
|
|
pkgs.xdg-desktop-portal-gtk
|
|
];
|
|
xdg.portal.configPackages = mkDefault [ kdePackages.plasma-workspace ];
|
|
services.pipewire.enable = mkDefault true;
|
|
|
|
# Enable screen reader by default
|
|
services.orca.enable = mkDefault true;
|
|
|
|
services.displayManager = {
|
|
sessionPackages = [ kdePackages.plasma-workspace ];
|
|
defaultSession = mkDefault "plasma";
|
|
};
|
|
services.displayManager.sddm = {
|
|
package = kdePackages.sddm;
|
|
theme = mkDefault "breeze";
|
|
wayland.compositor = "kwin";
|
|
extraPackages = with kdePackages; [
|
|
breeze-icons
|
|
kirigami
|
|
libplasma
|
|
plasma5support
|
|
qtsvg
|
|
qtvirtualkeyboard
|
|
];
|
|
};
|
|
|
|
security.pam.services = {
|
|
login.kwallet = {
|
|
enable = true;
|
|
package = kdePackages.kwallet-pam;
|
|
};
|
|
kde = {
|
|
allowNullPassword = true;
|
|
kwallet = {
|
|
enable = true;
|
|
package = kdePackages.kwallet-pam;
|
|
};
|
|
};
|
|
kde-fingerprint = lib.mkIf config.services.fprintd.enable { fprintAuth = true; };
|
|
kde-smartcard = lib.mkIf config.security.pam.p11.enable { p11Auth = true; };
|
|
};
|
|
|
|
security.wrappers = {
|
|
kwin_wayland = {
|
|
owner = "root";
|
|
group = "root";
|
|
capabilities = "cap_sys_nice+ep";
|
|
source = "${lib.getBin pkgs.kdePackages.kwin}/bin/kwin_wayland";
|
|
};
|
|
};
|
|
|
|
programs.dconf.enable = true;
|
|
|
|
programs.firefox.nativeMessagingHosts.packages = [ kdePackages.plasma-browser-integration ];
|
|
|
|
programs.chromium = {
|
|
enablePlasmaBrowserIntegration = true;
|
|
plasmaBrowserIntegrationPackage = pkgs.kdePackages.plasma-browser-integration;
|
|
};
|
|
|
|
programs.kdeconnect.package = kdePackages.kdeconnect-kde;
|
|
programs.partition-manager.package = kdePackages.partitionmanager;
|
|
|
|
# FIXME: ugly hack. See #292632 for details.
|
|
system.userActivationScripts.rebuildSycoca = activationScript;
|
|
systemd.user.services.nixos-rebuild-sycoca = {
|
|
description = "Rebuild KDE system configuration cache";
|
|
wantedBy = [ "graphical-session-pre.target" ];
|
|
serviceConfig.Type = "oneshot";
|
|
script = activationScript;
|
|
};
|
|
};
|
|
}
|