diff --git a/nixos/doc/manual/release-notes/rl-2305.section.md b/nixos/doc/manual/release-notes/rl-2305.section.md index 801cd0c6dc8da81..4e6769b0f7c533a 100644 --- a/nixos/doc/manual/release-notes/rl-2305.section.md +++ b/nixos/doc/manual/release-notes/rl-2305.section.md @@ -41,6 +41,8 @@ In addition to numerous new and upgraded packages, this release has the followin - [stevenblack-blocklist](https://github.com/StevenBlack/hosts), A unified hosts file with base extensions for blocking unwanted websites. Available as [networking.stevenblack](options.html#opt-networking.stevenblack.enable). +- [Budgie Desktop](https://github.com/BuddiesOfBudgie/budgie-desktop), a familiar, modern desktop environment. Availabe as [services.xserver.desktopManager.budgie](options.html#opt-services.xserver.desktopManager.budgie). + - [imaginary](https://github.com/h2non/imaginary), a microservice for high-level image processing that Nextcloud can use to generate previews. Available as [services.imaginary](#opt-services.imaginary.enable). - [opensearch](https://opensearch.org), a search server alternative to Elasticsearch. Available as [services.opensearch](options.html#opt-services.opensearch.enable). diff --git a/nixos/modules/services/x11/desktop-managers/budgie.nix b/nixos/modules/services/x11/desktop-managers/budgie.nix new file mode 100644 index 000000000000000..6e6d5ef3face2c2 --- /dev/null +++ b/nixos/modules/services/x11/desktop-managers/budgie.nix @@ -0,0 +1,201 @@ +{ lib, pkgs, config, utils, ... }: + +let + inherit (lib) concatMapStrings literalExpression mdDoc mkDefault mkEnableOption mkIf mkOption types; + + cfg = config.services.xserver.desktopManager.budgie; + + nixos-background-light = pkgs.nixos-artwork.wallpapers.nineish; + nixos-background-dark = pkgs.nixos-artwork.wallpapers.nineish-dark-gray; + + nixos-gsettings-overrides = pkgs.budgie.budgie-gsettings-overrides.override { + inherit (cfg) extraGSettingsOverrides extraGSettingsOverridePackages; + inherit nixos-background-dark nixos-background-light; + }; +in { + options = { + services.xserver.desktopManager.budgie = { + enable = mkEnableOption (mdDoc "Budgie desktop"); + + sessionPath = mkOption { + description = mdDoc "Additional list of packages to be added to the session search path. Useful for GSettings-conditional autostart."; + type = with types; listOf package; + example = literalExpression "[ pkgs.budgie.budgie-desktop-view ]"; + default = []; + }; + + extraGSettingsOverrides = mkOption { + description = mdDoc "Additional GSettings overrides."; + type = types.lines; + default = ""; + }; + + extraGSettingsOverridePackages = mkOption { + description = mdDoc "List of packages for which GSettings are overridden."; + type = with types; listOf path; + default = []; + }; + }; + + environment.budgie.excludePackages = mkOption { + description = mdDoc "Which packages Budgie should exclude from the default environment."; + type = with types; listOf package; + default = []; + example = literalExpression "[ pkgs.mate-terminal ]"; + }; + }; + + config = mkIf cfg.enable { + services.xserver.displayManager.sessionPackages = with pkgs; [ + budgie.budgie-desktop + ]; + + services.xserver.displayManager.lightdm.greeters.slick = { + enable = mkDefault true; + theme = mkDefault { name = "Qogir"; package = pkgs.qogir-theme; }; + iconTheme = mkDefault { name = "Qogir"; package = pkgs.qogir-icon-theme; }; + cursorTheme = mkDefault { name = "Qogir"; package = pkgs.qogir-icon-theme; }; + }; + + services.xserver.desktopManager.budgie.sessionPath = [ pkgs.budgie.budgie-desktop-view ]; + + environment.extraInit = '' + ${concatMapStrings (p: '' + if [ -d "${p}/share/gsettings-schemas/${p.name}" ]; then + export XDG_DATA_DIRS=$XDG_DATA_DIRS''${XDG_DATA_DIRS:+:}${p}/share/gsettings-schemas/${p.name} + fi + if [ -d "${p}/lib/girepository-1.0" ]; then + export GI_TYPELIB_PATH=$GI_TYPELIB_PATH''${GI_TYPELIB_PATH:+:}${p}/lib/girepository-1.0 + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH''${LD_LIBRARY_PATH:+:}${p}/lib + fi + '') cfg.sessionPath} + ''; + + environment.systemPackages = with pkgs; + [ + # Budgie Desktop. + budgie.budgie-backgrounds + budgie.budgie-control-center + budgie.budgie-desktop + budgie.budgie-desktop-view + budgie.budgie-screensaver + + # Required by the Budgie Desktop session. + (gnome.gnome-session.override {gnomeShellSupport = false;}) + + # Required by Budgie Menu. + gnome-menus + + # Provides `gsettings`. + glib + + # Update user directories. + xdg-user-dirs + ] + ++ (utils.removePackagesByName [ + cinnamon.nemo + mate.eom + mate.pluma + mate.atril + mate.engrampa + mate.mate-calc + mate.mate-terminal + mate.mate-system-monitor + vlc + + # Desktop themes. + qogir-theme + qogir-icon-theme + + # Default settings. + nixos-gsettings-overrides + ] config.environment.budgie.excludePackages) + ++ cfg.sessionPath; + + # Fonts. + fonts.fonts = mkDefault [ + pkgs.noto-fonts + pkgs.hack-font + ]; + fonts.fontconfig.defaultFonts = { + sansSerif = mkDefault ["Noto Sans"]; + monospace = mkDefault ["Hack"]; + }; + + # Qt application style. + qt = { + enable = mkDefault true; + style = mkDefault "gtk2"; + platformTheme = mkDefault "gtk2"; + }; + + environment.pathsToLink = [ + "/share" # TODO: https://github.com/NixOS/nixpkgs/issues/47173 + ]; + + # GSettings overrides. + environment.sessionVariables.NIX_GSETTINGS_OVERRIDES_DIR = "${nixos-gsettings-overrides}/share/gsettings-schemas/nixos-gsettings-overrides/glib-2.0/schemas"; + + # Required by Budgie Desktop. + services.xserver.updateDbusEnvironment = true; + programs.dconf.enable = true; + + # Required by Budgie Screensaver. + security.pam.services.budgie-screensaver = {}; + + # Required by Budgie's Polkit Dialog. + security.polkit.enable = mkDefault true; + + # Required by Budgie Panel plugins and/or Budgie Control Center panels. + networking.networkmanager.enable = mkDefault true; # for BCC's Network panel. + programs.nm-applet.enable = config.networking.networkmanager.enable; # Budgie has no Network applet. + programs.nm-applet.indicator = false; # Budgie doesn't support AppIndicators. + + hardware.bluetooth.enable = mkDefault true; # for Budgie's Status Indicator and BCC's Bluetooth panel. + hardware.pulseaudio.enable = mkDefault true; # for Budgie's Status Indicator and BCC's Sound panel. + + xdg.portal.enable = mkDefault true; # for BCC's Applications panel. + xdg.portal.extraPortals = with pkgs; [ + xdg-desktop-portal-gtk # provides a XDG Portals implementation. + ]; + + services.geoclue2.enable = mkDefault true; # for BCC's Privacy > Location Services panel. + services.upower.enable = config.powerManagement.enable; # for Budgie's Status Indicator and BCC's Power panel. + services.xserver.libinput.enable = mkDefault true; # for BCC's Mouse panel. + services.colord.enable = mkDefault true; # for BCC's Color panel. + services.gnome.at-spi2-core.enable = mkDefault true; # for BCC's A11y panel. + services.accounts-daemon.enable = mkDefault true; # for BCC's Users panel. + services.fprintd.enable = mkDefault true; # for BCC's Users panel. + services.udisks2.enable = mkDefault true; # for BCC's Details panel. + + # For BCC's Online Accounts panel. + services.gnome.gnome-online-accounts.enable = mkDefault true; + services.gnome.gnome-online-miners.enable = true; + + # For BCC's Printers panel. + services.printing.enable = mkDefault true; + services.system-config-printer.enable = config.services.printing.enable; + + # For BCC's Sharing panel. + services.dleyna-renderer.enable = mkDefault true; + services.dleyna-server.enable = mkDefault true; + services.gnome.gnome-user-share.enable = mkDefault true; + services.gnome.rygel.enable = mkDefault true; + + # Other default services. + services.gnome.evolution-data-server.enable = mkDefault true; + services.gnome.glib-networking.enable = mkDefault true; + services.gnome.gnome-keyring.enable = mkDefault true; + services.gnome.gnome-settings-daemon.enable = mkDefault true; + services.gvfs.enable = mkDefault true; + + # Register packages for DBus. + services.dbus.packages = with pkgs; [ + budgie.budgie-control-center + ]; + + # Shell integration for MATE Terminal. + programs.bash.vteIntegration = true; + programs.zsh.vteIntegration = true; + }; +} diff --git a/nixos/modules/services/x11/desktop-managers/default.nix b/nixos/modules/services/x11/desktop-managers/default.nix index 510561246a2b76d..a261ca44058a071 100644 --- a/nixos/modules/services/x11/desktop-managers/default.nix +++ b/nixos/modules/services/x11/desktop-managers/default.nix @@ -21,7 +21,7 @@ in ./none.nix ./xterm.nix ./phosh.nix ./xfce.nix ./plasma5.nix ./lumina.nix ./lxqt.nix ./enlightenment.nix ./gnome.nix ./retroarch.nix ./kodi.nix ./mate.nix ./pantheon.nix ./surf-display.nix ./cde.nix - ./cinnamon.nix + ./cinnamon.nix ./budgie.nix ]; options = { diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index ff2549395a0b2ce..95a737bc7618459 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -111,6 +111,7 @@ in { btrbk-doas = handleTest ./btrbk-doas.nix {}; btrbk-no-timer = handleTest ./btrbk-no-timer.nix {}; btrbk-section-order = handleTest ./btrbk-section-order.nix {}; + budgie = handleTest ./budgie.nix {}; buildbot = handleTest ./buildbot.nix {}; buildkite-agents = handleTest ./buildkite-agents.nix {}; caddy = handleTest ./caddy.nix {}; diff --git a/nixos/tests/budgie.nix b/nixos/tests/budgie.nix new file mode 100644 index 000000000000000..b9eba74b450bd27 --- /dev/null +++ b/nixos/tests/budgie.nix @@ -0,0 +1,51 @@ +import ./make-test-python.nix ({ pkgs, lib, ... }: { + name = "budgie"; + + meta = with lib; { + maintainers = [ maintainers.federicoschonborn ]; + }; + + nodes.machine = { ... }: { + imports = [ + ./common/user-account.nix + ]; + + services.xserver.enable = true; + + services.xserver.displayManager = { + lightdm.enable = true; + autoLogin = { + enable = true; + user = "alice"; + }; + }; + + services.xserver.desktopManager.budgie.enable = true; + }; + + testScript = { nodes, ... }: + let + user = nodes.machine.users.users.alice; + in + '' + with subtest("Wait for login"): + machine.wait_for_x() + machine.wait_for_file("${user.home}/.Xauthority") + machine.succeed("xauth merge ${user.home}/.Xauthority") + + with subtest("Check that logging in has given the user ownership of devices"): + machine.succeed("getfacl -p /dev/snd/timer | grep -q ${user.name}") + + with subtest("Check if Budgie session components actually start"): + machine.wait_until_succeeds("pgrep budgie-daemon") + machine.wait_for_window("budgie-daemon") + machine.wait_until_succeeds("pgrep budgie-panel") + machine.wait_for_window("budgie-panel") + + with subtest("Open MATE terminal"): + machine.succeed("su - ${user.name} -c 'DISPLAY=:0 mate-terminal >&2 &'") + machine.wait_for_window("Terminal") + machine.sleep(20) + machine.screenshot("screen") + ''; +}) diff --git a/pkgs/desktops/budgie/budgie-backgrounds/default.nix b/pkgs/desktops/budgie/budgie-backgrounds/default.nix new file mode 100644 index 000000000000000..67456ca4ff20092 --- /dev/null +++ b/pkgs/desktops/budgie/budgie-backgrounds/default.nix @@ -0,0 +1,40 @@ +{ lib +, stdenv +, fetchFromGitHub +, imagemagick +, jhead +, meson +, ninja +}: + +stdenv.mkDerivation rec { + pname = "budgie-backgrounds"; + version = "0.1"; + + src = fetchFromGitHub { + owner = "BuddiesOfBudgie"; + repo = "budgie-backgrounds"; + rev = "v${version}"; + hash = "sha256-pDFd+WvWOPgDoSffmX9mzjDQbhePsJV1wGqmPDcnOlw="; + }; + + nativeBuildInputs = [ + imagemagick + jhead + meson + ninja + ]; + + preConfigure = '' + chmod +x ./scripts/optimizeImage.sh + patchShebangs ./scripts/optimizeImage.sh + ''; + + meta = with lib; { + description = "The default background set for the Budgie Desktop"; + homepage = "https://github.com/BuddiesOfBudgie/budgie-backgrounds"; + platforms = platforms.linux; + maintainers = [ maintainers.federicoschonborn ]; + license = licenses.cc0; + }; +} diff --git a/pkgs/desktops/budgie/budgie-control-center/default.nix b/pkgs/desktops/budgie/budgie-control-center/default.nix new file mode 100644 index 000000000000000..b8444f72e1fc73f --- /dev/null +++ b/pkgs/desktops/budgie/budgie-control-center/default.nix @@ -0,0 +1,175 @@ +{ lib +, stdenv +, fetchFromGitHub +, substituteAll +, accountsservice +, budgie-desktop +, clutter +, clutter-gtk +, colord +, colord-gtk +, cups +, docbook-xsl-nons +, fontconfig +, gcr +, gdk-pixbuf +, gettext +, glib +, glib-networking +, glibc +, gnome +, gnome-desktop +, gnome-online-accounts +, gsettings-desktop-schemas +, gsound +, gtk3 +, ibus +, libcanberra-gtk3 +, libepoxy +, libgnomekbd +, libgtop +, libgudev +, libhandy +, libkrb5 +, libnma +, libpulseaudio +, libpwquality +, librsvg +, libsecret +, libwacom +, libxml2 +, libxslt +, meson +, modemmanager +, networkmanager +, networkmanagerapplet +, ninja +, pkg-config +, polkit +, samba +, shadow +, shared-mime-info +, tzdata +, udisks2 +, upower +, webp-pixbuf-loader +, wrapGAppsHook +}: + +stdenv.mkDerivation rec { + pname = "budgie-control-center"; + version = "1.2.0"; + + src = fetchFromGitHub { + owner = "BuddiesOfBudgie"; + repo = pname; + rev = "v${version}"; + fetchSubmodules = true; + sha256 = "sha256-z9apestNLEUKzrCMNo0BNAWeyE6FsUCAzcHIom8LcUs="; + }; + + patches = [ + (substituteAll { + src = ./paths.patch; + budgie_desktop = budgie-desktop; + gcm = gnome.gnome-color-manager; + inherit cups glibc libgnomekbd shadow; + inherit networkmanagerapplet tzdata; + }) + ]; + + nativeBuildInputs = [ + docbook-xsl-nons + gettext + libxslt + meson + ninja + pkg-config + shared-mime-info + wrapGAppsHook + ]; + + buildInputs = [ + accountsservice + clutter + clutter-gtk + colord + colord-gtk + fontconfig + gcr + gdk-pixbuf + glib + glib-networking + gnome-desktop + gnome-online-accounts + gnome.adwaita-icon-theme + gnome.cheese + gnome.gnome-bluetooth_1_0 + gnome.gnome-remote-desktop + gnome.gnome-settings-daemon + gnome.gnome-user-share + gnome.mutter + gsettings-desktop-schemas + gsound + gtk3 + ibus + libcanberra-gtk3 + libepoxy + libgtop + libgudev + libhandy + libkrb5 + libnma + libpulseaudio + libpwquality + librsvg + libsecret + libwacom + libxml2 + modemmanager + networkmanager + polkit + samba + udisks2 + upower + ]; + + preConfigure = '' + # For ITS rules + addToSearchPath "XDG_DATA_DIRS" "${polkit.out}/share" + ''; + + postInstall = '' + # Pull in WebP support for gnome-backgrounds. + # In postInstall to run before gappsWrapperArgsHook. + export GDK_PIXBUF_MODULE_FILE="${gnome._gdkPixbufCacheBuilder_DO_NOT_USE { + extraLoaders = [ + librsvg + webp-pixbuf-loader + ]; + }}" + ''; + + preFixup = '' + gappsWrapperArgs+=( + # Sound theme + --prefix XDG_DATA_DIRS : "${budgie-desktop}/share" + # Thumbnailers (for setting user profile pictures) + --prefix XDG_DATA_DIRS : "${gdk-pixbuf}/share" + --prefix XDG_DATA_DIRS : "${librsvg}/share" + # WM keyboard shortcuts + --prefix XDG_DATA_DIRS : "${gnome.mutter}/share" + ) + ''; + + separateDebugInfo = true; + + meta = with lib; { + description = "A fork of GNOME Control Center for the Budgie 10 Series"; + homepage = "https://github.com/BuddiesOfBudgie/budgie-control-center"; + mainProgram = "budgie-control-center"; + platforms = platforms.linux; + maintainers = [ maintainers.federicoschonborn ]; + license = licenses.gpl2Plus; + }; +} diff --git a/pkgs/desktops/budgie/budgie-control-center/paths.patch b/pkgs/desktops/budgie/budgie-control-center/paths.patch new file mode 100644 index 000000000000000..584d12038285ff4 --- /dev/null +++ b/pkgs/desktops/budgie/budgie-control-center/paths.patch @@ -0,0 +1,185 @@ +diff --git a/panels/color/cc-color-panel.c b/panels/color/cc-color-panel.c +index a2f90b093..7801b4a5e 100644 +--- a/panels/color/cc-color-panel.c ++++ b/panels/color/cc-color-panel.c +@@ -587,7 +587,7 @@ gcm_prefs_calibrate_cb (CcColorPanel *prefs) + + /* run with modal set */ + argv = g_ptr_array_new_with_free_func (g_free); +- g_ptr_array_add (argv, g_strdup ("gcm-calibrate")); ++ g_ptr_array_add (argv, g_build_filename ("@gcm@", "bin", "gcm-calibrate", NULL)); + g_ptr_array_add (argv, g_strdup ("--device")); + g_ptr_array_add (argv, g_strdup (cd_device_get_id (prefs->current_device))); + g_ptr_array_add (argv, g_strdup ("--parent-window")); +@@ -940,7 +940,7 @@ gcm_prefs_profile_view (CcColorPanel *prefs, CdProfile *profile) + + /* open up gcm-viewer as a info pane */ + argv = g_ptr_array_new_with_free_func (g_free); +- g_ptr_array_add (argv, g_strdup ("gcm-viewer")); ++ g_ptr_array_add (argv, g_build_filename ("@gcm@", "bin", "gcm-viewer", NULL)); + g_ptr_array_add (argv, g_strdup ("--profile")); + g_ptr_array_add (argv, g_strdup (cd_profile_get_id (profile))); + g_ptr_array_add (argv, g_strdup ("--parent-window")); +@@ -1186,15 +1186,12 @@ gcm_prefs_device_clicked (CcColorPanel *prefs, CdDevice *device) + static void + gcm_prefs_profile_clicked (CcColorPanel *prefs, CdProfile *profile, CdDevice *device) + { +- g_autofree gchar *s = NULL; +- + /* get profile */ + g_debug ("selected profile = %s", + cd_profile_get_filename (profile)); + + /* allow getting profile info */ +- if (cd_profile_get_filename (profile) != NULL && +- (s = g_find_program_in_path ("gcm-viewer")) != NULL) ++ if (cd_profile_get_filename (profile) != NULL) + gtk_widget_set_sensitive (prefs->toolbutton_profile_view, TRUE); + else + gtk_widget_set_sensitive (prefs->toolbutton_profile_view, FALSE); +diff --git a/panels/datetime/tz.h b/panels/datetime/tz.h +index b6b7ab9d0..31f268e91 100644 +--- a/panels/datetime/tz.h ++++ b/panels/datetime/tz.h +@@ -4,7 +4,7 @@ + * Copyright (C) 2000-2001 Ximian, Inc. + * + * Authors: Hans Petter Jansson +- * ++ * + * Largely based on Michael Fulbright's work on Anaconda. + * + * This program is free software; you can redistribute it and/or modify +@@ -27,11 +27,7 @@ + + G_BEGIN_DECLS + +-#ifndef __sun +-# define TZ_DATA_FILE "/usr/share/zoneinfo/zone.tab" +-#else +-# define TZ_DATA_FILE "/usr/share/lib/zoneinfo/tab/zone_sun.tab" +-#endif ++#define TZ_DATA_FILE "@tzdata@/share/zoneinfo/zone.tab" + + typedef struct _TzDB TzDB; + typedef struct _TzLocation TzLocation; +diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c +index 25cda02d3..db664bc56 100644 +--- a/panels/info-overview/cc-info-overview-panel.c ++++ b/panels/info-overview/cc-info-overview-panel.c +@@ -156,7 +156,7 @@ load_budgie_version (char **version) + gsize length; + g_autoptr(VersionData) data = NULL; + +- if (!g_file_get_contents (DATADIR "/budgie/budgie-version.xml", ++ if (!g_file_get_contents ("@budgie_desktop@/share/budgie/budgie-version.xml", + &contents, + &length, + &error)) +diff --git a/panels/keyboard/cc-input-list-box.c b/panels/keyboard/cc-input-list-box.c +index 191207490..37e0fddc2 100644 +--- a/panels/keyboard/cc-input-list-box.c ++++ b/panels/keyboard/cc-input-list-box.c +@@ -62,7 +62,7 @@ struct _CcInputListBox { + }; + + G_DEFINE_TYPE (CcInputListBox, cc_input_list_box, GTK_TYPE_LIST_BOX) +- ++ + typedef struct + { + CcInputListBox *panel; +@@ -223,10 +223,10 @@ row_layout_cb (CcInputListBox *self, + layout_variant = cc_input_source_get_layout_variant (source); + + if (layout_variant && layout_variant[0]) +- commandline = g_strdup_printf ("gkbd-keyboard-display -l \"%s\t%s\"", ++ commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l \"%s\t%s\"", + layout, layout_variant); + else +- commandline = g_strdup_printf ("gkbd-keyboard-display -l %s", ++ commandline = g_strdup_printf ("@libgnomekbd@/bin/gkbd-keyboard-display -l %s", + layout); + + g_spawn_command_line_async (commandline, NULL); +diff --git a/panels/network/connection-editor/net-connection-editor.c b/panels/network/connection-editor/net-connection-editor.c +index 505b8ee25..62e94009f 100644 +--- a/panels/network/connection-editor/net-connection-editor.c ++++ b/panels/network/connection-editor/net-connection-editor.c +@@ -267,9 +267,9 @@ net_connection_editor_do_fallback (NetConnectionEditor *self, const gchar *type) + g_autoptr(GError) error = NULL; + + if (self->is_new_connection) { +- cmdline = g_strdup_printf ("nm-connection-editor --type='%s' --create", type); ++ cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --type='%s' --create", type); + } else { +- cmdline = g_strdup_printf ("nm-connection-editor --edit='%s'", ++ cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit='%s'", + nm_connection_get_uuid (self->connection)); + } + +diff --git a/panels/network/net-device-bluetooth.c b/panels/network/net-device-bluetooth.c +index 372c0c4f8..464f4b6a0 100644 +--- a/panels/network/net-device-bluetooth.c ++++ b/panels/network/net-device-bluetooth.c +@@ -141,7 +141,7 @@ options_button_clicked_cb (NetDeviceBluetooth *self) + + connection = net_device_get_find_connection (self->client, self->device); + uuid = nm_connection_get_uuid (connection); +- cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid); ++ cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit %s", uuid); + g_debug ("Launching '%s'\n", cmdline); + if (!g_spawn_command_line_async (cmdline, &error)) + g_warning ("Failed to launch nm-connection-editor: %s", error->message); +diff --git a/panels/network/net-device-mobile.c b/panels/network/net-device-mobile.c +index f50fd5d07..c6f6f776e 100644 +--- a/panels/network/net-device-mobile.c ++++ b/panels/network/net-device-mobile.c +@@ -522,7 +522,7 @@ options_button_clicked_cb (NetDeviceMobile *self) + + connection = net_device_get_find_connection (self->client, self->device); + uuid = nm_connection_get_uuid (connection); +- cmdline = g_strdup_printf ("nm-connection-editor --edit %s", uuid); ++ cmdline = g_strdup_printf ("@networkmanagerapplet@/bin/nm-connection-editor --edit %s", uuid); + g_debug ("Launching '%s'\n", cmdline); + if (!g_spawn_command_line_async (cmdline, &error)) + g_warning ("Failed to launch nm-connection-editor: %s", error->message); +diff --git a/panels/printers/pp-host.c b/panels/printers/pp-host.c +index a31a606e3..ed5133d29 100644 +--- a/panels/printers/pp-host.c ++++ b/panels/printers/pp-host.c +@@ -256,7 +256,7 @@ _pp_host_get_snmp_devices_thread (GTask *task, + devices = g_ptr_array_new_with_free_func (g_object_unref); + + argv = g_new0 (gchar *, 3); +- argv[0] = g_strdup ("/usr/lib/cups/backend/snmp"); ++ argv[0] = g_strdup ("@cups@/lib/cups/backend/snmp"); + argv[1] = g_strdup (priv->hostname); + + /* Use SNMP to get printer's informations */ +diff --git a/panels/user-accounts/run-passwd.c b/panels/user-accounts/run-passwd.c +index 86f53d4fc..0b052856f 100644 +--- a/panels/user-accounts/run-passwd.c ++++ b/panels/user-accounts/run-passwd.c +@@ -150,7 +150,7 @@ spawn_passwd (PasswdHandler *passwd_handler, GError **error) + gchar **envp; + gint my_stdin, my_stdout, my_stderr; + +- argv[0] = "/usr/bin/passwd"; /* Is it safe to rely on a hard-coded path? */ ++ argv[0] = "/run/wrappers/bin/passwd"; /* Is it safe to rely on a hard-coded path? */ + argv[1] = NULL; + + envp = g_get_environ (); +diff --git a/panels/user-accounts/user-utils.c b/panels/user-accounts/user-utils.c +index 0de83479e..628e35247 100644 +--- a/panels/user-accounts/user-utils.c ++++ b/panels/user-accounts/user-utils.c +@@ -497,7 +497,7 @@ is_valid_username_async (const gchar *username, + * future, so it would be nice to have some official way for this + * instead of relying on the current "--login" implementation. + */ +- argv[0] = "/usr/sbin/usermod"; ++ argv[0] = "@shadow@/bin/usermod"; + argv[1] = "--login"; + argv[2] = data->username; + argv[3] = "--"; diff --git a/pkgs/desktops/budgie/budgie-desktop-view/default.nix b/pkgs/desktops/budgie/budgie-desktop-view/default.nix new file mode 100644 index 000000000000000..7faf261747ca82b --- /dev/null +++ b/pkgs/desktops/budgie/budgie-desktop-view/default.nix @@ -0,0 +1,53 @@ +{ lib +, stdenv +, fetchFromGitHub +, desktop-file-utils +, glib +, gtk3 +, intltool +, meson +, ninja +, pkg-config +, vala +, wrapGAppsHook +}: + +stdenv.mkDerivation rec { + pname = "budgie-desktop-view"; + version = "1.2.1"; + + src = fetchFromGitHub { + owner = "BuddiesOfBudgie"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-USsySJuDov2oe9UXyzACBAyYIRLKSXOMXdia8Ix/8TE="; + }; + + nativeBuildInputs = [ + desktop-file-utils + intltool + meson + ninja + pkg-config + vala + wrapGAppsHook + ]; + + buildInputs = [ + glib + gtk3 + ]; + + preInstall = '' + substituteInPlace ../scripts/mesonPostInstall.sh --replace "update-desktop-database -q" "update-desktop-database $out/share/applications" + ''; + + meta = with lib; { + description = "The official Budgie desktop icons application/implementation"; + homepage = "https://github.com/BuddiesOfBudgie/budgie-desktop-view"; + mainProgram = "org.buddiesofbudgie.budgie-desktop-view"; + platforms = platforms.linux; + maintainers = [ maintainers.federicoschonborn ]; + license = licenses.asl20; + }; +} diff --git a/pkgs/desktops/budgie/budgie-desktop/default.nix b/pkgs/desktops/budgie/budgie-desktop/default.nix new file mode 100644 index 000000000000000..252f4cbd38d4a71 --- /dev/null +++ b/pkgs/desktops/budgie/budgie-desktop/default.nix @@ -0,0 +1,101 @@ +{ lib +, stdenv +, fetchFromGitHub +, accountsservice +, alsa-lib +, budgie-screensaver +, docbook-xsl-nons +, glib +, gnome +, gnome-desktop +, gnome-menus +, graphene +, gst_all_1 +, gtk-doc +, gtk3 +, ibus +, intltool +, libcanberra-gtk3 +, libgee +, libGL +, libnotify +, libpeas +, libpulseaudio +, libuuid +, libwnck +, mesa +, meson +, ninja +, pkg-config +, polkit +, sassc +, upower +, vala +, wrapGAppsHook +}: + +stdenv.mkDerivation rec { + pname = "budgie-desktop"; + version = "10.7.1"; + + src = fetchFromGitHub { + owner = "BuddiesOfBudgie"; + repo = pname; + rev = "v${version}"; + fetchSubmodules = true; + sha256 = "sha256-ww65J9plixbxFza6xCfaz1WYtT9giKkLVH1XYxH41+0="; + }; + + nativeBuildInputs = [ + docbook-xsl-nons + gtk-doc + intltool + meson + ninja + pkg-config + vala + wrapGAppsHook + ]; + + buildInputs = [ + accountsservice + alsa-lib + budgie-screensaver + glib + gnome-desktop + gnome-menus + gnome.gnome-bluetooth_1_0 + gnome.gnome-settings-daemon + gnome.mutter + graphene + gtk3 + ibus + libcanberra-gtk3 + libgee + libGL + libnotify + libpeas + libpulseaudio + libuuid + libwnck + mesa + polkit + sassc + upower + ] ++ (with gst_all_1; [ + gstreamer + gst-plugins-base + ]); + + passthru.providedSessions = [ + "budgie-desktop" + ]; + + meta = with lib; { + description = "A feature-rich, modern desktop designed to keep out the way of the user"; + homepage = "https://github.com/BuddiesOfBudgie/budgie-desktop"; + platforms = platforms.linux; + maintainers = [ maintainers.federicoschonborn ]; + license = with licenses; [ gpl2Plus lgpl21Plus cc-by-sa-30]; + }; +} diff --git a/pkgs/desktops/budgie/budgie-gsettings-overrides/default.nix b/pkgs/desktops/budgie/budgie-gsettings-overrides/default.nix new file mode 100644 index 000000000000000..c9e2632b62f93bf --- /dev/null +++ b/pkgs/desktops/budgie/budgie-gsettings-overrides/default.nix @@ -0,0 +1,78 @@ +{ lib +, runCommand +, budgie-desktop +, budgie-desktop-view +, glib +, gnome +, gsettings-desktop-schemas +, mate +, nixos-artwork +, nixos-background-light ? nixos-artwork.wallpapers.nineish +, nixos-background-dark ? nixos-artwork.wallpapers.nineish-dark-gray +, extraGSettingsOverrides ? "" +, extraGSettingsOverridePackages ? [] +}: + +let + inherit (lib) concatMapStringsSep; + + gsettingsOverrides = '' + [org.gnome.desktop.background:Budgie] + picture-uri="file://${nixos-background-light.gnomeFilePath}" + picture-uri-dark="file://${nixos-background-dark.gnomeFilePath}" + + [org.gnome.desktop.screensaver:Budgie] + picture-uri="file://${nixos-background-dark.gnomeFilePath}" + + [org.gnome.desktop.interface:Budgie] + gtk-theme="Qogir" + icon-theme="Qogir" + cursor-theme="Qogir" + font-name="Noto Sans 10" + document-font-name="Noto Sans 10" + monospace-font-name="Hack 10" + enable-hot-corners=true + + [org.gnome.desktop.wm.preferences:Budgie] + titlebar-font="Noto Sans Bold 10" + + [org.gnome.mutter:Budgie] + workspaces-only-on-primary=true + + [com.solus-project.budgie-panel:Budgie] + dark-theme=false + builtin-theme=false + + [com.solus-project.icon-tasklist:Budgie] + pinned-launchers=["nemo.desktop", "vlc.desktop", "mate-terminal.desktop"] + + [org.buddiesofbudgie.budgie-desktop-view:Budgie] + show=true + click-policy="double" + terminal="${mate.mate-terminal}/bin/mate-terminal" + + ${extraGSettingsOverrides} + ''; + + gsettingsOverridePackages = [ + budgie-desktop + budgie-desktop-view + gsettings-desktop-schemas + gnome.mutter + ] ++ extraGSettingsOverridePackages; + +in + runCommand "budgie-gsettings-overrides" { preferLocalBuild = true; } '' + data_dir="$out/share/gsettings-schemas/nixos-gsettings-overrides" + schema_dir="$data_dir/glib-2.0/schemas" + mkdir -p "$schema_dir" + + ${concatMapStringsSep "\n" (pkg: "cp -rf \"${glib.getSchemaPath pkg}\"/*.xml \"${glib.getSchemaPath pkg}\"/*.gschema.override \"$schema_dir\"") gsettingsOverridePackages} + + chmod -R a+w "$data_dir" + cat - > "$schema_dir/zz-nixos-defaults.gschema.override" <<- EOF + ${gsettingsOverrides} + EOF + + ${glib.dev}/bin/glib-compile-schemas --strict "$schema_dir" + '' diff --git a/pkgs/desktops/budgie/default.nix b/pkgs/desktops/budgie/default.nix index 491db246187b2d2..24a461a167035f4 100644 --- a/pkgs/desktops/budgie/default.nix +++ b/pkgs/desktops/budgie/default.nix @@ -1,5 +1,10 @@ { lib, pkgs }: lib.makeScope pkgs.newScope (self: with self; { + budgie-backgrounds = callPackage ./budgie-backgrounds { }; + budgie-control-center = callPackage ./budgie-control-center { }; + budgie-desktop = callPackage ./budgie-desktop { }; + budgie-desktop-view = callPackage ./budgie-desktop-view { }; + budgie-gsettings-overrides = callPackage ./budgie-gsettings-overrides { }; budgie-screensaver = callPackage ./budgie-screensaver { }; }) diff --git a/pkgs/desktops/gnome/core/gnome-session/default.nix b/pkgs/desktops/gnome/core/gnome-session/default.nix index dee4857325f6ca4..03082f7879e2026 100644 --- a/pkgs/desktops/gnome/core/gnome-session/default.nix +++ b/pkgs/desktops/gnome/core/gnome-session/default.nix @@ -25,6 +25,7 @@ , libepoxy , bash , gnome-session-ctl +, gnomeShellSupport ? true }: stdenv.mkDerivation rec { @@ -113,7 +114,7 @@ stdenv.mkDerivation rec { wrapProgram "$out/libexec/gnome-session-binary" \ --prefix GI_TYPELIB_PATH : "$GI_TYPELIB_PATH" \ --suffix XDG_DATA_DIRS : "$out/share:$GSETTINGS_SCHEMAS_PATH" \ - --suffix XDG_DATA_DIRS : "${gnome.gnome-shell}/share"\ + ${lib.optionalString gnomeShellSupport "--suffix XDG_DATA_DIRS : \"${gnome.gnome-shell}/share\""} \ --suffix XDG_CONFIG_DIRS : "${gnome.gnome-settings-daemon}/etc/xdg" '';