KDE: Difference between revisions

Sdht0 (talk | contribs)
Configuration: rootless x11
Railwhale (talk | contribs)
Add very dirty workaround for setting locale in system settings
Tags: Mobile edit Mobile web edit Advanced mobile edit
 
(63 intermediate revisions by 27 users not shown)
Line 1: Line 1:
KDE Plasma is a desktop environment that aims to be simple by default, powerful when needed.
[https://kde.org/plasma-desktop/ KDE Plasma] is a desktop environment that aims to be simple by default, powerful when needed.


== Installation ==
== Installation ==


=== Plasma 5 ===
To use KDE Plasma, add this to your configuration.nix:


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|3={
{
   # Enable Plasma
   services.xserver.enable = true;
   services = {
   services.xserver.displayManager.sddm.enable = true;
    desktopManager.plasma6.enable = true;
  services.xserver.desktopManager.plasma5.enable = true;
}
</nowiki>}}


=== Plasma 6 ===
  # Default display manager for Plasma
    displayManager.plasma-login-manager.enable = true;


Available on the unstable channel.
  # Optionally enable xserver
  # xserver.enable = true;
  };
}|name=configuration.nix|lang=nix}}
== Configuration ==


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
=== Excluding applications from the default install ===
{
  services.xserver.enable = true;
  services.xserver.displayManager.sddm.enable = true;
  services.desktopManager.plasma6.enable = true;
}
</nowiki>}}


== Configuration ==
Some optional packages can be excluded if they are not needed at the cost of functionality.


