{ mkDerivation
, lib
, extra-cmake-modules
, kdoctools
, isocodes
, libdbusmenu
, libSM
, libXcursor
, libXtst
, libXft
, pam
, wayland
, xmessage
, xsetroot
, baloo
, breeze-qt5
, kactivities
, kactivities-stats
, kcmutils
, kconfig
, kcrash
, kdbusaddons
, kdeclarative
, kdelibs4support
, kdesu
, kglobalaccel
, kidletime
, kinit
, kjsembed
, knewstuff
, knotifyconfig
, kpackage
, kpeople
, krunner
, kscreenlocker
, ktexteditor
, ktextwidgets
, kwallet
, kwayland
, kwin
, kxmlrpcclient
, libkscreen
, libksysguard
, libqalculate
, networkmanager-qt
, phonon
, plasma-framework
, prison
, solid
, kholidays
, kquickcharts
, appstream-qt
, plasma-wayland-protocols
, kpipewire
, libkexiv2
, kuserfeedback
, qtgraphicaleffects
, qtquickcontrols
, qtquickcontrols2
, qtscript
, qttools
, qtwayland
, qtx11extras
, qqc2-desktop-style
, polkit-qt
, pipewire
, libdrm
, fetchpatch
}:

let inherit (lib) getBin getLib; in

mkDerivation {
  pname = "plasma-workspace";
  passthru.providedSessions = [ "plasma" "plasmawayland" ];

  nativeBuildInputs = [ extra-cmake-modules kdoctools ];
  buildInputs = [
    isocodes
    libdbusmenu
    libSM
    libXcursor
    libXtst
    libXft
    pam
    wayland

    baloo
    kactivities
    kactivities-stats
    kcmutils
    kconfig
    kcrash
    kdbusaddons
    kdeclarative
    kdelibs4support
    kdesu
    kglobalaccel
    kidletime
    kjsembed
    knewstuff
    knotifyconfig
    kpackage
    kpeople
    krunner
    kscreenlocker
    ktexteditor
    ktextwidgets
    kwallet
    kwayland
    kwin
    kxmlrpcclient
    libkscreen
    libksysguard
    libqalculate
    networkmanager-qt
    phonon
    plasma-framework
    prison
    solid
    kholidays
    kquickcharts
    appstream-qt
    plasma-wayland-protocols
    kpipewire
    libkexiv2

    kuserfeedback
    qtgraphicaleffects
    qtquickcontrols
    qtquickcontrols2
    qtscript
    qtwayland
    qtx11extras
    qqc2-desktop-style
    polkit-qt

    pipewire
    libdrm
  ];
  propagatedUserEnvPkgs = [ qtgraphicaleffects ];
  outputs = [ "out" "dev" ];

  cmakeFlags = [
    ''-DNIXPKGS_BREEZE_WALLPAPERS=${getBin breeze-qt5}/share/wallpapers''
  ];

  patches = [
    ./0001-startkde.patch
    ./0002-absolute-wallpaper-install-dir.patch

    # Backport patch for cleaner shutdowns
    (fetchpatch {
      url = "https://invent.kde.org/plasma/plasma-workspace/-/commit/6ce8f434139f47e6a71bf0b68beae92be8845ce4.patch";
      hash = "sha256-cYw/4/9tSnCbArLr72O8F8V0NLkVXdCVnJGoGxSzZMg=";
    })
  ];

  # QT_INSTALL_BINS refers to qtbase, and qdbus is in qttools
  postPatch = ''
    substituteInPlace CMakeLists.txt \
      --replace 'ecm_query_qt(QtBinariesDir QT_INSTALL_BINS)' 'set(QtBinariesDir "${lib.getBin qttools}/bin")'
  '';

  # work around wrapQtAppsHook double-wrapping kcminit_startup,
  # which is a symlink to kcminit
  postFixup = ''
    ln -sf $out/bin/kcminit $out/bin/kcminit_startup
  '';

  env.NIX_CFLAGS_COMPILE = toString [
    ''-DNIXPKGS_XMESSAGE="${getBin xmessage}/bin/xmessage"''
    ''-DNIXPKGS_XSETROOT="${getBin xsetroot}/bin/xsetroot"''
    ''-DNIXPKGS_START_KDEINIT_WRAPPER="${getLib kinit}/libexec/kf5/start_kdeinit_wrapper"''
    ''-DNIXPKGS_KDEINIT5_SHUTDOWN="${getBin kinit}/bin/kdeinit5_shutdown"''
  ];
}
