-
-
Notifications
You must be signed in to change notification settings - Fork 14.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #243476 from OPNA2608/init/lomiri/ayatana-messages
ayatana-indicators: init messaging indicator, module, test
- Loading branch information
Showing
5 changed files
with
278 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
{ config | ||
, pkgs | ||
, lib | ||
, ... | ||
}: | ||
|
||
let | ||
cfg = config.services.ayatana-indicators; | ||
in | ||
{ | ||
options.services.ayatana-indicators = { | ||
enable = lib.mkEnableOption (lib.mdDoc '' | ||
Ayatana Indicators, a continuation of Canonical's Application Indicators | ||
''); | ||
|
||
packages = lib.mkOption { | ||
type = lib.types.listOf lib.types.package; | ||
default = [ ]; | ||
example = lib.literalExpression "with pkgs; [ ayatana-indicator-messages ]"; | ||
description = lib.mdDoc '' | ||
List of packages containing Ayatana Indicator services | ||
that should be brought up by the SystemD "ayatana-indicators" user target. | ||
Packages specified here must have passthru.ayatana-indicators set correctly. | ||
If, how, and where these indicators are displayed will depend on your DE. | ||
''; | ||
}; | ||
}; | ||
|
||
config = lib.mkIf cfg.enable { | ||
environment = { | ||
systemPackages = cfg.packages; | ||
|
||
pathsToLink = [ | ||
"/share/ayatana" | ||
]; | ||
}; | ||
|
||
# libayatana-common's ayatana-indicators.target with explicit Wants & Before to bring up requested indicator services | ||
systemd.user.targets."ayatana-indicators" = | ||
let | ||
indicatorServices = lib.lists.flatten | ||
(map | ||
(pkg: | ||
(map (ind: "${ind}.service") pkg.passthru.ayatana-indicators)) | ||
cfg.packages); | ||
in | ||
{ | ||
description = "Target representing the lifecycle of the Ayatana Indicators. Each indicator should be bound to it in its individual service file"; | ||
partOf = [ "graphical-session.target" ]; | ||
wants = indicatorServices; | ||
before = indicatorServices; | ||
}; | ||
}; | ||
|
||
meta.maintainers = with lib.maintainers; [ OPNA2608 ]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
import ./make-test-python.nix ({ pkgs, lib, ... }: let | ||
user = "alice"; | ||
in { | ||
name = "ayatana-indicators"; | ||
|
||
meta = { | ||
maintainers = with lib.maintainers; [ OPNA2608 ]; | ||
}; | ||
|
||
nodes.machine = { config, ... }: { | ||
imports = [ | ||
./common/auto.nix | ||
./common/user-account.nix | ||
]; | ||
|
||
test-support.displayManager.auto = { | ||
enable = true; | ||
inherit user; | ||
}; | ||
|
||
services.xserver = { | ||
enable = true; | ||
desktopManager.mate.enable = true; | ||
displayManager.defaultSession = lib.mkForce "mate"; | ||
}; | ||
|
||
services.ayatana-indicators = { | ||
enable = true; | ||
packages = with pkgs; [ | ||
ayatana-indicator-messages | ||
]; | ||
}; | ||
|
||
# Services needed by some indicators | ||
services.accounts-daemon.enable = true; # messages | ||
}; | ||
|
||
# TODO session indicator starts up in a semi-broken state, but works fine after a restart. maybe being started before graphical session is truly up & ready? | ||
testScript = { nodes, ... }: let | ||
runCommandPerIndicatorService = command: lib.strings.concatMapStringsSep "\n" command nodes.machine.systemd.user.targets."ayatana-indicators".wants; | ||
in '' | ||
start_all() | ||
machine.wait_for_x() | ||
# Desktop environment should reach graphical-session.target | ||
machine.wait_for_unit("graphical-session.target", "${user}") | ||
# MATE relies on XDG autostart to bring up the indicators. | ||
# Not sure *when* XDG autostart fires them up, and awaiting pgrep success seems to misbehave? | ||
machine.sleep(10) | ||
# Now check if all indicators were brought up successfully, and kill them for later | ||
'' + (runCommandPerIndicatorService (service: let serviceExec = builtins.replaceStrings [ "." ] [ "-" ] service; in '' | ||
machine.succeed("pgrep -f ${serviceExec}") | ||
machine.succeed("pkill -f ${serviceExec}") | ||
'')) + '' | ||
# Ayatana target is the preferred way of starting up indicators on SystemD session, the graphical session is responsible for starting this if it supports them. | ||
# Mate currently doesn't do this, so start it manually for checking (https://github.com/mate-desktop/mate-indicator-applet/issues/63) | ||
machine.systemctl("start ayatana-indicators.target", "${user}") | ||
machine.wait_for_unit("ayatana-indicators.target", "${user}") | ||
# Let all indicator services do their startups, potential post-launch crash & restart cycles so we can properly check for failures | ||
# Not sure if there's a better way of awaiting this without false-positive potential | ||
machine.sleep(10) | ||
# Now check if all indicator services were brought up successfully | ||
'' + runCommandPerIndicatorService (service: '' | ||
machine.wait_for_unit("${service}", "${user}") | ||
''); | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
{ stdenv | ||
, lib | ||
, fetchFromGitHub | ||
, gitUpdater | ||
, nixosTests | ||
, testers | ||
, accountsservice | ||
, cmake | ||
, dbus-test-runner | ||
, withDocumentation ? true | ||
, docbook_xsl | ||
, docbook_xml_dtd_45 | ||
, glib | ||
, gobject-introspection | ||
, gtest | ||
, gtk-doc | ||
, intltool | ||
, lomiri | ||
, pkg-config | ||
, python3 | ||
, systemd | ||
, vala | ||
, wrapGAppsHook | ||
}: | ||
|
||
stdenv.mkDerivation (finalAttrs: { | ||
pname = "ayatana-indicator-messages"; | ||
version = "23.10.0"; | ||
|
||
src = fetchFromGitHub { | ||
owner = "AyatanaIndicators"; | ||
repo = "ayatana-indicator-messages"; | ||
rev = finalAttrs.version; | ||
hash = "sha256-FBJeP5hOXJcOk04cRJpw+oN7L3w3meDX3ivLmFWkhVI="; | ||
}; | ||
|
||
outputs = [ | ||
"out" | ||
"dev" | ||
] ++ lib.optionals withDocumentation [ | ||
"devdoc" | ||
]; | ||
|
||
postPatch = '' | ||
# Uses pkg_get_variable, cannot substitute prefix with that | ||
substituteInPlace data/CMakeLists.txt \ | ||
--replace "\''${SYSTEMD_USER_DIR}" "$out/lib/systemd/user" | ||
# Bad concatenation | ||
substituteInPlace libmessaging-menu/messaging-menu.pc.in \ | ||
--replace "\''${exec_prefix}/@CMAKE_INSTALL_LIBDIR@" '@CMAKE_INSTALL_FULL_LIBDIR@' \ | ||
--replace "\''${prefix}/@CMAKE_INSTALL_INCLUDEDIR@" '@CMAKE_INSTALL_FULL_INCLUDEDIR@' | ||
'' + lib.optionalString (!withDocumentation) '' | ||
sed -i CMakeLists.txt \ | ||
'/add_subdirectory(doc)/d' | ||
''; | ||
|
||
strictDeps = true; | ||
|
||
nativeBuildInputs = [ | ||
cmake | ||
glib # For glib-compile-schemas | ||
intltool | ||
pkg-config | ||
vala | ||
wrapGAppsHook | ||
] ++ lib.optionals withDocumentation [ | ||
docbook_xsl | ||
docbook_xml_dtd_45 | ||
gtk-doc | ||
]; | ||
|
||
buildInputs = [ | ||
accountsservice | ||
lomiri.cmake-extras | ||
glib | ||
gobject-introspection | ||
systemd | ||
]; | ||
|
||
nativeCheckInputs = [ | ||
(python3.withPackages (ps: with ps; [ | ||
pygobject3 | ||
python-dbusmock | ||
])) | ||
]; | ||
|
||
checkInputs = [ | ||
dbus-test-runner | ||
gtest | ||
]; | ||
|
||
cmakeFlags = [ | ||
"-DENABLE_TESTS=${lib.boolToString finalAttrs.doCheck}" | ||
"-DGSETTINGS_LOCALINSTALL=ON" | ||
"-DGSETTINGS_COMPILE=ON" | ||
]; | ||
|
||
makeFlags = lib.optionals withDocumentation [ | ||
# gtk-doc doesn't call ld with the correct arguments | ||
# ld: ...: undefined reference to symbol 'strncpy@@GLIBC_2.2.5', 'qsort@@GLIBC_2.2.5' | ||
"LD=${stdenv.cc.targetPrefix}cc" | ||
]; | ||
|
||
doCheck = stdenv.buildPlatform.canExecute stdenv.hostPlatform; | ||
|
||
preCheck = '' | ||
# test-client imports gir, whose solib entry points to final store location | ||
install -Dm644 libmessaging-menu/libmessaging-menu.so.0.0.0 $out/lib/libmessaging-menu.so.0 | ||
''; | ||
|
||
postCheck = '' | ||
# remove the above solib-installation, let it be done properly | ||
rm -r $out | ||
''; | ||
|
||
preInstall = lib.optionalString withDocumentation '' | ||
# installing regenerates docs, generated files are created without write permissions, errors out while trying to overwrite them | ||
chmod +w doc/reference/html/* | ||
''; | ||
|
||
passthru = { | ||
ayatana-indicators = [ | ||
"ayatana-indicator-messages" | ||
]; | ||
tests = { | ||
pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage; | ||
vm = nixosTests.ayatana-indicators; | ||
}; | ||
updateScript = gitUpdater { }; | ||
}; | ||
|
||
meta = with lib; { | ||
description = "Ayatana Indicator Messages Applet"; | ||
longDescription = '' | ||
The -messages Ayatana System Indicator is the messages menu indicator for Unity7, MATE and Lomiri (optionally for | ||
others, e.g. XFCE, LXDE). | ||
''; | ||
homepage = "https://github.com/AyatanaIndicators/ayatana-indicator-messages"; | ||
license = licenses.gpl3Only; | ||
platforms = platforms.linux; | ||
maintainers = with maintainers; [ OPNA2608 ]; | ||
pkgConfigModules = [ | ||
"messaging-menu" | ||
]; | ||
}; | ||
}) |