=== Rootless X11 ===
Optional packages: [https://github.com/NixOS/nixpkgs/blob/7e495b747b51f95ae15e74377c5ce1fe69c1765f/nixos/modules/services/desktop-managers/plasma6.nix#L150-L170]


{{ic|sddm}} launches X11 as a root user by default. For better security, X11 should be run as a non-root user:
{{File|3={
  environment.plasma6.excludePackages = with pkgs.kdePackages; [
    plasma-browser-integration
    konsole
    elisa
  ];
}|name=configuration.nix|lang=nix}}


<syntaxHighlight lang=nix>
=== Default Wayland/X11 session ===
services.xserver.displayManager.sddm.settings.General.DisplayServer = "x11-user";
</syntaxHighlight>


=== Excluding applications from the default install ===
Plasma 6 runs on Wayland by default. To launch an X11 session by default:


Some optional packages that are installed by default can be excluded if they are not needed.
{{File|3={ 
  services.displayManager.defaultSession = "plasmax11";
}|name=configuration.nix|lang=nix}}


==== Plasma 5 ====


Optional packages: [https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/x11/desktop-managers/plasma5.nix#L275-L284 plasma5.nix]
=== Unlock KDE Wallet with LUKS password ===


<syntaxHighlight lang=nix>
When using LUKS disk encryption and autologin in your display manager, it is possible to unlock KDE Wallet with the LUKS password. Set the LUKS password, login password, and KWallet keyring password all to the same string, and for NixOS 25.11 and below use the following configuration:
environment.plasma5.excludePackages = with pkgs.libsForQt5; [
<syntaxhighlight lang="nix">
   plasma-browser-integration
{
  konsole
  boot.initrd.systemd.enable = true;
   oxygen
  systemd.services.display-manager.serviceConfig.KeyringMode = "inherit";
];
   security.pam.services.sddm-autologin.text = pkgs.lib.mkBefore ''
</syntaxHighlight>
    auth optional ${pkgs.systemd}/lib/security/pam_systemd_loadkey.so
    auth include sddm
   '';
}
</syntaxhighlight>


==== Plasma 6 ====
For Plasma Login Manager in NixOS 26.05 or above, use:
<syntaxhighlight lang="nix">
{
  boot.initrd.systemd.enable = true;
  systemd.services.plasmalogin.serviceConfig.KeyringMode = "inherit";
  security.pam.services.plasmalogin-autologin.rules.auth = {
    systemd_loadkey = {
      order = 0;
      control = "optional";
      modulePath = "${pkgs.systemd}/lib/security/pam_systemd_loadkey.so";
    };
    plasmalogin = {
      order = 1;
      control = "include";
      modulePath = "plasmalogin";
    };
  };
}
</syntaxhighlight>


Optional packages: [https://github.com/NixOS/nixpkgs/blob/ff0dbd94265ac470dda06a657d5fe49de93b4599/nixos/modules/services/desktop-managers/plasma6.nix#L153-L165 plasma6.nix]
== Troubleshooting ==


<syntaxHighlight lang=nix>
=== Qt/KDE applications segfault on start ===
environment.plasma6.excludePackages = with pkgs.kdePackages; [
  plasma-browser-integration
  konsole
  elisa
];
</syntaxHighlight>


=== GNOME desktop integration ===
This is caused by a stale QML cache [https://github.com/NixOS/nixpkgs/issues/177720 (see this issue)]. A dirty way to fix this is by running on a terminal the following command:


Using the following example configuration, QT applications will have a look similar to the [[GNOME]] desktop, using a dark theme.
<syntaxHighlight lang=sh>
 
find ${XDG_CACHE_HOME:-$HOME/.cache}/**/qmlcache -type f -delete
<syntaxHighlight lang=nix>
qt = {
  enable = true;
  platformTheme = "gnome";
  style = "adwaita-dark";
};
</syntaxHighlight>
</syntaxHighlight>


For other themes, you may need the packages <code>libsForQt5.qt5ct</code> and <code>libsForQt5.qtstyleplugin-kvantum</code> and a symlink from <code>~/.config/Kvantum/</code> to your theme package. Here is an example using Arc-Dark and [[Home Manager]]. In the Home Manager configuration:
=== GTK themes are not applied in Wayland applications / Window Decorations missing / Cursor looks different ===
This affects GTK applications including Firefox and Thunderbird.


<syntaxHighlight lang=nix>
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''.
qt = {
  enable = true;
  platformTheme = "qtct";
  style.name = "kvantum";
};


xdg.configFile = {
[https://github.com/NixOS/nixpkgs/issues/180720 (See this issue)]
  "Kvantum/ArcDark".source = "${pkgs.arc-kde-theme}/share/Kvantum/ArcDark";
  "Kvantum/kvantum.kvconfig".text = "[General]\ntheme=ArcDark";
};
</syntaxHighlight>


For more details, see [https://discourse.nixos.org/t/guide-to-installing-qt-theme/35523/2 this] forum post.
=== After Update to Plasma 6 Signal-Desktop complains about a Database Error involving kwallet5 ===


=== Default Wayland/X11 session ===
# Close Signal
# Open ~/.config/Signal/config.json
# Replace <code>"safeStorageBackend": "kwallet5"</code> with <code>"safeStorageBackend": "kwallet6"</code> (change 5 to 6)
# Start Signal


==== Plasma 5 ====
=== Bluetooth configuration not available ===


Plasma 5 runs on X11 by default. To launch a Wayland session by default:
Add the following configuration (generally in hardware-configuration.nix):


<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
services.xserver.displayManager.defaultSession = "plasmawayland";
hardware.bluetooth.enable = true;
</syntaxHighlight>
</syntaxHighlight>


==== Plasma 6 ====
This will add the following packages:
 
Plasma 6 runs on Wayland by default. To launch an X11 session by default:


<syntaxHighlight lang=nix>
<syntaxHighlight lang=nix>
services.xserver.displayManager.defaultSession = "plasmax11";
[
bluedevil
bluez-qt
pkgs.openobex
pkgs.obexftp
]
</syntaxHighlight>
</syntaxHighlight>


==== SDDM on Wayland ====
=== Brightness and Color brightness control sets gamma instead of brightness on external monitors ===
To allow <code>powerdevil</code> (and by extension the "Brightness and Color" status tray menu) to control brightness on supported monitors directly instead of adjusting gamma, [[Backlight#Via ddcutil|configure your system to enable ddcutil]], and allow your user to use DDC/CI without root. Note that you do not need to add <code>ddcutil</code> to your system packages because PowerDevil uses libddcutil.


<syntaxHighlight lang=nix>
=== Plasma wallpaper reverts back to default after a Nix GC ===
services.xserver.displayManager.sddm.wayland.enable = true;
When setting a wallpaper, Plasma may save the path as a <code>/nix/store/*/share/wallpapers</code> path instead of <code>/run/current-system/sw/share/wallpapers/</code>. To fix this, open <code>$XDG_CONFIG_HOME/plasma-org.kde.plasma.desktop-appletsrc</code> and manually change the paths.
</syntaxHighlight>
 
=== No available locale settings in the Plasma system settings ===
The "Region & Language" page in the Plasma system settings is somewhat broken on NixOS. Instead, edit the <code>$XDG_CONFIG_HOME/plasma-localerc</code> file.
 
If you really want to configure locale in settings, you can use this workaround:
<syntaxhighlight lang="nix">
{ pkgs, ... }:
{
  i18n = {
    extraLocales = "all";
    imperativeLocale = true; # Unknown if needed (system settings sets user-level override?)
  };
  environment = {
    systemPackages = [ pkgs.stdenv.cc.libc.out ]; # this derivation contains the locales
    pathsToLink = [ "/share/i18n" ];
  };
}
</syntaxhighlight>
 
Switch to that configuration, then run:


== Troubleshooting ==
<syntaxhighlight lang="bash">
sudo mkdir -p /usr/share/i18n
sudo ln -s /run/current-system/sw/share/i18n/locales /usr/share/i18n/locales
</syntaxhighlight>
That is a very dirty command, and I don't know if it persists across reboots.


=== Qt/KDE applications segfault on start ===
== Tips and tricks ==


This is caused by a stale QML cache [https://github.com/NixOS/nixpkgs/issues/177720 (see this issue)]. A dirty way to fix this is by running on a terminal the following command:
=== Plasma-Manager ===


<syntaxHighlight lang=sh>
{{note|  [https://github.com/nix-community/plasma-manager Plasma-Manager] is a community project}}
find ${XDG_CACHE_HOME:-$HOME/.cache}/**/qmlcache -type f -delete
By default, the Plasma configuration can be handled like on [https://wiki.archlinux.org/title/KDE traditional systems].
</syntaxHighlight>
With [https://github.com/nix-community/plasma-manager plasma-manager], it is possible to make Plasma configurations via nix by providing [https://github.com/nix-community/home-manager home-manager] modules.


=== GTK themes are not applied in Wayland applications / Window Decorations missing / Cursor looks different ===
=== User icon (avatar) ===
This affects GTK applications including Firefox and Thunderbird.
You can add a profile picture to your user by using a png file in <code>~/.face.icon</code>.


Add to your configuration.nix the following line:
== 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.


<syntaxHighlight lang=nix>
=== Customizing ''nixpkgs'' ===
programs.dconf.enable = true;
To override KDE packages, the common way using <code>overrideAttrs</code> won't work, since they are part of the <code>kdePackages</code>scope, which requires the usage of <code>overrideScope</code> first:<syntaxhighlight lang="nix">
</syntaxHighlight>
nixpkgs-overlay = final: prev: {
  kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
    somepackage = kdePrev.somepackage.overrideAttrs(prevPkgAttrs: {
      someattribute = …;
    };
  };
};
</syntaxhighlight>The following examples will demonstrate various ways how to achieve the customization of the KDE package <code>powerdevil</code> in different scenarios:


You might also 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''.
==== 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.


[https://github.com/NixOS/nixpkgs/issues/180720 (See this issue)]
# Generate the SRI hash of the file: <code>nix store prefetch-file <nowiki>https://invent.kde.org/plasma/powerdevil/-/commit/f731c18e377b87c57f7205d9c1812a34f588c577.diff</nowiki> --json --name toggle-nightlight.diff</code>
# Override the <code>patches</code> attribute of the <code>powerdevil</code>package:<syntaxhighlight lang="nix">
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=";
      })
    ];
  });
});
</syntaxhighlight>


=== KMail Renders Blank Messages ===
==== 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.


When you see the message <code>grantlee.template: "Plugin library 'kde_grantlee_plugin' not found."</code> and/or kmail does shows only empty message then add to your configuration.nix the following line:
===== Remote repository =====
<syntaxhighlight lang="nix">
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
  powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
    src = builtins.fetchGit {
      url = "https://invent.kde.org/plasma/powerdevil";
      rev = "f731c18e377b87c57f7205d9c1812a34f588c577";
    };
  });
});


