about summary refs log tree commit diff
path: root/nixpkgs/pkgs/desktops/pantheon/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/desktops/pantheon/desktop')
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix78
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.appcenter.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.mail.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.tasks.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override2
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix130
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch25
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix51
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix85
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix46
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix158
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list168
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix72
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/default.nix53
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/exec-path.patch22
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix104
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch21
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/default.nix56
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/exec-path.patch11
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/a11y/default.nix70
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix96
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch24
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix80
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/fix-paths.patch26
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix75
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix58
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix65
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix57
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix77
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/fix-paths.patch13
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix67
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix68
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix92
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch21
-rw-r--r--nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix61
46 files changed, 2167 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
new file mode 100644
index 000000000000..a42ae92e97af
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/default.nix
@@ -0,0 +1,78 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, meson
+, ninja
+, nixos-artwork
+, glib
+, pkg-config
+, dbus
+, polkit
+, accountsservice
+, python3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-default-settings";
+  version = "6.0.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "default-settings";
+    rev = version;
+    sha256 = "sha256-qaPj/Qp7RYzHgElFdM8bHV42oiPUbCMTC9Q+MUj4Q6Y=";
+  };
+
+  nativeBuildInputs = [
+    accountsservice
+    dbus
+    glib # polkit requires
+    meson
+    ninja
+    pkg-config
+    polkit
+    python3
+  ];
+
+  mesonFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+    "-Ddefault-wallpaper=${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}"
+    "-Dplank-dockitems=false"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  preInstall = ''
+    # Install our override for plank dockitems as the desktop file path is different.
+    schema_dir=$out/share/glib-2.0/schemas
+    install -D ${./overrides/plank-dockitems.gschema.override} $schema_dir/plank-dockitems.gschema.override
+
+    # Our launchers that use paths at /run/current-system/sw/bin
+    mkdir -p $out/etc/skel/.config/plank/dock1
+    cp -avr ${./launchers} $out/etc/skel/.config/plank/dock1/launchers
+  '';
+
+  postFixup = ''
+    # https://github.com/elementary/default-settings/issues/55
+    rm -r $out/share/cups
+    rm -r $out/share/applications
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Default settings and configuration files for elementary";
+    homepage = "https://github.com/elementary/default-settings";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
new file mode 100644
index 000000000000..b25bb8c85904
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/gala-multitaskingview.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/gala-multitaskingview.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.appcenter.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.appcenter.dockitem
new file mode 100644
index 000000000000..586a74df2447
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.appcenter.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.appcenter.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
new file mode 100644
index 000000000000..3bd7d531840d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.calendar.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.calendar.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.mail.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.mail.dockitem
new file mode 100644
index 000000000000..e07328c59473
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.mail.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.mail.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
new file mode 100644
index 000000000000..494edde183ca
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.music.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.music.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
new file mode 100644
index 000000000000..89536754964d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.photos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.photos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
new file mode 100644
index 000000000000..312c35d9bf00
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.switchboard.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.switchboard.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.tasks.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.tasks.dockitem
new file mode 100644
index 000000000000..a98825afcb28
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.tasks.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.tasks.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
new file mode 100644
index 000000000000..3b0f721a5644
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/io.elementary.videos.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/io.elementary.videos.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
new file mode 100644
index 000000000000..b0218bac52d7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/launchers/org.gnome.Epiphany.dockitem
@@ -0,0 +1,2 @@
+[PlankDockItemPreferences]
+Launcher=file:///run/current-system/sw/share/applications/org.gnome.Epiphany.desktop
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override
new file mode 100644
index 000000000000..0ba89fa4b40b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-default-settings/overrides/plank-dockitems.gschema.override
@@ -0,0 +1,2 @@
+[net.launchpad.plank.dock.settings]
+dock-items=['gala-multitaskingview.dockitem','org.gnome.Epiphany.dockitem','io.elementary.mail.dockitem','io.elementary.tasks.dockitem','io.elementary.calendar.dockitem','io.elementary.music.dockitem','io.elementary.videos.dockitem','io.elementary.photos.dockitem','io.elementary.switchboard.dockitem','io.elementary.appcenter.dockitem']
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
new file mode 100644
index 000000000000..06fbfdc078e2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/default.nix
@@ -0,0 +1,130 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, linkFarm
+, substituteAll
+, elementary-greeter
+, pkg-config
+, meson
+, ninja
+, vala
+, desktop-file-utils
+, gtk3
+, granite
+, libgee
+, libhandy
+, gnome-settings-daemon
+, mutter
+, elementary-icon-theme
+, wingpanel-with-indicators
+, elementary-gtk-theme
+, nixos-artwork
+, lightdm
+, gdk-pixbuf
+, clutter-gtk
+, dbus
+, accountsservice
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-greeter";
+  version = "6.0.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "greeter";
+    rev = version;
+    sha256 = "sha256-0chBM8JuCYgZXHneiSxSICZwBVm2Vgx+bas9wUjbnyg=";
+  };
+
+  patches = [
+    ./sysconfdir-install.patch
+    # Needed until https://github.com/elementary/greeter/issues/360 is fixed
+    (substituteAll {
+      src = ./hardcode-fallback-background.patch;
+      default_wallpaper = "${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}";
+    })
+  ];
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    accountsservice
+    clutter-gtk # else we get could not generate cargs for mutter-clutter-2
+    elementary-icon-theme
+    gnome-settings-daemon
+    gdk-pixbuf
+    granite
+    gtk3
+    libgee
+    libhandy
+    lightdm
+    mutter
+  ];
+
+  mesonFlags = [
+    # A hook does this but after wrapGAppsHook so the files never get wrapped.
+    "--sbindir=${placeholder "out"}/bin"
+    # baked into the program for discovery of the greeter configuration
+    "--sysconfdir=/etc"
+    "-Dgsd-dir=${gnome-settings-daemon}/libexec/" # trailing slash is needed
+  ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # dbus-launch needed in path
+      --prefix PATH : "${dbus}/bin"
+
+      # for `io.elementary.wingpanel -g`
+      --prefix PATH : "${wingpanel-with-indicators}/bin"
+
+      # for the compositor
+      --prefix PATH : "$out/bin"
+
+      # the GTK theme is hardcoded
+      --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share"
+
+      # the icon theme is hardcoded
+      --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS"
+    )
+  '';
+
+  postFixup = ''
+    # Use NixOS default wallpaper
+    substituteInPlace $out/etc/lightdm/io.elementary.greeter.conf \
+      --replace "#default-wallpaper=/usr/share/backgrounds/elementaryos-default" \
+      "default-wallpaper=${nixos-artwork.wallpapers.simple-dark-gray.gnomeFilePath}"
+
+    substituteInPlace $out/share/xgreeters/io.elementary.greeter.desktop \
+      --replace "Exec=io.elementary.greeter" "Exec=$out/bin/io.elementary.greeter"
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+
+    xgreeters = linkFarm "pantheon-greeter-xgreeters" [{
+      path = "${elementary-greeter}/share/xgreeters/io.elementary.greeter.desktop";
+      name = "io.elementary.greeter.desktop";
+    }];
+  };
+
+  meta = with lib; {
+    description = "LightDM Greeter for Pantheon";
+    homepage = "https://github.com/elementary/greeter";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "io.elementary.greeter";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch
new file mode 100644
index 000000000000..7d2afe7b16c3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/hardcode-fallback-background.patch
@@ -0,0 +1,22 @@
+diff --git a/src/Widgets/BackgroundImage.vala b/src/Widgets/BackgroundImage.vala
+index ae9431c..f0f2a49 100644
+--- a/src/Widgets/BackgroundImage.vala
++++ b/src/Widgets/BackgroundImage.vala
+@@ -9,7 +9,7 @@ public class Greeter.BackgroundImage : Gtk.EventBox {
+ 
+     public BackgroundImage (string? path) {
+         if (path == null) {
+-            path = "/usr/share/backgrounds/elementaryos-default";
++            path = "@default_wallpaper@";
+         }
+ 
+         try {
+@@ -19,7 +19,7 @@ public class Greeter.BackgroundImage : Gtk.EventBox {
+             critical ("Fallback to default wallpaper");
+ 
+             try {
+-                full_pixbuf = new Gdk.Pixbuf.from_file ("/usr/share/backgrounds/elementaryos-default");
++                full_pixbuf = new Gdk.Pixbuf.from_file ("@default_wallpaper@");
+             } catch (GLib.Error e) {
+                 critical (e.message);
+             }
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch
new file mode 100644
index 000000000000..9bacbcf4f98b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-greeter/sysconfdir-install.patch
@@ -0,0 +1,25 @@
+From 7bb0d507cbb0122f167127b9f6460bd53d8234de Mon Sep 17 00:00:00 2001
+From: worldofpeace <worldofpeace@users.noreply.github.com>
+Date: Sat, 16 Mar 2019 16:07:24 -0400
+Subject: [PATCH] 'sysconfdir' will be etc not /etc for install
+
+---
+ data/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/meson.build b/data/meson.build
+index fd54b75..b1120ae 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -20,7 +20,7 @@ i18n.merge_file (
+ 
+ install_data(
+     meson.project_name() + '.conf',
+-    install_dir: join_paths(get_option('sysconfdir'), 'lightdm')
++    install_dir: join_paths(get_option('prefix'), 'etc', 'lightdm')
+ )
+ 
+ test (
+-- 
+2.19.2
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
new file mode 100644
index 000000000000..dd6b10f5c830
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-gsettings-schemas/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, runCommand
+, mutter
+, elementary-default-settings
+, glib
+, gala
+, epiphany
+, gnome-settings-daemon
+, gtk3
+, elementary-dock
+, gsettings-desktop-schemas
+, extraGSettingsOverrides ? ""
+, extraGSettingsOverridePackages ? []
+}:
+
+let
+
+  gsettingsOverridePackages = [
+    elementary-dock
+    gnome-settings-daemon
+    epiphany
+    gala
+    gsettings-desktop-schemas
+    gtk3
+    mutter
+  ] ++ extraGSettingsOverridePackages;
+
+in
+
+with lib;
+
+# TODO: Having https://github.com/NixOS/nixpkgs/issues/54150 would supersede this
+runCommand "elementary-gsettings-desktop-schemas" {}
+  ''
+     schema_dir=$out/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas
+
+     mkdir -p $schema_dir
+
+     cp -rf ${glib.getSchemaPath gala}/*.gschema.override $schema_dir
+
+     ${concatMapStrings (pkg: "cp -rf ${glib.getSchemaPath pkg}/*.xml $schema_dir\n") gsettingsOverridePackages}
+
+     chmod -R a+w $out/share/gsettings-schemas/nixos-gsettings-overrides
+     cp ${glib.getSchemaPath elementary-default-settings}/* $schema_dir
+
+     cat - > $schema_dir/nixos-defaults.gschema.override <<- EOF
+     ${extraGSettingsOverrides}
+     EOF
+
+     ${glib.dev}/bin/glib-compile-schemas $schema_dir
+  ''
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix
new file mode 100644
index 000000000000..fa4ff7edf12e
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/default.nix
@@ -0,0 +1,85 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, substituteAll
+, pkg-config
+, meson
+, ninja
+, vala
+, python3
+, gtk3
+, glib
+, granite
+, libgee
+, elementary-settings-daemon
+, gettext
+, libhandy
+, wrapGAppsHook
+, appcenter
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-onboarding";
+  version = "6.1.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "onboarding";
+    rev = version;
+    sha256 = "sha256-9voy9eje3VlV4IMM664EyjKWTfSVogX5JoRCqhsUXTE=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      appcenter = appcenter;
+    })
+    # Provides the directory where the locales are actually installed
+    # https://github.com/elementary/onboarding/pull/147
+    (fetchpatch {
+      url = "https://github.com/elementary/onboarding/commit/af19c3dbefd1c0e0ec18eddacc1f21cb991f5513.patch";
+      sha256 = "sha256-fSFfjSd33W7rXXEUHY8b3rv9B9c31XfCjxjRxBBrqjs=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-settings-daemon # settings schema
+    glib
+    granite
+    gtk3
+    libgee
+    libhandy
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Onboarding app for new users designed for elementary OS";
+    homepage = "https://github.com/elementary/onboarding";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "io.elementary.onboarding";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/fix-paths.patch
new file mode 100644
index 000000000000..c98d898bb488
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-onboarding/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Views/AppCenterView.vala b/src/Views/AppCenterView.vala
+index 16cd18b..5895897 100644
+--- a/src/Views/AppCenterView.vala
++++ b/src/Views/AppCenterView.vala
+@@ -55,7 +55,7 @@ public class Onboarding.AppCenterView : AbstractOnboardingView {
+         appcenter_button.clicked.connect (() => {
+             try {
+                 var appcenter = AppInfo.create_from_commandline (
+-                    "io.elementary.appcenter",
++                    "@appcenter@/bin/io.elementary.appcenter",
+                     "AppCenter",
+                     AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION
+                 );
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
new file mode 100644
index 000000000000..cc25419f2eb4
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-print-shim/default.nix
@@ -0,0 +1,46 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, meson
+, ninja
+, pkg-config
+, vala
+, gtk3
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-print-shim";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "print";
+    rev = version;
+    sha256 = "sha256-l2IUu9Mj22lZ5yajPcsGrJcJDakNu4srCV0Qea5ybPA=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [ gtk3 ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Simple shim for printing support via Contractor";
+    homepage = "https://github.com/elementary/print";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "io.elementary.print";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
new file mode 100644
index 000000000000..bf466c4d59e1
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/default.nix
@@ -0,0 +1,158 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, desktop-file-utils
+, pkg-config
+, writeScript
+, gnome-keyring
+, gnome-session
+, wingpanel
+, orca
+, onboard
+, elementary-default-settings
+, gnome-settings-daemon
+, runtimeShell
+, writeText
+, meson
+, ninja
+}:
+
+let
+
+  #
+  # ─── ENSURES PLANK GETS ELEMENTARY'S DEFAULT DOCKITEMS ────────────────────────────
+  #
+
+  #
+  # Upstream relies on /etc/skel to initiate a new users home directory with plank's dockitems.
+  #
+  # That is not possible within nixos, but we can achieve this easily with a simple script that copies
+  # them. We then use a xdg autostart and initalize it during the "EarlyInitialization" phase of a gnome session
+  # which is most appropriate for installing files into $HOME.
+  #
+
+  dockitems-script = writeScript "dockitems-script" ''
+    #!${runtimeShell}
+
+    elementary_default_settings="${elementary-default-settings}"
+    dock_items="$elementary_default_settings/etc/skel/.config/plank/dock1/launchers"/*
+
+    if [ ! -d "$HOME/.config/plank/dock1" ]; then
+        echo "Instantiating default Plank Dockitems..."
+
+        mkdir -p "$HOME/.config/plank/dock1/launchers"
+        cp -r --no-preserve=mode,ownership $dock_items "$HOME/.config/plank/dock1/launchers/"
+    else
+        echo "Plank Dockitems already instantiated"
+    fi
+  '';
+
+  dockitemAutostart = writeText "default-elementary-dockitems.desktop" ''
+    [Desktop Entry]
+    Type=Application
+    Name=Instantiate Default elementary dockitems
+    Exec=${dockitems-script}
+    StartupNotify=false
+    NoDisplay=true
+    OnlyShowIn=Pantheon;
+    X-GNOME-Autostart-Phase=EarlyInitialization
+  '';
+
+  executable = writeScript "pantheon" ''
+    # gnome-session can find RequiredComponents for `pantheon` session (notably pantheon's patched g-s-d autostarts)
+    export XDG_CONFIG_DIRS=@out@/etc/xdg:$XDG_CONFIG_DIRS
+
+    # Make sure we use our gtk-3.0/settings.ini
+    export XDG_CONFIG_DIRS=${elementary-default-settings}/etc:$XDG_CONFIG_DIRS
+
+    # * gnome-session can find the `pantheon' session
+    # * use pantheon-mimeapps.list
+    export XDG_DATA_DIRS=@out@/share:$XDG_DATA_DIRS
+
+    # Start pantheon session. Keep in sync with upstream
+    exec ${gnome-session}/bin/gnome-session --builtin --session=pantheon "$@"
+  '';
+
+  # Absolute path patched version of the upstream xsession
+  xsession = writeText "pantheon.desktop" ''
+    [Desktop Entry]
+    Name=Pantheon
+    Comment=This session provides elementary experience
+    Exec=@out@/libexec/pantheon
+    TryExec=${wingpanel}/bin/io.elementary.wingpanel
+    Icon=
+    DesktopNames=Pantheon
+    Type=Application
+  '';
+
+in
+
+stdenv.mkDerivation rec {
+  pname = "elementary-session-settings";
+  version = "6.0.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "session-settings";
+    rev = version;
+    sha256 = "1faglpa7q3a4335gnd074a3lnsdspyjdnskgy4bfnf6xmwjx7kjx";
+  };
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    meson
+    ninja
+    pkg-config
+  ];
+
+  buildInputs = [
+    gnome-keyring
+    gnome-settings-daemon
+    onboard
+    orca
+  ];
+
+  mesonFlags = [
+    "-Dmimeapps-list=false"
+    "-Dfallback-session=GNOME"
+    "-Ddetect-program-prefixes=true"
+    "--sysconfdir=${placeholder "out"}/etc"
+  ];
+
+  postInstall = ''
+    # our mimeapps patched from upstream to exclude:
+    # * evince.desktop -> org.gnome.Evince.desktop
+    mkdir -p $out/share/applications
+    cp -av ${./pantheon-mimeapps.list} $out/share/applications/pantheon-mimeapps.list
+
+    # instantiates pantheon's dockitems
+    cp "${dockitemAutostart}" $out/etc/xdg/autostart/default-elementary-dockitems.desktop
+
+    # script `Exec` to start pantheon
+    mkdir -p $out/libexec
+    substitute ${executable} $out/libexec/pantheon --subst-var out
+    chmod +x $out/libexec/pantheon
+
+    # absolute path patched xsession
+    substitute ${xsession} $out/share/xsessions/pantheon.desktop --subst-var out
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+
+    providedSessions = [
+      "pantheon"
+    ];
+  };
+
+  meta = with lib; {
+    description = "Session settings for elementary";
+    homepage = "https://github.com/elementary/session-settings";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list
new file mode 100644
index 000000000000..8deb6ae8c1c5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-session-settings/pantheon-mimeapps.list
@@ -0,0 +1,168 @@
+[Default Applications]
+application/ogg=io.elementary.music.desktop
+application/oxps=org.gnome.Evince.desktop
+application/pdf=org.gnome.Evince.desktop
+application/postscript=org.gnome.Evince.desktop
+application/vnd.ms-xpsdocument=org.gnome.Evince.desktop
+application/vnd.rn-realmedia=io.elementary.videos.desktop
+application/x-ar=org.gnome.FileRoller.desktop
+application/x-arj=org.gnome.FileRoller.desktop
+application/x-bzdvi=org.gnome.Evince.desktop
+application/x-bzip-compressed-tar=org.gnome.FileRoller.desktop
+application/x-bzip=org.gnome.FileRoller.desktop
+application/x-bzpdf=org.gnome.Evince.desktop
+application/x-bzpostscript=org.gnome.Evince.desktop
+application/x-cbr=org.gnome.Evince.desktop
+application/x-cbt=org.gnome.Evince.desktop
+application/x-cbz=org.gnome.Evince.desktop
+application/x-compress=org.gnome.FileRoller.desktop
+application/x-compressed-tar=org.gnome.FileRoller.desktop
+application/x-dvi=org.gnome.Evince.desktop
+application/x-ear=org.gnome.FileRoller.desktop
+application/x-extension-m4a=io.elementary.videos.desktop
+application/x-extension-mp4=io.elementary.videos.desktop
+application/x-flac=io.elementary.music.desktop
+application/x-gtar=org.gnome.FileRoller.desktop
+application/x-gzdvi=org.gnome.Evince.desktop
+application/x-gzip=org.gnome.FileRoller.desktop
+application/x-gzpdf=org.gnome.Evince.desktop
+application/x-gzpostscript=org.gnome.Evince.desktop
+application/x-lha=org.gnome.FileRoller.desktop
+application/x-lhz=org.gnome.FileRoller.desktop
+application/x-lzop=org.gnome.FileRoller.desktop
+application/x-matroska=io.elementary.videos.desktop
+application/x-ogg=io.elementary.music.desktop
+application/x-perl=io.elementary.code.desktop
+application/x-rar-compressed=org.gnome.FileRoller.desktop
+application/x-rar=org.gnome.FileRoller.desktop
+application/x-rpm=org.gnome.FileRoller.desktop
+application/x-tar=org.gnome.FileRoller.desktop
+application/x-war=org.gnome.FileRoller.desktop
+application/x-xz-compressed-tar=org.gnome.FileRoller.desktop
+application/x-xz=org.gnome.FileRoller.desktop
+application/x-xzpdf=org.gnome.Evince.desktop
+application/x-zip-compressed=org.gnome.FileRoller.desktop
+application/x-zip=org.gnome.FileRoller.desktop
+application/x-zoo=org.gnome.FileRoller.desktop
+application/xhtml+xml=org.gnome.Epiphany.desktop
+application/zip=org.gnome.FileRoller.desktop
+audio/3gpp=io.elementary.music.desktop
+audio/ac3=io.elementary.music.desktop
+audio/AMR-WB=io.elementary.music.desktop
+audio/AMR=io.elementary.music.desktop
+audio/basic=io.elementary.music.desktop
+audio/flac=io.elementary.music.desktop
+audio/midi=io.elementary.music.desktop
+audio/mp4=io.elementary.music.desktop
+audio/mpeg=io.elementary.music.desktop
+audio/mpegurl=io.elementary.music.desktop
+audio/ogg=io.elementary.music.desktop
+audio/prs.sid=io.elementary.music.desktop
+audio/vnd.rn-realaudio=io.elementary.music.desktop
+audio/x-ape=io.elementary.music.desktop
+audio/x-flac=io.elementary.music.desktop
+audio/x-gsm=io.elementary.music.desktop
+audio/x-it=io.elementary.music.desktop
+audio/x-m4a=io.elementary.music.desktop
+audio/x-matroska=io.elementary.music.desktop
+audio/x-mod=io.elementary.music.desktop
+audio/x-mp3=io.elementary.music.desktop
+audio/x-mpeg=io.elementary.music.desktop
+audio/x-mpegurl=io.elementary.music.desktop
+audio/x-ms-asf=io.elementary.music.desktop
+audio/x-ms-asx=io.elementary.music.desktop
+audio/x-ms-wax=io.elementary.music.desktop
+audio/x-ms-wma=io.elementary.music.desktop
+audio/x-musepack=io.elementary.music.desktop
+audio/x-pn-aiff=io.elementary.music.desktop
+audio/x-pn-au=io.elementary.music.desktop
+audio/x-pn-realaudio-plugin=io.elementary.music.desktop
+audio/x-pn-realaudio=io.elementary.music.desktop
+audio/x-pn-wav=io.elementary.music.desktop
+audio/x-pn-windows-acm=io.elementary.music.desktop
+audio/x-real-audio=io.elementary.music.desktop
+audio/x-realaudio=io.elementary.music.desktop
+audio/x-sbc=io.elementary.music.desktop
+audio/x-scpls=io.elementary.music.desktop
+audio/x-speex=io.elementary.music.desktop
+audio/x-tta=io.elementary.music.desktop
+audio/x-vorbis+ogg=io.elementary.music.desktop
+audio/x-vorbis=io.elementary.music.desktop
+audio/x-wav=io.elementary.music.desktop
+audio/x-wavpack=io.elementary.music.desktop
+audio/x-xm=io.elementary.music.desktop
+image/bmp=io.elementary.photos-viewer.desktop
+image/gif=io.elementary.photos-viewer.desktop
+image/jpeg=io.elementary.photos-viewer.desktop
+image/jpg=io.elementary.photos-viewer.desktop
+image/pjpeg=io.elementary.photos-viewer.desktop
+image/png=io.elementary.photos-viewer.desktop
+image/tiff=io.elementary.photos-viewer.desktop
+image/vnd.djvu=org.gnome.Evince.desktop
+image/vnd.rn-realpix=io.elementary.videos.desktop
+image/webp=io.elementary.photos-viewer.desktop
+image/x-bmp=io.elementary.photos-viewer.desktop
+image/x-bzeps=org.gnome.Evince.desktop
+image/x-eps=org.gnome.Evince.desktop
+image/x-gzeps=org.gnome.Evince.desktop
+image/x-png=io.elementary.photos-viewer.desktop
+inode/directory=io.elementary.files.desktop
+misc/ultravox=io.elementary.videos.desktop
+multipart/x-zip=org.gnome.FileRoller.desktop
+text/calendar=io.elementary.calendar.desktop
+text/html=org.gnome.Epiphany.desktop
+text/mathml=io.elementary.code.desktop
+text/plain=io.elementary.code.desktop
+text/x-chdr=io.elementary.code.desktop
+text/x-csrc=io.elementary.code.desktop
+text/x-dtd=io.elementary.code.desktop
+text/x-java=io.elementary.code.desktop
+text/x-python=io.elementary.code.desktop
+text/x-sql=io.elementary.code.desktop
+text/xml=io.elementary.code.desktop
+video/3gpp=io.elementary.videos.desktop
+video/dv=io.elementary.videos.desktop
+video/fli=io.elementary.videos.desktop
+video/flv=io.elementary.videos.desktop
+video/mp2t=io.elementary.videos.desktop
+video/mp4=io.elementary.videos.desktop
+video/mp4v-es=io.elementary.videos.desktop
+video/mpeg=io.elementary.videos.desktop
+video/msvideo=io.elementary.videos.desktop
+video/ogg=io.elementary.videos.desktop
+video/quicktime=io.elementary.videos.desktop
+video/vivo=io.elementary.videos.desktop
+video/vnd.divx=io.elementary.videos.desktop
+video/vnd.rn-realvideo=io.elementary.videos.desktop
+video/vnd.vivo=io.elementary.videos.desktop
+video/webm=io.elementary.videos.desktop
+video/x-anim=io.elementary.videos.desktop
+video/x-avi=io.elementary.videos.desktop
+video/x-flc=io.elementary.videos.desktop
+video/x-fli=io.elementary.videos.desktop
+video/x-flic=io.elementary.videos.desktop
+video/x-flv=io.elementary.videos.desktop
+video/x-m4v=io.elementary.videos.desktop
+video/x-matroska=io.elementary.videos.desktop
+video/x-mpeg=io.elementary.videos.desktop
+video/x-ms-asf=io.elementary.videos.desktop
+video/x-ms-asx=io.elementary.videos.desktop
+video/x-ms-wm=io.elementary.videos.desktop
+video/x-ms-wmv=io.elementary.videos.desktop
+video/x-ms-wmx=io.elementary.videos.desktop
+video/x-ms-wvx=io.elementary.videos.desktop
+video/x-msvideo=io.elementary.videos.desktop
+video/x-nsv=io.elementary.videos.desktop
+video/x-ogm+ogg=io.elementary.videos.desktop
+video/x-theora+ogg=io.elementary.videos.desktop
+video/x-totem-stream=io.elementary.videos.desktop
+x-content/image-dcf=io.elementary.photos.desktop
+x-content/image-picturecd=io.elementary.photos.desktop
+x-content/video-dvd=io.elementary.videos.desktop
+x-content/video-svcd=io.elementary.videos.desktop
+x-content/video-vcd=io.elementary.videos.desktop
+x-scheme-handler/http=org.gnome.Epiphany.desktop
+x-scheme-handler/https=org.gnome.Epiphany.desktop
+x-scheme-handler/mailto=io.elementary.mail.desktop
+x-scheme-handler/trash=io.elementary.files.desktop
+
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
new file mode 100644
index 000000000000..3cf7cd365f16
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/elementary-shortcut-overlay/default.nix
@@ -0,0 +1,72 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pkg-config
+, meson
+, ninja
+, vala
+, libxml2
+, desktop-file-utils
+, gtk3
+, glib
+, granite
+, libgee
+, libhandy
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "elementary-shortcut-overlay";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "shortcut-overlay";
+    rev = version;
+    sha256 = "sha256-qmqzGCM3cVM6y80pzjm5CCyG6BO6XlKZiODAAEnwVrM=";
+  };
+
+  patches = [
+    # Fix build with meson 0.61
+    # https://github.com/elementary/shortcut-overlay/pull/113
+    (fetchpatch {
+      url = "https://github.com/elementary/shortcut-overlay/commit/130f78eb4b7770586ea98ba0a5fdbbf5bb116f3f.patch";
+      sha256 = "sha256-XXWq9CEv3Z2B8ogcFQAJZCfy19XxNHs3c8NToE2m/aA=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libgee
+    libhandy
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "A native OS-wide shortcut overlay to be launched by Gala";
+    homepage = "https://github.com/elementary/shortcut-overlay";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "io.elementary.shortcut-overlay";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/default.nix
new file mode 100644
index 000000000000..c9a24b4906c7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, unstableGitUpdater
+, substituteAll
+, file-roller
+}:
+
+stdenv.mkDerivation rec {
+  pname = "file-roller-contract";
+  version = "unstable-2021-02-22";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = "cf001d84a7e2ddcfbee2cfdb19885798a869833e";
+    sha256 = "sha256-jnXq44NiQiSYsvaBF828TklLg9d6z6n+gCZKgbFiERI=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./exec-path.patch;
+      file_roller = file-roller;
+    })
+  ];
+
+  dontConfigure = true;
+
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/contractor
+    cp *.contract $out/share/contractor/
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    updateScript = unstableGitUpdater {
+      url = "https://github.com/elementary/file-roller-contract.git";
+    };
+  };
+
+  meta = with lib; {
+    description = "Contractor extension for File Roller";
+    homepage = "https://github.com/elementary/file-roller-contract";
+    license = licenses.gpl3Plus;
+    maintainers = teams.pantheon.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/exec-path.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/exec-path.patch
new file mode 100644
index 000000000000..8349ae8088da
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/file-roller-contract/exec-path.patch
@@ -0,0 +1,22 @@
+diff --git a/io.elementary.contractor.file-roller-compress.contract b/io.elementary.contractor.file-roller-compress.contract
+index 11e4da3..d58549f 100644
+--- a/io.elementary.contractor.file-roller-compress.contract
++++ b/io.elementary.contractor.file-roller-compress.contract
+@@ -3,5 +3,5 @@ Name=Compress
+ Icon=add-files-to-archive
+ Description=Create a compressed archive with the selected objects
+ MimeType=!archive;inode/blockdevice;inode/chardevice;inode/fifo;inode/socket;
+-Exec=file-roller --add %U
++Exec=@file_roller@/bin/file-roller --add %U
+ Gettext-Domain=file-roller
+diff --git a/io.elementary.contractor.file-roller-extract-here.contract b/io.elementary.contractor.file-roller-extract-here.contract
+index 184a6f2..345f4e7 100644
+--- a/io.elementary.contractor.file-roller-extract-here.contract
++++ b/io.elementary.contractor.file-roller-extract-here.contract
+@@ -3,5 +3,5 @@ Name=Extract Here
+ Icon=extract-archive
+ Description=Extract the contents of the archives in the archive folder and quit the program
+ MimeType=application/x-7z-compressed;application/x-7z-compressed-tar;application/x-ace;application/x-alz;application/x-ar;application/x-arj;application/x-bzip;application/x-bzip-compressed-tar;application/x-bzip1;application/x-bzip1-compressed-tar;application/x-cabinet;application/x-cbr;application/x-cbz;application/x-cd-image;application/x-compress;application/x-compressed-tar;application/x-cpio;application/x-deb;application/x-ear;application/x-ms-dos-executable;application/x-gtar;application/x-gzip;application/x-gzpostscript;application/x-java-archive;application/x-lha;application/x-lhz;application/x-lrzip;application/x-lrzip-compressed-tar;application/x-lzip;application/x-lzip-compressed-tar;application/x-lzma;application/x-lzma-compressed-tar;application/x-lzop;application/x-lzop-compressed-tar;application/x-ms-wim;application/x-rar;application/x-rar-compressed;application/x-rpm;application/x-rzip;application/x-tar;application/x-tarz;application/x-stuffit;application/x-war;application/x-xz;application/x-xz-compressed-tar;application/x-zip;application/x-zip-compressed;application/x-zoo;application/zip;
+-Exec=file-roller --extract-here %U
++Exec=@file_roller@/bin/file-roller --extract-here %U
+ Gettext-Domain=file-roller
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
new file mode 100644
index 000000000000..75447adf4a26
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, desktop-file-utils
+, gettext
+, libxml2
+, gtk3
+, granite
+, libgee
+, bamf
+, libcanberra-gtk3
+, gnome-desktop
+, mutter
+, clutter
+, gnome-settings-daemon
+, wrapGAppsHook
+, gexiv2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gala";
+  version = "6.3.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-f/WDm9/+lXgplg9tGpct4f+1cOhKgdypwiDRBhewRGw=";
+  };
+
+  patches = [
+    ./plugins-dir.patch
+    # Session crashes when switching windows with Alt+Tab
+    # https://github.com/elementary/gala/issues/1312
+    (fetchpatch {
+      url = "https://github.com/elementary/gala/commit/cc83db8fe398feae9f3e4caa8352b65f0c8c96d4.patch";
+      sha256 = "sha256-CPO3EHIzqHAV6ZLHngivCdsD8je8CK/NHznfxSEkhzc=";
+    })
+    # WindowSwitcher: Clear indicator background
+    # https://github.com/elementary/gala/pull/1318
+    (fetchpatch {
+      url = "https://github.com/elementary/gala/commit/cce53acffecba795b6cc48916d4621a47996d2c9.patch";
+      sha256 = "sha256-5aTZE6poo4sQMTLfk9Nhw4G4BW8i9dvpWktizRIS58Q=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    desktop-file-utils
+    gettext
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    bamf
+    clutter
+    gnome-settings-daemon
+    gexiv2
+    gnome-desktop
+    granite
+    gtk3
+    libcanberra-gtk3
+    libgee
+    mutter
+  ];
+
+  mesonFlags = [
+    # TODO: enable this and remove --builtin flag from session-settings
+    # https://github.com/NixOS/nixpkgs/pull/140429
+    "-Dsystemd=false"
+  ];
+
+  postPatch = ''
+    chmod +x build-aux/meson/post_install.py
+    patchShebangs build-aux/meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "A window & compositing manager based on mutter and designed by elementary for use with Pantheon";
+    homepage = "https://github.com/elementary/gala";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "gala";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
new file mode 100644
index 000000000000..b0e72bbe1ab7
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gala/plugins-dir.patch
@@ -0,0 +1,21 @@
+diff --git a/meson.build b/meson.build
+index d0f00e5..977d2e2 100644
+--- a/meson.build
++++ b/meson.build
+@@ -25,6 +25,7 @@ vapi_dir = meson.current_source_dir() / 'vapi'
+ locale_dir = join_paths(get_option('prefix'), get_option('localedir'))
+ data_dir = join_paths(get_option('prefix'), get_option('datadir'))
+ plugins_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name(), 'plugins')
++plugins_dir_for_build = join_paths('/run/current-system/sw/lib/', meson.project_name(), 'plugins')
+ pkgdata_dir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name())
+ pkglib_dir = join_paths(get_option('prefix'), get_option('libdir'), meson.project_name())
+ 
+@@ -33,7 +34,7 @@ conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
+ conf.set_quoted('LOCALEDIR', locale_dir)
+ conf.set_quoted('DATADIR', data_dir)
+ conf.set_quoted('PKGDATADIR', pkgdata_dir)
+-conf.set_quoted('PLUGINDIR', plugins_dir)
++conf.set_quoted('PLUGINDIR', plugins_dir_for_build)
+ conf.set_quoted('RESOURCEPATH', '/org/pantheon/desktop/gala')
+ conf.set_quoted('VERSION', gala_version)
+ conf.set_quoted('SCHEMA', 'org.pantheon.desktop.gala')
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/default.nix
new file mode 100644
index 000000000000..190514392098
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/default.nix
@@ -0,0 +1,56 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, unstableGitUpdater
+, substituteAll
+, gnome-bluetooth
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gnome-bluetooth-contract";
+  version = "unstable-2021-02-22";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = "8dcd4d03dc7a7d487980fd8bc95af985dc4fff5c";
+    sha256 = "sha256-9eX6j/cvN/CoqrHrh9mZEsUJ8viDWIGxIva1xFwIK7c=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./exec-path.patch;
+      gnome_bluetooth = gnome-bluetooth;
+    })
+  ];
+
+  dontConfigure = true;
+
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/share/contractor
+    cp *.contract $out/share/contractor/
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    updateScript = unstableGitUpdater {
+      url = "https://github.com/elementary/gnome-bluetooth-contract.git";
+    };
+  };
+
+  meta = with lib; {
+    description = "Contractor extension for GNOME Bluetooth";
+    homepage = "https://github.com/elementary/gnome-bluetooth-contract";
+    license = licenses.gpl3Plus;
+    maintainers = teams.pantheon.members;
+    platforms = platforms.linux;
+    # sendto device selection is removed in gnome-bluetooth 42
+    # https://github.com/elementary/gnome-bluetooth-contract/issues/1
+    broken = true;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/exec-path.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/exec-path.patch
new file mode 100644
index 000000000000..c0bd9e579f46
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/gnome-bluetooth-contract/exec-path.patch
@@ -0,0 +1,11 @@
+diff --git a/io.elementary.contracter.gnome-bluetooth.contract b/io.elementary.contracter.gnome-bluetooth.contract
+index 3eb2334..ce0e5f5 100644
+--- a/io.elementary.contracter.gnome-bluetooth.contract
++++ b/io.elementary.contracter.gnome-bluetooth.contract
+@@ -3,5 +3,5 @@ Name=Send Files via Bluetooth
+ Icon=bluetooth
+ Description=Send files to device...
+ MimeType=!inode;
+-Exec=bluetooth-sendto %F
++Exec=@gnome_bluetooth@/bin/bluetooth-sendto %F
+ Gettext-Domain=gnome-bluetooth2
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/a11y/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/a11y/default.nix
new file mode 100644
index 000000000000..eab86136c7d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/a11y/default.nix
@@ -0,0 +1,70 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, meson
+, ninja
+, pkg-config
+, python3
+, vala
+, granite
+, gtk3
+, libgee
+, wingpanel
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-a11y";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1adx1sx9qh02hjgv5h0gwyn116shjl3paxmyaiv4cgh6vq3ndp3c";
+  };
+
+  patches = [
+    # Upstream code not respecting our localedir
+    # https://github.com/elementary/wingpanel-indicator-a11y/pull/48
+    (fetchpatch {
+      url = "https://github.com/elementary/wingpanel-indicator-a11y/commit/fb8412d56bc1c42b70e8ee41b837e8024e1297f7.patch";
+      sha256 = "0619npdw9wvaz1zk2lzikczyjdqba8v8c9ry9zizvvl4j1i1ad7k";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Universal Access Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-a11y";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
new file mode 100644
index 000000000000..badfec690eb5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/default.nix
@@ -0,0 +1,96 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, substituteAll
+, meson
+, ninja
+, python3
+, pkg-config
+, vala
+, granite
+, libgee
+, gettext
+, gtk3
+, gnome-menus
+, json-glib
+, elementary-dock
+, bamf
+, switchboard-with-plugs
+, libsoup
+, wingpanel
+, zeitgeist
+, bc
+, libhandy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-applications-menu";
+  version = "2.10.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = "applications-menu";
+    rev = version;
+    sha256 = "sha256-xBuMJzIFOueSvNwvXc85AI9NHuMW3bOblNsyuDkIzyk=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      bc = "${bc}/bin/bc";
+    })
+  ];
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    elementary-dock
+    granite
+    gtk3
+    json-glib
+    libgee
+    libhandy
+    libsoup
+    switchboard-with-plugs
+    wingpanel
+    zeitgeist
+  ] ++
+  # applications-menu has a plugin to search switchboard plugins
+  # see https://github.com/NixOS/nixpkgs/issues/100209
+  # wingpanel's wrapper will need to pick up the fact that
+  # applications-menu needs a version of switchboard with all
+  # its plugins for search.
+  switchboard-with-plugs.buildInputs;
+
+  mesonFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Lightweight and stylish app launcher for Pantheon";
+    homepage = "https://github.com/elementary/applications-menu";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch
new file mode 100644
index 000000000000..aea828b36336
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/applications-menu/fix-paths.patch
@@ -0,0 +1,24 @@
+diff --git a/src/synapse-plugins/calculator-plugin.vala b/src/synapse-plugins/calculator-plugin.vala
+index 886a44cd..a4601da6 100644
+--- a/src/synapse-plugins/calculator-plugin.vala
++++ b/src/synapse-plugins/calculator-plugin.vala
+@@ -50,9 +50,7 @@ namespace Synapse {
+                 _("Calculator"),
+                 _("Calculate basic expressions."),
+                 "accessories-calculator",
+-                register_plugin,
+-                Environment.find_program_in_path ("bc") != null,
+-                _("bc is not installed")
++                register_plugin
+             );
+         }
+ 
+@@ -94,7 +92,7 @@ namespace Synapse {
+                 Pid pid;
+                 int read_fd, write_fd;
+                 /* Must include math library to get non-integer results and to access standard math functions */
+-                string[] argv = {"bc", "-l"};
++                string[] argv = {"@bc@", "-l"};
+                 string? solution = null;
+ 
+                 try {
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
new file mode 100644
index 000000000000..605b4b7709a5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/bluetooth/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, glib
+, granite
+, libnotify
+, wingpanel
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-bluetooth";
+  version = "2.1.8";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "12rasf8wy3cqnfjlm9s2qnx4drzx0w0yviagkng3kspdzm3vzsqy";
+  };
+
+  nativeBuildInputs = [
+    glib # for glib-compile-schemas
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    glib
+    granite
+    gtk3
+    libgee
+    libnotify
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Bluetooth Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-bluetooth";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
new file mode 100644
index 000000000000..3f7408d9dff3
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, substituteAll
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, evolution-data-server
+, libical
+, libgee
+, libhandy
+, libxml2
+, libsoup
+, libgdata
+, elementary-calendar
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-datetime";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-GxlnzLDrZmDDAGlUMoM4k4SkbCqra3Th6ugRAj3Wse4=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      elementary_calendar = elementary-calendar;
+    })
+  ];
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    evolution-data-server
+    granite
+    gtk3
+    libgee
+    libhandy
+    libical
+    libsoup
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Date & Time Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-datetime";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/fix-paths.patch
new file mode 100644
index 000000000000..51c495362027
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/datetime/fix-paths.patch
@@ -0,0 +1,26 @@
+diff --git a/src/Indicator.vala b/src/Indicator.vala
+index 4aba03c..6385bc9 100644
+--- a/src/Indicator.vala
++++ b/src/Indicator.vala
+@@ -55,7 +55,7 @@ public class DateTime.Indicator : Wingpanel.Indicator {
+ 
+             panel_label.button_press_event.connect ((e) => {
+                 if (e.button == Gdk.BUTTON_MIDDLE) {
+-                    var command = "io.elementary.calendar --show-day %s".printf (new GLib.DateTime.now_local ().format ("%F"));
++                    var command = "@elementary_calendar@/bin/io.elementary.calendar --show-day %s".printf (new GLib.DateTime.now_local ().format ("%F"));
+                     try {
+                         var appinfo = AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE);
+                         appinfo.launch_uris (null, null);
+diff --git a/src/Widgets/calendar/CalendarView.vala b/src/Widgets/calendar/CalendarView.vala
+index cb54253..7477d1a 100644
+--- a/src/Widgets/calendar/CalendarView.vala
++++ b/src/Widgets/calendar/CalendarView.vala
+@@ -242,7 +242,7 @@ public class DateTime.Widgets.CalendarView : Gtk.Grid {
+ 
+     // TODO: As far as maya supports it use the Dbus Activation feature to run the calendar-app.
+     public void show_date_in_maya (GLib.DateTime date) {
+-        var command = "io.elementary.calendar --show-day %s".printf (date.format ("%F"));
++        var command = "@elementary_calendar@/bin/io.elementary.calendar --show-day %s".printf (date.format ("%F"));
+ 
+         try {
+             var appinfo = AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
new file mode 100644
index 000000000000..b36a95e8b201
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/default.nix
@@ -0,0 +1,75 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pkg-config
+, meson
+, ninja
+, substituteAll
+, vala
+, gtk3
+, granite
+, libxml2
+, wingpanel
+, libgee
+, xorg
+, libgnomekbd
+, ibus
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-keyboard";
+  version = "2.4.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "10zzsil5l6snz47nx887r22sl2n0j6bg4dhxmgk3j3xp3jhgmrgl";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gkbd_keyboard_display = "${libgnomekbd}/bin/gkbd-keyboard-display";
+    })
+    # Upstream code not respecting our localedir
+    # https://github.com/elementary/wingpanel-indicator-keyboard/pull/110
+    (fetchpatch {
+      url = "https://github.com/elementary/wingpanel-indicator-keyboard/commit/ea5df2f62a99a216ee5ed137268e710490a852a4.patch";
+      sha256 = "0fmdz10xgzsryj0f0dnpjrh9yygjkb91a7pxg0rwddxbprhnr7j0";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    libxml2
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    ibus
+    libgee
+    wingpanel
+    xorg.xkeyboardconfig
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Keyboard Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-keyboard";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
new file mode 100644
index 000000000000..4fb6dfac86d9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/keyboard/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Indicator.vala b/src/Indicator.vala
+index cd7ca49..7813789 100644
+--- a/src/Indicator.vala
++++ b/src/Indicator.vala
+@@ -94,7 +94,7 @@ public class Keyboard.Indicator : Wingpanel.Indicator {
+     private void show_keyboard_map () {
+         close ();
+ 
+-        string command = "gkbd-keyboard-display \"--layout=" + layouts.get_current_with_variant () + "\"";
++        string command = "@gkbd_keyboard_display@ \"--layout=" + layouts.get_current_with_variant () + "\"";
+ 
+         try {
+             AppInfo.create_from_commandline (command, null, AppInfoCreateFlags.NONE).launch (null, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
new file mode 100644
index 000000000000..fdb6481f7e7f
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/network/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, substituteAll
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, networkmanager
+, libnma
+, wingpanel
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-network";
+  version = "2.3.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-4Fg8/Gm9mUqaL3wEc8h+/pMvOfD75ILjo7LhLz6LQmo=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    networkmanager
+    libnma
+    wingpanel
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Network Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-network";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
new file mode 100644
index 000000000000..9261bccd5182
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/nightlight/default.nix
@@ -0,0 +1,65 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, nix-update-script
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-nightlight";
+  version = "2.1.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1zxjw68byg4sjn8lzsidzmy4ipwxgnv8rm529a7wzlpgj2xq3x4j";
+  };
+
+  patches = [
+    # Upstream code not respecting our localedir
+    # https://github.com/elementary/wingpanel-indicator-nightlight/pull/91
+    (fetchpatch {
+      url = "https://github.com/elementary/wingpanel-indicator-nightlight/commit/4e15f71ed958df3569b2f1e224b9fb18613281f1.patch";
+      sha256 = "07awmswyy0988pm6ggyz22mllja675cbdzrjdqc1xd4knwcgy77v";
+    })
+  ];
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libgee
+    wingpanel
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Night Light Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-nightlight";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
new file mode 100644
index 000000000000..ceabac94a236
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/notifications/default.nix
@@ -0,0 +1,57 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libgee
+, libhandy
+, elementary-notifications
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-notifications";
+  version = "6.0.4";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-tIpR/WIhE0Mmt2EploNNDVlAX4OUNI3VnEflTLVkfSo=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    elementary-notifications
+    granite
+    gtk3
+    libgee
+    libhandy
+    wingpanel
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Notifications Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-notifications";
+    license = licenses.lgpl21Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
new file mode 100644
index 000000000000..ac9803495574
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, substituteAll
+, nix-update-script
+, gnome-power-manager
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, bamf
+, libgtop
+, libnotify
+, udev
+, wingpanel
+, libgee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-power";
+  version = "6.1.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "1zlpnl7983jkpy2nik08ih8lwrqvm456h993ixa6armzlazdvnjk";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix-paths.patch;
+      gnome_power_manager = gnome-power-manager;
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    bamf
+    granite
+    gtk3
+    libgee
+    libgtop
+    libnotify
+    udev
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Power Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-power";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/fix-paths.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/fix-paths.patch
new file mode 100644
index 000000000000..532001eb663b
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/power/fix-paths.patch
@@ -0,0 +1,13 @@
+diff --git a/src/Widgets/DeviceList.vala b/src/Widgets/DeviceList.vala
+index 0c56f46..33d97b3 100644
+--- a/src/Widgets/DeviceList.vala
++++ b/src/Widgets/DeviceList.vala
+@@ -39,7 +39,7 @@ public class Power.Widgets.DeviceList : Gtk.ListBox {
+             string device_path = path_entries.@get (value);
+             try {
+                 AppInfo statistics_app = AppInfo.create_from_commandline (
+-                    "gnome-power-statistics --device " + device_path,
++                    "@gnome_power_manager@/bin/gnome-power-statistics --device " + device_path,
+                     "",
+                     AppInfoCreateFlags.NONE
+                 );
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
new file mode 100644
index 000000000000..41039ff686e9
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/session/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, fetchpatch
+, pkg-config
+, meson
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, accountsservice
+, libgee
+, libhandy
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-session";
+  version = "2.3.0";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "0hww856qjl4kjmmksd5gp8bc5vj4fhs2s9fmbnpbf88lg5ds0wv0";
+  };
+
+  patches = [
+    # Upstream code not respecting our localedir
+    # https://github.com/elementary/wingpanel-indicator-session/pull/162
+    (fetchpatch {
+      url = "https://github.com/elementary/wingpanel-indicator-session/commit/e85032da8e923df4589dc75ccded10026b6c1cd7.patch";
+      sha256 = "139b2zbc6qjaw41nwfjkqv4npahkzryv4p5m6v10273clv6l72ng";
+    })
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+    pkg-config
+    vala
+  ];
+
+  buildInputs = [
+    accountsservice
+    granite
+    gtk3
+    libgee
+    libhandy
+    wingpanel
+  ];
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Session Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-session";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
new file mode 100644
index 000000000000..16e04bedcb93
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel-indicators/sound/default.nix
@@ -0,0 +1,68 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, pkg-config
+, meson
+, python3
+, ninja
+, vala
+, gtk3
+, granite
+, wingpanel
+, libnotify
+, pulseaudio
+, libcanberra-gtk3
+, libgee
+, libxml2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel-indicator-sound";
+  version = "6.0.1";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-FHZ4YhGLqGTz5Po2XFJvnWuAi1eHKcT9zzgJFHic02E=";
+  };
+
+  nativeBuildInputs = [
+    libxml2
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+  ];
+
+  buildInputs = [
+    granite
+    gtk3
+    libcanberra-gtk3
+    libgee
+    libnotify
+    pulseaudio
+    wingpanel
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "Sound Indicator for Wingpanel";
+    homepage = "https://github.com/elementary/wingpanel-indicator-sound";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
new file mode 100644
index 000000000000..b996fdfdd6e5
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/default.nix
@@ -0,0 +1,92 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, nix-update-script
+, wrapGAppsHook
+, pkg-config
+, meson
+, ninja
+, vala
+, gala
+, gtk3
+, libgee
+, granite
+, gettext
+, mutter
+, mesa
+, json-glib
+, python3
+, elementary-gtk-theme
+, elementary-icon-theme
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wingpanel";
+  version = "3.0.2";
+
+  src = fetchFromGitHub {
+    owner = "elementary";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-WvkQx+9YjKCINpyVg8KjCV0GAb0rJfblSFaO14/4oas=";
+  };
+
+  patches = [
+    ./indicators.patch
+  ];
+
+  nativeBuildInputs = [
+    gettext
+    meson
+    ninja
+    pkg-config
+    python3
+    vala
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    elementary-icon-theme
+    gala
+    granite
+    gtk3
+    json-glib
+    libgee
+    mutter
+    mesa # for libEGL
+  ];
+
+  postPatch = ''
+    chmod +x meson/post_install.py
+    patchShebangs meson/post_install.py
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      # this GTK theme is required
+      --prefix XDG_DATA_DIRS : "${elementary-gtk-theme}/share"
+
+      # the icon theme is required
+      --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS"
+    )
+  '';
+
+  passthru = {
+    updateScript = nix-update-script {
+      attrPath = "pantheon.${pname}";
+    };
+  };
+
+  meta = with lib; {
+    description = "The extensible top panel for Pantheon";
+    longDescription = ''
+      Wingpanel is an empty container that accepts indicators as extensions,
+      including the applications menu.
+    '';
+    homepage = "https://github.com/elementary/wingpanel";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = teams.pantheon.members;
+    mainProgram = "io.elementary.wingpanel";
+  };
+}
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
new file mode 100644
index 000000000000..68a5fd532a8d
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/indicators.patch
@@ -0,0 +1,21 @@
+diff --git a/lib/IndicatorManager.vala b/lib/IndicatorManager.vala
+index a99a1ec..0ae7799 100644
+--- a/lib/IndicatorManager.vala
++++ b/lib/IndicatorManager.vala
+@@ -115,7 +115,15 @@ public class Wingpanel.IndicatorManager : GLib.Object {
+         }
+ 
+         /* load indicators */
+-        var base_folder = File.new_for_path (Build.INDICATORS_DIR);
++
++        var indicators_path = Environment.get_variable("WINGPANEL_INDICATORS_PATH");
++        if (indicators_path != null) {
++            debug ("WINGPANEL_INDICATORS_PATH set to %s", indicators_path);
++        } else {
++            critical ("WINGPANEL_INDICATORS_PATH not set");
++        }
++
++        var base_folder = File.new_for_path (indicators_path);
+ 
+         try {
+             monitor = base_folder.monitor_directory (FileMonitorFlags.NONE, null);
diff --git a/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
new file mode 100644
index 000000000000..89a359a4c9d2
--- /dev/null
+++ b/nixpkgs/pkgs/desktops/pantheon/desktop/wingpanel/wrapper.nix
@@ -0,0 +1,61 @@
+{ lib
+, wrapGAppsHook
+, glib
+, stdenv
+, xorg
+, wingpanel
+, wingpanelIndicators
+, switchboard-with-plugs
+, indicators ? null
+  # Only useful to disable for development testing.
+, useDefaultIndicators ? true
+}:
+
+let
+  selectedIndicators =
+    if indicators == null then wingpanelIndicators
+    else indicators ++ (lib.optionals useDefaultIndicators wingpanelIndicators);
+in
+stdenv.mkDerivation rec {
+  pname = "${wingpanel.pname}-with-indicators";
+  inherit (wingpanel) version;
+
+  src = null;
+
+  paths = [
+    wingpanel
+  ] ++ selectedIndicators;
+
+  passAsFile = [ "paths" ];
+
+  nativeBuildInputs = [
+    glib
+    wrapGAppsHook
+  ];
+
+  buildInputs = lib.forEach selectedIndicators (x: x.buildInputs)
+    ++ selectedIndicators;
+
+  dontUnpack = true;
+  dontConfigure = true;
+  dontBuild = true;
+
+  preferLocalBuild = true;
+  allowSubstitutes = false;
+
+  installPhase = ''
+    mkdir -p $out
+    for i in $(cat $pathsPath); do
+      ${xorg.lndir}/bin/lndir -silent $i $out
+    done
+  '';
+
+  preFixup = ''
+    gappsWrapperArgs+=(
+      --set WINGPANEL_INDICATORS_PATH "$out/lib/wingpanel"
+      --set SWITCHBOARD_PLUGS_PATH "${switchboard-with-plugs}/lib/switchboard"
+    )
+  '';
+
+  inherit (wingpanel) meta;
+}