nixos-config/modules/nixos/_private/workflows/horizontal-hunger/default.nix

189 lines
5.8 KiB
Nix

{ config, options, lib, pkgs, foodogsquaredLib, ... }:
let
workflowId = "one.foodogsquared.HorizontalHunger";
cfg = config.workflows.workflows.${workflowId};
sessionConfig = config.programs.gnome-session.sessions.${workflowId};
requiredPackages = with pkgs; [
# The window manager. We only put this here since it has some commands that
# are useful to be having.
cfg.package
# The application opener.
junction
];
workflowEnvironment = foodogsquaredLib.nixos.mkNixoslikeEnvironment config {
name = "${workflowId}-env";
paths = requiredPackages ++ cfg.extraApps;
};
in
{
options.workflows.enable = lib.mkOption {
type = with lib.types; listOf (enum [ workflowId ]);
};
options.workflows.workflows.${workflowId} = {
package = lib.mkOption {
type = lib.types.package;
description = ''
Derivation containing {program}`niri` executable which is the preferred
window manager for this workflow.
'';
default = pkgs.niri;
};
extraApps = lib.mkOption {
type = with lib.types; listOf package;
default = with pkgs; [
flowtime
dialect
blanket
];
description = ''
A list of extraneous applications to be included with the desktop
session.
'';
};
};
config = lib.mkIf (lib.elem workflowId config.workflows.enable) {
# Enable all of the core services.
hardware.bluetooth.enable = true;
programs.dconf.enable = true;
programs.xwayland.enable = true;
programs.gnupg.agent = {
enable = lib.mkDefault true;
pinentryPackage = pkgs.pinentry-gnome3;
};
security.polkit.enable = true;
services.colord.enable = lib.mkDefault true;
services.gnome.gnome-keyring.enable = lib.mkDefault true;
services.power-profiles-daemon.enable = true;
services.udisks2.enable = lib.mkDefault true;
services.upower.enable = config.powerManagement.enable;
services.libinput.enable = lib.mkDefault true;
# Configuring the preferred network manager.
networking.networkmanager.enable = true;
# Configuring the XDG desktop components. Take note all of these are
# required for the desktop widgets components to work since they rely on
# them.
xdg.mime.enable = true;
xdg.icons.enable = true;
# For now, the portal configuration doesn't work since Niri is now
# hardcoded to set the apprioriate envs for portal component. It is
# considered broken (or rather unused) for now.
xdg.portal =
lib.mkMerge [
{
enable = lib.mkDefault true;
extraPortals = [
pkgs.xdg-desktop-portal-gtk
];
# The option value is only a coerced `lib.type.str` so ehhh...
config.${workflowId}.default =
[ "gtk" ]
++ lib.optionals (config.services.gnome.gnome-keyring.enable) [ "gnome" ];
}
(lib.mkIf config.services.gnome.gnome-keyring.enable {
config.${workflowId} = {
"org.freedesktop.impl.portal.Secret" = "gnome-keyring";
};
})
];
# Install of the programs.
environment.systemPackages = requiredPackages ++ cfg.extraApps;
# Configuring the actual desktop session.
programs.gnome-session.sessions.${workflowId} = {
fullName = "Horizontal Hunger";
desktopNames = [ workflowId ];
systemd.targetUnit =
let
requiredComponents = [ "window-manager" ];
getId = lib.foldlAttrs (acc: _: v: acc ++ [ "${v.id}.target" ]) [ ];
in {
requires = getId (lib.filterAttrs (n: _: lib.elem n requiredComponents) sessionConfig.components);
wants = getId (lib.attrsets.removeAttrs sessionConfig.components requiredComponents);
};
components = {
window-manager = {
script = "${lib.getExe' cfg.package "niri"} --config /tmp/shared/modules/nixos/_private/workflows/horizontal-hunger/config/niri/config";
description = "Window manager";
systemd.serviceUnit = {
serviceConfig = {
Type = "notify";
NotifyAccess = "all";
OOMScoreAdjust = -1000;
};
unitConfig = {
OnFailure = [ "gnome-session-shutdown.target" ];
OnFailureJobMode = "replace-irreversibly";
};
startLimitBurst = 5;
startLimitIntervalSec = 10;
};
systemd.targetUnit = {
partOf = [ "gnome-session-initialized.target" ];
after = [ "gnome-session-initialized.target" ];
};
};
desktop-widgets = {
script = "${lib.getExe' pkgs.ags "ags"} --config /tmp/shared/modules/nixos/_private/workflows/horizontal-hunger/config/ags/config.js";
description = "Desktop widgets";
systemd.serviceUnit = {
serviceConfig = {
Type = "notify";
NotifyAccess = "all";
OOMScoreAdjust = -1000;
};
unitConfig = {
OnFailure = [ "gnome-session-shutdown.target" ];
OnFailureJobMode = "replace-irreversibly";
};
};
systemd.targetUnit = {
partOf = [ "gnome-session-initialized.target" ];
after = [ "gnome-session-initialized.target" ];
};
};
auth-agent = {
script = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
description = "Authentication agent";
systemd.serviceUnit = {
serviceConfig = {
Type = "notify";
NotifyAccess = "all";
OOMScoreAdjust = -500;
};
};
systemd.targetUnit = {
partOf = [ "graphical-session.target" "gnome-session.target" ];
};
};
};
};
};
}