KDE
KDE Plasma is a desktop environment that aims to be simple by default, powerful when needed.
Installation
Plasma 6
/etc/nixos/configuration.nix
{
services.xserver.enable = true; # optional
services.displayManager.sddm.enable = true;
services.displayManager.sddm.wayland.enable = true;
services.desktopManager.plasma6.enable = true;
}
Plasma 5
/etc/nixos/configuration.nix
{
services.xserver.enable = true;
services.displayManager.sddm.enable = true;
services.xserver.desktopManager.plasma5.enable = true;
}
Configuration
Rootless X11
sddm
launches X11 as a root user by default. For better security, X11 can be run as a non-root user, but using Wayland is better tested and thus preferred:
services.displayManager.sddm.settings.General.DisplayServer = "x11-user";
Excluding applications from the default install
Some optional packages can be excluded if they are not needed at the cost of functionality.
Plasma 6
Optional packages: plasma6.nix
environment.plasma6.excludePackages = with pkgs.kdePackages; [
plasma-browser-integration
konsole
elisa
];
Plasma 5
Optional packages: plasma5.nix
environment.plasma5.excludePackages = with pkgs.libsForQt5; [
plasma-browser-integration
konsole
oxygen
];
GNOME desktop integration
Using the following example configuration, QT applications will have a look similar to the GNOME desktop, using a dark theme.
qt = {
enable = true;
platformTheme = "gnome";
style = "adwaita-dark";
};
For other themes, you may need the packages libsForQt5.qt5ct
and libsForQt5.qtstyleplugin-kvantum
and a symlink from ~/.config/Kvantum/
to your theme package. Here is an example using Arc-Dark and Home Manager. In the Home Manager configuration:
qt = {
enable = true;
platformTheme = "qtct";
style = "kvantum";
};
xdg.configFile = {
"Kvantum/ArcDark".source = "${pkgs.arc-kde-theme}/share/Kvantum/ArcDark";
"Kvantum/kvantum.kvconfig".text = "[General]\ntheme=ArcDark";
};
For more details, see this forum post.
Default Wayland/X11 session
Plasma 6
Plasma 6 runs on Wayland by default. To launch an X11 session by default:
services.displayManager.defaultSession = "plasmax11";
SDDM on Wayland
services.displayManager.sddm.wayland.enable = true;
Plasma 5
Plasma 5 runs on X11 by default and it is recommended to use Wayland with Plasma 6 instead. To launch a Wayland session by default anyway:
services.displayManager.defaultSession = "plasmawayland";
Troubleshooting
Qt/KDE applications segfault on start
This is caused by a stale QML cache (see this issue). A dirty way to fix this is by running on a terminal the following command:
find ${XDG_CACHE_HOME:-$HOME/.cache}/**/qmlcache -type f -delete
GTK themes are not applied in Wayland applications / Window Decorations missing / Cursor looks different
This affects GTK applications including Firefox and Thunderbird.
You may need to set a GTK theme Breeze imitating the KDE theme with the same name in System Settings -> Application Style -->Configure GNOME/GTK Application Style.
After Update to Plasma 6 Signal-Desktop complains about a Database Error involving kwallet5
- Close Signal
- Open ~/.config/Signal/config.json
- Replace
"safeStorageBackend": "kwallet5"
with"safeStorageBackend": "kwallet6"
(change 5 to 6) - Start Signal
Tips and tricks
Plasma-Manager
By default, the Plasma configuration can be handled like on traditional systems. With plasma-manager, it is possible to make Plasma configurations via nix by providing home-manager modules.
User icon (avatar)
You can add a profile picture to your user by using a png file in ~/.face.icon
.
Hacking
There are many reasons to modify the KDE packages, such as testing patches from other KDE developers, applying a fix before it is officially released and finds its way into nixpkgs or developing contributions for the KDE project.
Customizing nixpkgs
To override KDE packages, the common way using overrideAttrs
won't work, since they are part of the kdePackages
scope, which requires the usage of overrideScope
first:
nixpkgs-overlay = final: prev: {
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
somepackage = kdePrev.somepackage.overrideAttrs(prevPkgAttrs: {
someattribute = …;
};
};
};
The following examples will demonstrate various ways how to achieve the customization of the KDE package powerdevil
in different scenarios:
Using a single diff from a remote URL
A KDE developer might have provided a diff that one wants to utilize locally to test it or to make use of it until it's included in an upcoming release.
- Generate the SRI hash of the file:
nix store prefetch-file https://invent.kde.org/plasma/powerdevil/-/commit/f731c18e377b87c57f7205d9c1812a34f588c577.diff --json --name toggle-nightlight.diff
- Override the
patches
attribute of thepowerdevil
package:kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: { powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: { patches = prevPdAttrs.patches or [] ++ [ (prev.fetchpatch { name = "toggle-nightlight.diff"; url = "https://invent.kde.org/plasma/powerdevil/-/commit/f731c18e377b87c57f7205d9c1812a34f588c577.diff"; sha256 = "sha256-X0ZHSRnSLqmp2fcLGx9DUTn7F9BFh5puh9Q4YAj6/5o="; }) ]; }); });
Using commits of a repository
Either a local clone or remote repository might provide the code that should be used to build the package in question instead.
Remote repository
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
src = builtins.fetchGit {
url = "https://invent.kde.org/plasma/powerdevil";
rev = "f731c18e377b87c57f7205d9c1812a34f588c577";
};
});
});
Local repository
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
src = builtins.fetchGit {
url = "file:///home/eliasp/code-repositories/public/KDE/plasma/powerdevil";
rev = "f731c18e377b87c57f7205d9c1812a34f588c577";
};
});
});
Using the worktree of a local repository
Now one might not want to commit each and every change during development to iterate more quickly, but to just rebuild after having saved the latest changes.
By just redirecting src
to the path of the working directory, where the required code resides, quick & dirty rebuilds are possible:
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
src = /home/eliasp/code-repositories/public/KDE/plasma/powerdevil;
});
});