Merge pull request #259363 from bobby285271/fix/gnome-flashback

gnome.gnome-flashback: Fix x-d-p-gnome launch

Changed files
+110 -81
nixos
modules
services
x11
desktop-managers
tests
pkgs
desktops
gnome
misc
gnome-flashback
gnome-panel
+10 -4
nixos/modules/services/x11/desktop-managers/gnome.nix
···
panelModulePackages = mkOption {
default = [ pkgs.gnome.gnome-applets ];
defaultText = literalExpression "[ pkgs.gnome.gnome-applets ]";
-
type = types.listOf types.path;
+
type = types.listOf types.package;
description = lib.mdDoc ''
Packages containing modules that should be made available to `gnome-panel` (usually for applets).
···
map
(wm:
pkgs.gnome.gnome-flashback.mkSessionForWm {
-
inherit (wm) wmName wmLabel wmCommand enableGnomePanel;
-
inherit (cfg.flashback) panelModulePackages;
+
inherit (wm) wmName wmLabel wmCommand;
}
) flashbackWms;
···
environment.systemPackages = with pkgs.gnome; [
gnome-flashback
-
];
+
(gnome-panel-with-modules.override {
+
panelModulePackages = cfg.flashback.panelModulePackages;
+
})
+
]
+
# For /share/applications/${wmName}.desktop
+
++ (map (wm: gnome-flashback.mkWmApplication { inherit (wm) wmName wmLabel wmCommand; }) flashbackWms)
+
# For /share/gnome-session/sessions/gnome-flashback-${wmName}.session
+
++ (map (wm: gnome-flashback.mkGnomeSession { inherit (wm) wmName wmLabel enableGnomePanel; }) flashbackWms);
})
(mkIf serviceCfg.core-os-services.enable {
+1 -8
nixos/tests/gnome-flashback.nix
···
xauthority = "/run/user/${uid}/gdm/Xauthority";
in ''
with subtest("Login to GNOME Flashback with GDM"):
-
# wait_for_x() checks graphical-session.target, which is expected to be
-
# inactive on gnome-flashback before #228946 (i.e. systemd managed
-
# gnome-session) is done.
-
# https://github.com/NixOS/nixpkgs/pull/208060
-
#
-
# Previously this was unconditionally touched by xsessionWrapper but was
-
# changed in #233981 (we have GNOME-Flashback:GNOME in XDG_CURRENT_DESKTOP).
-
# machine.wait_for_x()
+
machine.wait_for_x()
machine.wait_until_succeeds('journalctl -t gnome-session-binary --grep "Entering running state"')
# Wait for alice to be logged in"
machine.wait_for_unit("default.target", "${user.name}")
+3 -3
pkgs/desktops/gnome/default.nix
···
gnome-flashback = callPackage ./misc/gnome-flashback { };
-
gnome-panel = callPackage ./misc/gnome-panel {
-
autoreconfHook = pkgs.autoreconfHook269;
-
};
+
gnome-panel = callPackage ./misc/gnome-panel { };
+
+
gnome-panel-with-modules = callPackage ./misc/gnome-panel/wrapper.nix { };
gnome-tweaks = callPackage ./misc/gnome-tweaks { };
+30 -66
pkgs/desktops/gnome/misc/gnome-flashback/default.nix
···
versionPolicy = "odd-unstable";
};
-
mkSessionForWm = { wmName, wmLabel, wmCommand, enableGnomePanel, panelModulePackages }:
-
let
-
wmApplication = writeTextFile {
-
name = "gnome-flashback-${wmName}-wm";
-
destination = "/share/applications/${wmName}.desktop";
-
text = ''
-
[Desktop Entry]
-
Type=Application
-
Encoding=UTF-8
-
Name=${wmLabel}
-
Exec=${wmCommand}
-
NoDisplay=true
-
X-GNOME-WMName=${wmLabel}
-
X-GNOME-Autostart-Phase=WindowManager
-
X-GNOME-Provides=windowmanager
-
X-GNOME-Autostart-Notify=false
-
'';
-
};
-
-
gnomeSession = writeTextFile {
-
name = "gnome-flashback-${wmName}-gnome-session";
-
destination = "/share/gnome-session/sessions/gnome-flashback-${wmName}.session";
-
text = ''
-
[GNOME Session]
-
Name=GNOME Flashback (${wmLabel})
-
${requiredComponents wmName enableGnomePanel}
-
'';
-
};
-
-
# gnome-panel will only look for applets in a single directory so symlink them into here.
-
panelModulesEnv = buildEnv {
-
name = "gnome-panel-modules-env";
-
# We always want to find the built-in panel applets.
-
paths = [ gnome-panel gnome-flashback ] ++ panelModulePackages;
-
pathsToLink = [ "/lib/gnome-panel/modules" ];
-
};
-
-
executable = stdenv.mkDerivation {
-
name = "gnome-flashback-${wmName}";
-
nativeBuildInputs = [ glib wrapGAppsHook ];
-
buildInputs = [ gnome-flashback ] ++ lib.optionals enableGnomePanel ([ gnome-panel ] ++ panelModulePackages);
-
-
# We want to use the wrapGAppsHook mechanism to wrap gnome-session
-
# with the environment that gnome-flashback and gnome-panel need to
-
# run, including the configured applet packages. This is only possible
-
# in the fixup phase, so turn everything else off.
-
dontUnpack = true;
-
dontConfigure = true;
-
dontBuild = true;
-
dontInstall = true;
-
dontWrapGApps = true; # We want to do the wrapping ourselves.
+
mkWmApplication = { wmName, wmLabel, wmCommand }:
+
writeTextFile {
+
name = "gnome-flashback-${wmName}-wm";
+
destination = "/share/applications/${wmName}.desktop";
+
text = ''
+
[Desktop Entry]
+
Type=Application
+
Encoding=UTF-8
+
Name=${wmLabel}
+
Exec=${wmCommand}
+
NoDisplay=true
+
X-GNOME-WMName=${wmLabel}
+
X-GNOME-Autostart-Phase=WindowManager
+
X-GNOME-Provides=windowmanager
+
X-GNOME-Autostart-Notify=false
+
'';
+
};
-
# gnome-flashback and gnome-panel need to be added to XDG_DATA_DIRS so that their .desktop files can be found by gnome-session.
-
# We need to pass the --builtin flag so that gnome-session invokes gnome-session-binary instead of systemd.
-
# If systemd is used, it doesn't use the environment we set up here and so it can't find the .desktop files.
-
preFixup = ''
-
makeWrapper ${gnome-session}/bin/gnome-session $out \
-
--add-flags "--session=gnome-flashback-${wmName} --builtin" \
-
--set-default XDG_CURRENT_DESKTOP 'GNOME-Flashback:GNOME' \
-
--prefix XDG_DATA_DIRS : '${lib.makeSearchPath "share" ([ wmApplication gnomeSession gnome-flashback ] ++ lib.optional enableGnomePanel gnome-panel)}' \
-
"''${gappsWrapperArgs[@]}" \
-
${lib.optionalString enableGnomePanel "--set NIX_GNOME_PANEL_MODULESDIR '${panelModulesEnv}/lib/gnome-panel/modules'"}
-
'';
-
};
+
mkGnomeSession = { wmName, wmLabel, enableGnomePanel }:
+
writeTextFile {
+
name = "gnome-flashback-${wmName}-gnome-session";
+
destination = "/share/gnome-session/sessions/gnome-flashback-${wmName}.session";
+
text = ''
+
[GNOME Session]
+
Name=GNOME Flashback (${wmLabel})
+
${requiredComponents wmName enableGnomePanel}
+
'';
+
};
-
in
+
mkSessionForWm = { wmName, wmLabel, wmCommand }:
writeTextFile
{
name = "gnome-flashback-${wmName}-xsession";
···
[Desktop Entry]
Name=GNOME Flashback (${wmLabel})
Comment=This session logs you into GNOME Flashback with ${wmLabel}
-
Exec=${executable}
+
Exec=${gnome-session}/bin/gnome-session --session=gnome-flashback-${wmName}
TryExec=${wmCommand}
Type=Application
DesktopNames=GNOME-Flashback;GNOME;
···
};
mkSystemdTargetForWm = { wmName, wmLabel, wmCommand, enableGnomePanel }:
-
runCommand "gnome-flashback-${wmName}.target" {} ''
+
runCommand "gnome-flashback-${wmName}.target" { } ''
mkdir -p $out/lib/systemd/user
cp -r "${gnome-flashback}/lib/systemd/user/gnome-session@gnome-flashback-metacity.target.d" \
"$out/lib/systemd/user/gnome-session@gnome-flashback-${wmName}.target.d"
+66
pkgs/desktops/gnome/misc/gnome-panel/wrapper.nix
···
+
{ stdenv
+
, lib
+
, buildEnv
+
, gnome-panel
+
, gnome-flashback
+
, xorg
+
, glib
+
, wrapGAppsHook
+
, panelModulePackages ? [ ]
+
}:
+
+
let
+
# We always want to find the built-in panel applets.
+
selectedPanelModulePackages = [ gnome-panel gnome-flashback ] ++ panelModulePackages;
+
+
panelModulesEnv = buildEnv {
+
name = "gnome-panel-modules-env";
+
paths = selectedPanelModulePackages;
+
pathsToLink = [ "/lib/gnome-panel/modules" ];
+
};
+
in
+
stdenv.mkDerivation {
+
pname = "${gnome-panel.pname}-with-modules";
+
inherit (gnome-panel) version;
+
+
nativeBuildInputs = [
+
glib
+
wrapGAppsHook
+
];
+
+
buildInputs = selectedPanelModulePackages ++
+
lib.forEach selectedPanelModulePackages (x: x.buildInputs or [ ]);
+
+
dontUnpack = true;
+
dontConfigure = true;
+
dontBuild = true;
+
+
preferLocalBuild = true;
+
allowSubstitutes = false;
+
+
installPhase = ''
+
runHook preInstall
+
+
mkdir -p $out
+
${xorg.lndir}/bin/lndir -silent ${gnome-panel} $out
+
+
rm -r $out/lib/gnome-panel/modules
+
${xorg.lndir}/bin/lndir -silent ${panelModulesEnv} $out
+
+
rm $out/share/applications/gnome-panel.desktop
+
+
substitute ${gnome-panel}/share/applications/gnome-panel.desktop \
+
$out/share/applications/gnome-panel.desktop --replace \
+
"Exec=${gnome-panel}/bin/gnome-panel" "Exec=$out/bin/gnome-panel"
+
+
runHook postInstall
+
'';
+
+
preFixup = ''
+
gappsWrapperArgs+=(
+
--set NIX_GNOME_PANEL_MODULESDIR "$out/lib/gnome-panel/modules"
+
)
+
'';
+
+
meta = gnome-panel.meta // { outputsToInstall = [ "out" ]; };
+
}