Jump to content

KDE: Difference between revisions

From Official NixOS Wiki
Sandro (talk | contribs)
Tags: Mobile edit Mobile web edit
Malix (talk | contribs)
m Installation: feat: link to PLM
 
(44 intermediate revisions by 22 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 6 ===
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.displayManager.sddm.enable = true;
  services.displayManager.sddm.wayland.enable = true;
   services.desktopManager.plasma6.enable = true;
   services.desktopManager.plasma6.enable = true;
}
</nowiki>}}


=== Plasma 5 ===
  # Default display manager for Plasma
  services.displayManager.sddm = {
    enable = true;
 
  # To use Wayland (Experimental for SDDM)
    wayland.enable = true;
  };


{{file|/etc/nixos/configuration.nix|nix|<nowiki>
  # Optionally enable xserver
{
   services.xserver.enable = true;
   services.xserver.enable = true;
  services.displayManager.sddm.enable = true;
}|name=configuration.nix|lang=nix}}{{Warning|SDDM is no longer supported on the unstable branch, users on unstable should use [[KDE#Plasma Login Manager|Plasma Login Manager]] instead. See configuration later in this page.}}
  services.xserver.desktopManager.plasma5.enable = true;
}
</nowiki>}}


== Configuration ==
== Configuration ==


=== Rootless X11 ===
=== Excluding applications from the default install ===


{{ic|sddm}} launches X11 as a root user by default. For better security, X11 should be run as a non-root user:
Some optional packages can be excluded if they are not needed at the cost of functionality.


<syntaxHighlight lang=nix>
Optional packages: [https://github.com/NixOS/nixpkgs/blob/nixos-24.11/nixos/modules/services/desktop-managers/plasma6.nix#L159-L174 plasma6.nix]
services.xserver.displayManager.sddm.settings.General.DisplayServer = "x11-user";
</syntaxHighlight>


=== Excluding applications from the default install ===
{{File|3={
  environment.plasma6.excludePackages = with pkgs.kdePackages; [
    plasma-browser-integration
    konsole
    elisa
  ];
}|name=configuration.nix|lang=nix}}


Some optional packages that are installed by default can be excluded if they are not needed.
=== Plasma Login Manager ===


==== Plasma 5 ====
[https://github.com/KDE/plasma-login-manager Plasma Login Manager] is currently only available in unstable. If you are on unstable you can enable it with the following configuration.


Optional packages: [https://github.com/NixOS/nixpkgs/blob/nixos-23.11/nixos/modules/services/x11/desktop-managers/plasma5.nix#L275-L284 plasma5.nix]
{{File|3={
  services.displayManager.plasma-login-manager = {
    enable = true;
  };
}|name=configuration.nix|lang=nix}}


<syntaxHighlight lang=nix>
=== Default Wayland/X11 session ===
environment.plasma5.excludePackages = with pkgs.libsForQt5; [
  plasma-browser-integration
  konsole
  oxygen
];
</syntaxHighlight>


==== Plasma 6 ====
Plasma 6 runs on Wayland by default. To launch an X11 session by default:


Optional packages: [https://github.com/NixOS/nixpkgs/blob/ff0dbd94265ac470dda06a657d5fe49de93b4599/nixos/modules/services/desktop-managers/plasma6.nix#L153-L165 plasma6.nix]
{{File|3={ 
  services.displayManager.defaultSession = "plasmax11";
}|name=configuration.nix|lang=nix}}


<syntaxHighlight lang=nix>
== Troubleshooting ==
environment.plasma6.excludePackages = with pkgs.kdePackages; [
  plasma-browser-integration
  konsole
  elisa
];
</syntaxHighlight>


=== GNOME desktop integration ===
=== Qt/KDE applications segfault on start ===


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


<syntaxHighlight lang=nix>
{{note|  [https://github.com/pjones/plasma-manager Plasma-Manager] is an unofficial community project and is not yet mature}}
services.xserver.displayManager.sddm.wayland.enable = true;
By default, the Plasma configuration can be handled like on [https://wiki.archlinux.org/title/KDE traditional systems].  
</syntaxHighlight>
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.


== Troubleshooting ==
=== User icon (avatar) ===
You can add a profile picture to your user by using a png file in <code>~/.face.icon</code>.


=== Qt/KDE applications segfault on start ===
== 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.


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:
=== 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:


<syntaxHighlight lang=sh>
==== Using a single diff from a remote URL ====
find ${XDG_CACHE_HOME:-$HOME/.cache}/**/qmlcache -type f -delete
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.
</syntaxHighlight>


=== GTK themes are not applied in Wayland applications / Window Decorations missing / Cursor looks different ===
# 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>
This affects GTK applications including Firefox and Thunderbird.
# 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>


If youvare using Plasma 5, add to your configuration.nix the following line:
==== 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.


<syntaxHighlight lang=nix>
===== Remote repository =====
programs.dconf.enable = true;
<syntaxhighlight lang="nix">
</syntaxHighlight>
kdePackages = prev.kdePackages.overrideScope(kdeFinal: kdePrev: {
  powerdevil = kdePrev.powerdevil.overrideAttrs (prevPdAttrs: {
    src = builtins.fetchGit {
      url = "https://invent.kde.org/plasma/powerdevil";
      rev = "f731c18e377b87c57f7205d9c1812a34f588c577";
    };
  });
});


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''.
</syntaxhighlight>


[https://github.com/NixOS/nixpkgs/issues/180720 (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 unofficial community project}}
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]]

Latest revision as of 14:03, 12 March 2026

KDE Plasma is a desktop environment that aims to be simple by default, powerful when needed.

Installation

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

❄︎ configuration.nix
{
  # Enable Plasma 
  services.desktopManager.plasma6.enable = true;

  # Default display manager for Plasma
  services.displayManager.sddm = {
    enable = true;
  
  # To use Wayland (Experimental for SDDM)
    wayland.enable = true;
  };

  # Optionally enable xserver
  services.xserver.enable = true;
}
⚠︎
Warning: SDDM is no longer supported on the unstable branch, users on unstable should use Plasma Login Manager instead. See configuration later in this page.

Configuration

Excluding applications from the default install

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

Optional packages: plasma6.nix

❄︎ configuration.nix
{
  environment.plasma6.excludePackages = with pkgs.kdePackages; [
    plasma-browser-integration
    konsole
    elisa
  ];
}

Plasma Login Manager

Plasma Login Manager is currently only available in unstable. If you are on unstable you can enable it with the following configuration.

❄︎ configuration.nix
{
  services.displayManager.plasma-login-manager = {
    enable = true;
  };
}

Default Wayland/X11 session

Plasma 6 runs on Wayland by default. To launch an X11 session by default:

❄︎ configuration.nix
{  
  services.displayManager.defaultSession = "plasmax11";
}

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.

(See this issue)

After Update to Plasma 6 Signal-Desktop complains about a Database Error involving kwallet5

  1. Close Signal
  2. Open ~/.config/Signal/config.json
  3. Replace "safeStorageBackend": "kwallet5" with "safeStorageBackend": "kwallet6" (change 5 to 6)
  4. Start Signal

Bluetooth configuration not available

Add the following configuration (generally in hardware-configuration.nix):

 hardware.bluetooth.enable = true;

This will add the following packages:

[
 bluedevil
 bluez-qt
 pkgs.openobex
 pkgs.obexftp
]

Brightness and Color brightness control sets gamma instead of brightness on external monitors

To allow powerdevil (and by extension the "Brightness and Color" status tray menu) to control brightness on supported monitors directly instead of adjusting gamma, configure your system to enable ddcutil, and allow your user to use DDC/CI without root.

Tips and tricks

Plasma-Manager

Note: Plasma-Manager is an unofficial community project and is not yet mature

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 kdePackagesscope, 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.

  1. 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
  2. Override the patches attribute of the powerdevilpackage:
    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
Note: This will ignore files that are present in the worktree, but not committed yet.
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

Note: Since this relies on reading directly from the filesystem during the build, the impure mode has to be used, e.g.: nixos-rebuild --impure …

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 srcto 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;
  });
});