<syntaxHighlight lang=nix>
</syntaxhighlight>
environment.sessionVariables = {
  NIX_PROFILES = "${pkgs.lib.concatStringsSep " " (pkgs.lib.reverseList config.environment.profiles)}";
};
</syntaxHighlight>


[https://github.com/NixOS/nixpkgs/issues/160599 (See this issue)]
===== Local repository =====
{{Note|This will ignore files that are present in the worktree, but not committed yet.}}
<syntaxhighlight lang="nix">
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";
    };
  });
});


== Tips and tricks ==
</syntaxhighlight>


=== Plasma-Manager ===
==== Using the worktree of a local repository ====
{{Note|Since this relies on reading directly from the filesystem during the build, the impure mode has to be used, e.g.: <code>nixos-rebuild --impure …</code>}}
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.


{{note|  [https://github.com/pjones/plasma-manager Plasma-Manager] is not matured yet and currently unofficial }}
By just redirecting <code>src</code>to the path of the working directory, where the required code resides, quick & dirty rebuilds are possible:<syntaxhighlight lang="nix">
By default, the Plasma configuration can be handled like on [https://wiki.archlinux.org/title/KDE traditional systems].  
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
With [https://github.com/pjones/plasma-manager plasma-manager], it is possible to make Plasma configurations via nix by providing [https://github.com/nix-community/home-manager home-manager] modules.
  powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
    src = /home/eliasp/code-repositories/public/KDE/plasma/powerdevil;
  });
});


</syntaxhighlight>
[[Category:Desktop environment]]
[[Category:Desktop environment]]
[[Category:Applications]]
[[Category:Applications]]
[[Category:KDE]]