KDE: Difference between revisions

imported>Flexagoon
No edit summary
Ben9986 (talk | contribs)
m Add Plasma 5 deprecation notice
 
(71 intermediate revisions by 41 users not shown)
Line 1: Line 1:
[https://kde.org/de/plasma-desktop/ KDE Plasma] is a desktop environment that aims to be simple by default, powerful when needed.
== Installation ==
== Installation ==
=== Plasma 6 ===
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
services.xserver.desktopManager.plasma5.enable = true;
{
  services.xserver.enable = true; # optional
  services.displayManager.sddm.enable = true;
  services.displayManager.sddm.wayland.enable = true;
  services.desktopManager.plasma6.enable = true;
}
</nowiki>}}
</nowiki>}}


== Enable GTK themes in KDE ==
=== Plasma 5 ===
 
{{file|/etc/nixos/configuration.nix|nix|<nowiki>
{
  services.xserver.enable = true;
  services.displayManager.sddm.enable = true;
  services.xserver.desktopManager.plasma5.enable = true;
}
</nowiki>}}''<big>'''Note:'''</big> As of 2024, KDE Plasma 5 is end of life will not be available after NixOS 25.05.''
 
== Configuration ==
 
=== Rootless X11 ===
 
{{ic|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:
 
<syntaxhighlight lang="nix">
# Using X11 as a non-root user
services.displayManager.sddm.settings.General.DisplayServer = "x11-user";
 
# Using Wayland (preferred)
services.displayManager.sddm.settings.General.DisplayServer = "wayland";
</syntaxhighlight>
 
=== Excluding applications from the default install ===


=== Enable GTK themes in KDE in KDE System Settings ===
Some optional packages can be excluded if they are not needed at the cost of functionality.


Nixpkgs now provides the GTK configuration module for KDE system settings, which you can install with:
==== Plasma 6 ====


<syntaxhighlight lang="console">$ nix-env -i kde-gtk-config</syntaxhighlight>
Optional packages: [https://github.com/NixOS/nixpkgs/blob/nixos-24.11/nixos/modules/services/desktop-managers/plasma6.nix#L159-L174 plasma6.nix]


You should also install any GTK themes you like. You can choose a GTK theme and set related options in <code>System Settings > Application Appearance > GTK</code>.
<syntaxHighlight lang=nix>
environment.plasma6.excludePackages = with pkgs.kdePackages; [
  plasma-browser-integration
  konsole
  elisa
];
</syntaxHighlight>


=== Enable GTK themes in KDE manually ===
==== Plasma 5 ====


As a normal nix user you can install the Oxygen GTK theme:
Optional packages: [https://github.com/NixOS/nixpkgs/blob/nixos-24.05/nixos/modules/services/x11/desktop-managers/plasma5.nix#L278-L282 plasma5.nix]


<syntaxhighlight lang="console">$ nix-env -i oxygen-gtk</syntaxhighlight>
<syntaxHighlight lang=nix>
environment.plasma5.excludePackages = with pkgs.libsForQt5; [
  plasma-browser-integration
  konsole
  oxygen
];
</syntaxHighlight>


KDE will run any scripts you place in ~/.kde/env on startup so this is a good place to set the GTK_PATH so that applications can find the theme engine. If the path is wrong/unset you will see errors like this:
=== Default Wayland/X11 session ===


<code>Gtk-WARNING **: Unable to locate theme engine in module_path</code>
==== Plasma 6 ====


To set Oxygen-GTK as the gtk theme create the following file and make it executable: ~/.kde/env/set-gtk-theme.sh
Plasma 6 runs on Wayland by default. To launch an X11 session by default:
<syntaxhighlight lang="bash">
#!/bin/sh


export GTK_PATH=$GTK_PATH:~/.nix-profile/lib/gtk-2.0
<syntaxhighlight lang="nix">
export GTK2_RC_FILES=$GTK2_RC_FILES:~/.nix-profile/share/themes/oxygen-gtk/gtk-2.0/gtkrc
services.displayManager.defaultSession = "plasmax11";
</syntaxhighlight>
</syntaxhighlight>


Alternatively, on NixOS:
==== SDDM on Wayland ====


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
environment = {
services.displayManager.sddm.wayland.enable = true;
  systemPackages = [ pkgs.oxygen_gtk ];
</syntaxhighlight>
  shellInit = ''
 
    export GTK_PATH=$GTK_PATH:${pkgs.oxygen_gtk}/lib/gtk-2.0
==== Plasma 5 ====
    export GTK2_RC_FILES=$GTK2_RC_FILES:${pkgs.oxygen_gtk}/share/themes/oxygen-gtk/gtk-2.0/gtkrc
 
  '';
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:
 
<syntaxhighlight lang="nix">
services.displayManager.defaultSession = "plasmawayland";
</syntaxhighlight>
 
== Troubleshooting ==
 
=== Qt/KDE applications segfault on start ===
 
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:
 
<syntaxHighlight lang=sh>
find ${XDG_CACHE_HOME:-$HOME/.cache}/**/qmlcache -type f -delete
</syntaxHighlight>
 
=== 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''.
 
[https://github.com/NixOS/nixpkgs/issues/180720 (See this issue)]
 
=== After Update to Plasma 6 Signal-Desktop complains about a Database Error involving kwallet5 ===
 
# Close Signal
# Open ~/.config/Signal/config.json
# Replace <code>"safeStorageBackend": "kwallet5"</code> with <code>"safeStorageBackend": "kwallet6"</code> (change 5 to 6)
# Start Signal
 
=== Bluetooth configuration not available ===
 
Add the following configuration (generally in hardware-configuration.nix):
 
<syntaxHighlight lang=nix>
hardware.bluetooth.enable = true;
</syntaxHighlight>
 
This will add the following packages:
 
<syntaxHighlight lang=nix>
[
bluedevil
bluez-qt
pkgs.openobex
pkgs.obexftp
]
</syntaxHighlight>
 
== Tips and tricks ==
 
=== Plasma-Manager ===
 
{{note|  [https://github.com/pjones/plasma-manager Plasma-Manager] is an unofficial community project and is not yet mature}}
By default, the Plasma configuration can be handled like on [https://wiki.archlinux.org/title/KDE traditional systems].
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.
 
=== User icon (avatar) ===
You can add a profile picture to your user by using a png file in <code>~/.face.icon</code>.
 
== 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 <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">
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:
==== 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: <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>
==== 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 =====
<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>
</syntaxhighlight>


Or alternatively, copy the themes folder in the home directory
===== 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";
    };
  });
});


<syntaxhighlight lang="console">
$ cp -R ~/.nix-profile/share/themes/ ~/.themes
</syntaxhighlight>
</syntaxhighlight>


[[Category:Desktop environments]]
==== 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.
 
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">
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
  powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
    src = /home/eliasp/code-repositories/public/KDE/plasma/powerdevil;
  });
});
 
</syntaxhighlight>
[[Category:Desktop environment]]
[[Category:Applications]]
[[Category:KDE]]