rm old
@@ -1,57 +0,0 @@
|
||||
# https://github.com/NixOS/nixpkgs/issues/126590#issuecomment-3194531220
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
nixpkgs.overlays = lib.singleton (final: prev: {
|
||||
kdePackages =
|
||||
prev.kdePackages
|
||||
// {
|
||||
plasma-workspace = let
|
||||
# the package we want to override
|
||||
basePkg = prev.kdePackages.plasma-workspace;
|
||||
|
||||
# a helper package that merges all the XDG_DATA_DIRS into a single directory
|
||||
xdgdataPkg = pkgs.stdenv.mkDerivation {
|
||||
name = "${basePkg.name}-xdgdata";
|
||||
buildInputs = [basePkg];
|
||||
dontUnpack = true;
|
||||
dontFixup = true;
|
||||
dontWrapQtApps = true;
|
||||
installPhase = ''
|
||||
mkdir -p $out/share
|
||||
( IFS=:
|
||||
for DIR in $XDG_DATA_DIRS; do
|
||||
if [[ -d "$DIR" ]]; then
|
||||
cp -r $DIR/. $out/share/
|
||||
chmod -R u+w $out/share
|
||||
fi
|
||||
done
|
||||
)
|
||||
'';
|
||||
};
|
||||
|
||||
# undo the XDG_DATA_DIRS injection that is usually done in the qt wrapper
|
||||
# script and instead inject the path of the above helper package
|
||||
derivedPkg = basePkg.overrideAttrs {
|
||||
preFixup = ''
|
||||
for index in "''${!qtWrapperArgs[@]}"; do
|
||||
if [[ ''${qtWrapperArgs[$((index+0))]} == "--prefix" ]] && [[ ''${qtWrapperArgs[$((index+1))]} == "XDG_DATA_DIRS" ]]; then
|
||||
unset -v "qtWrapperArgs[$((index+0))]"
|
||||
unset -v "qtWrapperArgs[$((index+1))]"
|
||||
unset -v "qtWrapperArgs[$((index+2))]"
|
||||
unset -v "qtWrapperArgs[$((index+3))]"
|
||||
fi
|
||||
done
|
||||
qtWrapperArgs=("''${qtWrapperArgs[@]}")
|
||||
qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "${xdgdataPkg}/share")
|
||||
qtWrapperArgs+=(--prefix XDG_DATA_DIRS : "$out/share")
|
||||
'';
|
||||
};
|
||||
in
|
||||
derivedPkg;
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
isHM,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.nix-scripts;
|
||||
home-rebuild =
|
||||
pkgs.writeShellScriptBin ".home-rebuild"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
${pkgs.alejandra}/bin/alejandra . &>/dev/null
|
||||
${pkgs.git}/bin/git diff -U0
|
||||
echo "NixOS Rebuilding..."
|
||||
home-manager switch --flake ~/.hive -b backup --log-format internal-json |& ${pkgs.nix-output-monitor}/bin/nom --json
|
||||
gen=$(home-manager generations | head -n1 | ${pkgs.gawk}/bin/awk '{print "Gen" $5 " @ " $1 "-" $2}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "Home $gen by $by"
|
||||
popd
|
||||
'';
|
||||
rebuild =
|
||||
pkgs.writeShellScriptBin ".nixos-rebuild"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
${pkgs.alejandra}/bin/alejandra . &>/dev/null
|
||||
${pkgs.git}/bin/git diff -U0
|
||||
echo "NixOS Rebuilding..."
|
||||
${pkgs.nh}/bin/nh os switch ~/.hive
|
||||
gen=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | ${pkgs.gnugrep}/bin/grep current | ${pkgs.gawk}/bin/awk '{print "Gen" $1 " @ " $2 "-" $3}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "System $gen by $by"
|
||||
popd
|
||||
'';
|
||||
upgrade =
|
||||
pkgs.writeShellScriptBin ".nixos-upgrade"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
if [ -n "$(${pkgs.git}/bin/git status --porcelain)" ]; then
|
||||
echo ".hive is unclean!"
|
||||
exit 1
|
||||
fi
|
||||
branch_staging="staging-update"
|
||||
|
||||
if ${pkgs.git}/bin/git rev-parse --verify "$branch_staging" >/dev/null 2>&1; then
|
||||
echo "Using staging update branch."
|
||||
else
|
||||
echo "No staging update branch found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
${pkgs.git}/bin/git checkout "$branch_staging" flake.lock
|
||||
echo "Updating nix-flake..."
|
||||
nix flake update --flake .
|
||||
echo "NixOS Rebuilding..."
|
||||
${pkgs.nh}/bin/nh os switch ~/.hive
|
||||
gen=$(sudo nix-env --list-generations --profile /nix/var/nix/profiles/system | ${pkgs.gnugrep}/bin/grep current | ${pkgs.gawk}/bin/awk '{print "Gen" $1 " @ " $2 "-" $3}')
|
||||
by="$(${pkgs.coreutils-full}/bin/whoami)@$(${pkgs.nettools}/bin/hostname)"
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -am "Upgrade $gen by $by"
|
||||
${pkgs.git}/bin/git branch -D "$branch_staging"
|
||||
popd
|
||||
'';
|
||||
update =
|
||||
pkgs.writeShellScriptBin ".nixos-update"
|
||||
''
|
||||
set -e
|
||||
pushd ~/.hive/
|
||||
if [ -n "$(${pkgs.git}/bin/git status --porcelain)" ]; then
|
||||
echo ".hive is unclean!"
|
||||
exit 1
|
||||
fi
|
||||
branch_staging="staging-update"
|
||||
branch_current="$(${pkgs.git}/bin/git branch --show-current)"
|
||||
|
||||
if ${pkgs.git}/bin/git rev-parse --verify "$branch_staging" >/dev/null 2>&1; then
|
||||
echo "There is already a staging update branch."
|
||||
else
|
||||
echo "Creating a new staging update branch."
|
||||
${pkgs.git}/bin/git switch -c "$branch_staging"
|
||||
nix flake update --verbose --flake .
|
||||
${pkgs.git}/bin/git add flake.lock
|
||||
${pkgs.git}/bin/git commit --no-gpg-sign -m "staging update"
|
||||
${pkgs.git}/bin/git switch "$branch_current"
|
||||
fi
|
||||
|
||||
nix store --log-format internal-json -v diff-closures \
|
||||
'.?ref='"$branch_current"'#nixosConfigurations.'"$(${pkgs.hostname}/bin/hostname)"'.config.system.build.toplevel' \
|
||||
'.?ref='"$branch_staging"'#nixosConfigurations.'"$(${pkgs.hostname}/bin/hostname)"'.config.system.build.toplevel' \
|
||||
|& ${pkgs.nix-output-monitor}/bin/nom --json
|
||||
|
||||
popd
|
||||
'';
|
||||
in {
|
||||
options = {
|
||||
hive.nix-scripts.enable = lib.mkEnableOption "Enable the nix build/update scripts";
|
||||
};
|
||||
|
||||
config =
|
||||
lib.mkIf cfg.enable
|
||||
(
|
||||
if isHM
|
||||
then {
|
||||
home.packages = [
|
||||
home-rebuild
|
||||
];
|
||||
}
|
||||
else {
|
||||
environment.systemPackages = [
|
||||
rebuild
|
||||
upgrade
|
||||
update
|
||||
];
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
{
|
||||
isHM ? null,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
assertions = [
|
||||
{
|
||||
assertion = isHM != null;
|
||||
message = "The \"home-manager\" flag isHM is required.";
|
||||
}
|
||||
];
|
||||
imports =
|
||||
[
|
||||
# modules containing both system and home-manager configs
|
||||
./bin/nix-scripts.nix
|
||||
]
|
||||
++ lib.optionals (! isHM) [
|
||||
# pure system modules
|
||||
./desktop/de
|
||||
./desktop/dm
|
||||
./desktop/themes
|
||||
./hardware/bluetooth.nix
|
||||
./hardware/sound.nix
|
||||
./hardware/yubikey.nix
|
||||
./networking/wireguard
|
||||
./programs/creative.nix
|
||||
./programs/games.nix
|
||||
./programs/spotify-shortcuts.nix
|
||||
./programs/utils.nix
|
||||
./services/borg-server.nix
|
||||
./services/gitea-instance.nix
|
||||
./services/gotify-instance.nix
|
||||
./services/kdeconnect.nix
|
||||
./services/minecraft-server
|
||||
./services/nextcloud-instance.nix
|
||||
./services/virt-manager.nix
|
||||
]
|
||||
++ lib.optionals isHM [
|
||||
# pure home-manager modules
|
||||
./home/doom
|
||||
./home/firefox.nix
|
||||
./home/flameshot.nix
|
||||
./home/gotify.nix
|
||||
./home/hyprland
|
||||
./home/jj.nix
|
||||
./home/kdeconnect.nix
|
||||
./home/kitty
|
||||
./home/nextcloud
|
||||
./home/plasma.nix
|
||||
./home/ranger
|
||||
./home/ssh.nix
|
||||
./home/swaync
|
||||
./home/themes/layan.nix
|
||||
./home/waybar
|
||||
./home/wlogout
|
||||
./home/wofi
|
||||
./home/yubikey.nix
|
||||
./home/zsh
|
||||
];
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
{...}: {
|
||||
imports = [
|
||||
./hyprland.nix
|
||||
./kwallet.nix
|
||||
./plasma.nix
|
||||
];
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.hyprland;
|
||||
in {
|
||||
options.hive.hyprland = {
|
||||
enable = lib.mkEnableOption "enable hyprland desktop environment";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
services = {
|
||||
libinput.enable = true;
|
||||
dbus.enable = true;
|
||||
};
|
||||
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = with pkgs; [
|
||||
xdg-desktop-portal-wlr
|
||||
xdg-desktop-portal-hyprland
|
||||
kdePackages.xdg-desktop-portal-kde
|
||||
];
|
||||
};
|
||||
|
||||
environment.systemPackages = with pkgs; [spaceFM];
|
||||
|
||||
services.udisks2.enable = true;
|
||||
|
||||
programs.hyprland = {
|
||||
enable = true;
|
||||
withUWSM = true;
|
||||
xwayland.enable = true;
|
||||
};
|
||||
programs.hyprlock.enable = true;
|
||||
security.pam.services.hyprlock = {};
|
||||
};
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.plasma;
|
||||
in {
|
||||
options.hive.plasma = {
|
||||
enable = lib.mkEnableOption "Enable Plasma desktop environment with sddm";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.desktopManager.plasma6.enable = true;
|
||||
|
||||
xdg.portal = {
|
||||
enable = true;
|
||||
extraPortals = with pkgs; [
|
||||
kdePackages.xdg-desktop-portal-kde
|
||||
xdg-desktop-portal-gtk
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.displayManager;
|
||||
in {
|
||||
options.hive.displayManager = with lib; {
|
||||
name = mkOption {
|
||||
type = types.enum ["sddm" "gdm" "cosmic"];
|
||||
default = "sddm";
|
||||
description = "The display manager to use.";
|
||||
};
|
||||
autologin = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = "The autologin username or null for no autologin.";
|
||||
};
|
||||
};
|
||||
|
||||
imports = [
|
||||
./gdm.nix
|
||||
./sddm.nix
|
||||
];
|
||||
|
||||
config = {
|
||||
services.xserver.enable = true;
|
||||
services.xserver = {
|
||||
xkb.layout = "de";
|
||||
xkb.variant = "";
|
||||
xkb.options = "caps:ctrl_modifier";
|
||||
};
|
||||
services.displayManager.autoLogin.enable = cfg.autologin != null;
|
||||
services.displayManager.autoLogin.user = cfg.autologin;
|
||||
};
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.displayManager;
|
||||
in {
|
||||
config = lib.mkIf (cfg.name == "gdm") {
|
||||
services.xserver.displayManager.gdm = {
|
||||
enable = true;
|
||||
wayland = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.displayManager;
|
||||
in {
|
||||
config = lib.mkIf (cfg.name == "sddm") {
|
||||
services.displayManager.sddm = {
|
||||
enable = true;
|
||||
wayland.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{...}: {
|
||||
imports = [
|
||||
./layan.nix
|
||||
];
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.themes.layan;
|
||||
in {
|
||||
options.hive.themes.layan = {
|
||||
enable = lib.mkEnableOption "Layan theme configuration";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = [
|
||||
pkgs.hive.layan-qt6
|
||||
pkgs.kdePackages.qtstyleplugin-kvantum
|
||||
pkgs.unstable.layan-cursors
|
||||
pkgs.layan-gtk-theme
|
||||
pkgs.tela-circle-icon-theme
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
inputs,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.firefox;
|
||||
in {
|
||||
options.hive.firefox = {
|
||||
enable = lib.mkEnableOption "Enable Firefox";
|
||||
plasmaIntegration = lib.mkEnableOption "Enable Plasma Integration";
|
||||
passFF = lib.mkEnableOption "Enable PassFF";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.firefox = {
|
||||
enable = true;
|
||||
nativeMessagingHosts = lib.optional cfg.passFF pkgs.passff-host;
|
||||
|
||||
# Default profile
|
||||
profiles.jonas = {
|
||||
name = "Jonas";
|
||||
id = 0;
|
||||
isDefault = true;
|
||||
|
||||
# Search
|
||||
search = {
|
||||
default = "ddg";
|
||||
order = ["ddg" "google"];
|
||||
force = true;
|
||||
engines = {
|
||||
"Nix Packages" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://search.nixos.org/packages";
|
||||
params = [
|
||||
{
|
||||
name = "type";
|
||||
value = "packages";
|
||||
}
|
||||
{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
"Noogle" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://noogle.dev/q";
|
||||
params = [
|
||||
{
|
||||
name = "term";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
"cppreference" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://en.cppreference.com/mwiki/index.php";
|
||||
params = [
|
||||
{
|
||||
name = "title";
|
||||
value = "Special%3ASearch";
|
||||
}
|
||||
{
|
||||
name = "search";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
{
|
||||
name = "Go";
|
||||
value = "go";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# Extensions
|
||||
extensions.packages = with inputs.firefox-addons.packages."x86_64-linux"; ([
|
||||
ublock-origin
|
||||
violentmonkey
|
||||
]
|
||||
++ lib.optional cfg.plasmaIntegration plasma-integration
|
||||
++ lib.optional cfg.passFF passff);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.flameshot;
|
||||
in {
|
||||
options.hive.flameshot.enable = lib.mkEnableOption "Flameshot service.";
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.flameshot.enable = true;
|
||||
};
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.gotify;
|
||||
cli-config = {
|
||||
token = config.sops.placeholder.${cfg.cli.tokenSopsKey};
|
||||
inherit (cfg.cli) url defaultPriority;
|
||||
};
|
||||
daemon-config = {
|
||||
gotify =
|
||||
{
|
||||
inherit (cfg.daemon) url;
|
||||
token = config.sops.placeholder.${cfg.daemon.tokenSopsKey};
|
||||
auto_delete = cfg.daemon.autoDelete;
|
||||
min_priority = cfg.daemon.minPriority;
|
||||
}
|
||||
// lib.optionalAttrs (cfg.daemon.onMsgCommand != null) {
|
||||
on_msg_command = cfg.daemon.onMsgCommand;
|
||||
};
|
||||
};
|
||||
|
||||
valueToString = val:
|
||||
if (builtins.typeOf val == "string")
|
||||
then "\"${val}\""
|
||||
else
|
||||
(
|
||||
if (builtins.typeOf val == "int")
|
||||
then "${toString val}"
|
||||
else
|
||||
(
|
||||
if (builtins.typeOf val == "bool")
|
||||
then
|
||||
(
|
||||
if val
|
||||
then "true"
|
||||
else "false"
|
||||
)
|
||||
else (abort "Expected string int or bool, got ${builtins.typeOf val} with value ${toString val}")
|
||||
)
|
||||
);
|
||||
|
||||
toTOML = attrs:
|
||||
lib.concatStrings (
|
||||
lib.attrValues (
|
||||
lib.mapAttrs (
|
||||
name: config: ''
|
||||
[${name}]
|
||||
${lib.concatStringsSep "\n" (lib.attrValues (lib.mapAttrs (k: v: "${k} = ${valueToString v}") config))}
|
||||
''
|
||||
)
|
||||
attrs
|
||||
)
|
||||
);
|
||||
in {
|
||||
options.hive.gotify = {
|
||||
cli = {
|
||||
enable = lib.mkEnableOption "Enable Gotify cli tool";
|
||||
url = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
default = "https://${cfg.host}:${toString cfg.port}";
|
||||
example = "http://gotify.example.com";
|
||||
description = "The http url of the gotify server (for the cli tool)";
|
||||
};
|
||||
tokenSopsKey = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
description = "The sops key of the token secret";
|
||||
};
|
||||
defaultPriority = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 0;
|
||||
example = 3;
|
||||
description = "The default priority of the dispatched messages";
|
||||
};
|
||||
};
|
||||
daemon = {
|
||||
enable = lib.mkEnableOption "Enable the Gotify desktop notification daemon";
|
||||
url = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
default = "wss://${cfg.host}:${toString cfg.port}";
|
||||
example = "ws://gotify.example.com";
|
||||
description = "The websocket url of the gotify server (for the desktop tool)";
|
||||
};
|
||||
tokenSopsKey = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
description = "The sops key of the token secret";
|
||||
};
|
||||
autoDelete = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
example = true;
|
||||
description = "Delete messages that have been handled";
|
||||
};
|
||||
minPriority = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 0;
|
||||
example = 1;
|
||||
description = "Ignore messages with priority lower than given value";
|
||||
};
|
||||
onMsgCommand = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.singleLineStr;
|
||||
default = null;
|
||||
example = "/usr/bin/beep";
|
||||
description = '' A command to tun for each message with env vars
|
||||
GOTIFY_MSG_PRIORITY, GOTIFY_MSG_TITLE and GOTIFY_MSG_TEXTs
|
||||
If unset use the standard desktop notification passing
|
||||
'';
|
||||
};
|
||||
};
|
||||
host = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "example.com";
|
||||
description = "The hostname of the gotify server";
|
||||
};
|
||||
port = lib.mkOption {
|
||||
type = lib.types.int;
|
||||
default = 443;
|
||||
example = 443;
|
||||
description = "The port of the gotify server";
|
||||
};
|
||||
};
|
||||
|
||||
config = let
|
||||
cli = lib.mkIf cfg.cli.enable {
|
||||
home.packages = [pkgs.gotify-cli];
|
||||
sops.templates."gotify-cli-json" = {
|
||||
content = lib.generators.toJSON {} cli-config;
|
||||
path = "${config.xdg.configHome}/gotify/cli.json";
|
||||
};
|
||||
};
|
||||
daemon = lib.mkIf cfg.daemon.enable {
|
||||
systemd.user.services.gotify-desktop = {
|
||||
Unit = {
|
||||
Description = "Gotify Desktop notification service";
|
||||
After = ["sops-nix.service"]; # After the secrets have been rendered
|
||||
};
|
||||
Service = {
|
||||
ExecStart = "${pkgs.gotify-desktop}/bin/gotify-desktop";
|
||||
};
|
||||
Install = {
|
||||
WantedBy = ["multi-user.target"];
|
||||
};
|
||||
};
|
||||
sops.templates."gotify-daemon-toml" = {
|
||||
content = toTOML daemon-config;
|
||||
path = "${config.xdg.configHome}/gotify-desktop/config.toml";
|
||||
};
|
||||
};
|
||||
in
|
||||
lib.mkMerge [cli daemon];
|
||||
}
|
||||
@@ -1,362 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.hyprland;
|
||||
screenshot = pkgs.writeShellScriptBin "screenshot" ''
|
||||
region=0
|
||||
clip=0
|
||||
while [[ "$#" -gt 0 ]]; do
|
||||
case $1 in
|
||||
--region) region=1; ;;
|
||||
--clip) clip=1; ;;
|
||||
*) echo "Unknown parameter passed: $1"; exit 1 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ $region -eq 1 ]]; then
|
||||
if [[ $clip -eq 1 ]]; then
|
||||
${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.wl-clipboard}/bin/wl-copy
|
||||
else
|
||||
${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" ~/Pictures/Screenshots/$(${pkgs.coreutils}/bin/date +'%Y-%m-%d_%H-%M-%S').png
|
||||
fi
|
||||
else
|
||||
if [[ $clip -eq 1 ]]; then
|
||||
${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy
|
||||
else
|
||||
${pkgs.grim}/bin/grim ~/Pictures/Screenshots/$(${pkgs.coreutils}/bin/date +'%Y-%m-%d_%H-%M-%S').png
|
||||
fi
|
||||
fi
|
||||
'';
|
||||
in {
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.hypridle.settings = {
|
||||
general = {
|
||||
# lock_cmd = notify-send "lock!" # dbus/sysd lock command (loginctl lock-session)
|
||||
# unlock_cmd = notify-send "unlock!" # same as above, but unlock
|
||||
ignore_dbus_inhibit = "false"; # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam)
|
||||
lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances.
|
||||
before_sleep_cmd = "loginctl lock-session"; # lock before suspend.
|
||||
after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display.
|
||||
};
|
||||
|
||||
listener = [
|
||||
# Screenlock
|
||||
{
|
||||
timeout = 180; # in seconds
|
||||
on-timeout = "hyprlock"; # command to run when timeout has passed
|
||||
# on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired.
|
||||
}
|
||||
# Suspend
|
||||
{
|
||||
timeout = 360; # in seconds
|
||||
on-timeout = "systemctl suspend"; # command to run when timeout has passed
|
||||
# on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired.
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
programs.hyprlock = {
|
||||
enable = true;
|
||||
settings = {
|
||||
background = [
|
||||
{
|
||||
path = "screenshot"; # only png supported for now
|
||||
# color = $color1
|
||||
|
||||
# all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations
|
||||
blur_size = 4;
|
||||
blur_passes = 3; # 0 disables blurring
|
||||
noise = 0.0117;
|
||||
contrast = 1.3000; # Vibrant!!!
|
||||
brightness = 0.8000;
|
||||
vibrancy = 0.2100;
|
||||
vibrancy_darkness = 0.0;
|
||||
}
|
||||
];
|
||||
|
||||
# Hours
|
||||
label = [
|
||||
{
|
||||
text = ''cmd[update:1000] echo "<b><big> $(date +"%H") </big></b>"'';
|
||||
#color = $color6
|
||||
font_size = 112;
|
||||
# font_family = Geist Mono 10
|
||||
shadow_passes = 3;
|
||||
shadow_size = 4;
|
||||
|
||||
position = "0, 220";
|
||||
halign = "center";
|
||||
valign = "center";
|
||||
}
|
||||
{
|
||||
text = ''cmd[update:1000] echo "<b><big> $(date +"%M") </big></b>"'';
|
||||
# color = $color6
|
||||
font_size = 112;
|
||||
# font_family = Geist Mono 10
|
||||
shadow_passes = 3;
|
||||
shadow_size = 4;
|
||||
|
||||
position = "0, 80";
|
||||
halign = "center";
|
||||
valign = "center";
|
||||
}
|
||||
{
|
||||
text = ''cmd[update:18000000] echo "<b><big> "$(date +'%A')" </big></b>"'';
|
||||
# color = $color7
|
||||
font_size = 22;
|
||||
# font_family = JetBrainsMono Nerd Font 10
|
||||
|
||||
position = "0, -10";
|
||||
halign = "center";
|
||||
valign = "center";
|
||||
}
|
||||
{
|
||||
text = ''cmd[update:18000000] echo "<b> "$(${pkgs.coreutils-full}/bin/date +'%d %b')" </b>"'';
|
||||
# color = $color7
|
||||
font_size = 18;
|
||||
#font_family = JetBrainsMono Nerd Font 10
|
||||
|
||||
position = "0, -40";
|
||||
halign = "center";
|
||||
valign = "center";
|
||||
}
|
||||
{
|
||||
text = ''cmd[update:18000000] echo "<b>So ca. <big> $(${pkgs.curl}/bin/curl -s 'wttr.in?format=%t' | ${pkgs.coreutils-full}/bin/tr -d '+')</big> oder watt.</b>"'';
|
||||
#color = $color7
|
||||
font_size = 18;
|
||||
# font_family = Geist Mono 10
|
||||
|
||||
position = "0, 40";
|
||||
halign = "center";
|
||||
valign = "bottom";
|
||||
}
|
||||
];
|
||||
|
||||
input-field = [
|
||||
{
|
||||
size = "250, 50";
|
||||
outline_thickness = 3;
|
||||
|
||||
dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8
|
||||
dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0
|
||||
dots_center = true;
|
||||
dots_rouding = -1;
|
||||
|
||||
rounding = 22;
|
||||
# outer_color = $color0
|
||||
# inner_color = $color0
|
||||
# font_color = $color6
|
||||
fade_on_empty = true;
|
||||
placeholder_text = ''<i>Password...</i>''; # Text rendered in the input box when it's empty.
|
||||
|
||||
position = "0, 120";
|
||||
halign = "center";
|
||||
valign = "bottom";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
wayland.windowManager.hyprland = {
|
||||
settings = {
|
||||
exec-once = [
|
||||
"${pkgs.wpaperd}/bin/wpaperd &"
|
||||
];
|
||||
|
||||
"$mod" = "SUPER";
|
||||
bind =
|
||||
[
|
||||
"$mod, RETURN, exec, ${pkgs.kitty}/bin/kitty"
|
||||
"$mod, d, exec, ${pkgs.wofi}/bin/wofi --show drun"
|
||||
"$mod, h, movefocus, l"
|
||||
"$mod, j, movefocus, d"
|
||||
"$mod, k, movefocus, u"
|
||||
"$mod, l, movefocus, r"
|
||||
"$mod, LEFT, movefocus, l"
|
||||
"$mod, DOWN, movefocus, d"
|
||||
"$mod, UP, movefocus, u"
|
||||
"$mod, RIGHT, movefocus, r"
|
||||
"$mod SHIFT, h, movewindow, l"
|
||||
"$mod SHIFT, j, movewindow, d"
|
||||
"$mod SHIFT, k, movewindow, u"
|
||||
"$mod SHIFT, l, movewindow, r"
|
||||
"$mod SHIFT, LEFT, movewindow, l"
|
||||
"$mod SHIFT, DOWN, movewindow, d"
|
||||
"$mod SHIFT, UP, movewindow, u"
|
||||
|
||||
"$mod CTRL SHIFT, LEFT, moveactive, -10 0"
|
||||
"$mod CTRL SHIFT, DOWN, moveactive, 0 10"
|
||||
"$mod CTRL SHIFT, UP, moveactive, 0 -10"
|
||||
"$mod CTRL SHIFT, RIGHT, moveactive, 10 0"
|
||||
"$mod CTRL SHIFT, h, moveactive, -10 0"
|
||||
"$mod CTRL SHIFT, j, moveactive, 0 10"
|
||||
"$mod CTRL SHIFT, k, moveactive, 0 -10"
|
||||
"$mod CTRL SHIFT, l, moveactive, 10 0"
|
||||
"$mod SHIFT, q, killactive"
|
||||
"$mod CTRL, h, resizeactive, -5% 0%"
|
||||
"$mod CTRL, l, resizeactive, 5% 0%"
|
||||
"$mod CTRL, j, resizeactive, 0% -5%"
|
||||
"$mod CTRL, k, resizeactive, 0% 5%"
|
||||
"$mod, SPACE, togglefloating, active"
|
||||
"$mod SHIFT, SPACE, centerwindow"
|
||||
"$mod, f, fullscreen, 1"
|
||||
"$mod SHIFT, f, fullscreen, 0"
|
||||
"$mod CTRL, f, fullscreenstate, -1 2"
|
||||
"$mod SHIFT, s, pin"
|
||||
"$mod SHIFT, x, exec, ${pkgs.hyprland}/bin/hyprctl kill"
|
||||
", XF86AudioRaiseVolume, exec, ${pkgs.pulsemixer}/bin/pulsemixer --change-volume +5"
|
||||
", XF86AudioLowerVolume, exec, ${pkgs.pulsemixer}/bin/pulsemixer --change-volume -5"
|
||||
", XF86AudioMute, exec, ${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute"
|
||||
", XF86AudioMicMute, exec, ${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute --id 1"
|
||||
", XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl set +5%"
|
||||
", XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%-"
|
||||
"$mod, 9, exec, ${pkgs.hyprlock}/bin/hyprlock"
|
||||
"$mod, 0, exec, ${pkgs.wlogout}/bin/wlogout -b 5"
|
||||
"$mod, n, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t"
|
||||
", Print, exec, ${screenshot}/bin/screenshot"
|
||||
"CTRL, Print, exec, ${screenshot}/bin/screenshot --region"
|
||||
"SHIFT, Print, exec, ${screenshot}/bin/screenshot --clip"
|
||||
"CTRL SHIFT, Print, exec, ${screenshot}/bin/screenshot --region --clip"
|
||||
]
|
||||
++ (
|
||||
# workspaces
|
||||
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
|
||||
builtins.concatLists (builtins.genList (
|
||||
x: let
|
||||
ws = builtins.toString (x + 1);
|
||||
in [
|
||||
"$mod, ${ws}, workspace, ${ws}"
|
||||
"$mod SHIFT, ${ws}, movetoworkspace, ${ws}"
|
||||
"$mod CTRL, ${ws}, movetoworkspacesilent, ${ws}"
|
||||
]
|
||||
)
|
||||
8)
|
||||
);
|
||||
# See https://wiki.hyprland.org/Configuring/Monitors/
|
||||
monitor = ",preferred,auto,1";
|
||||
env = [
|
||||
"GDK_SCALE,1"
|
||||
"XCURSOR_SIZE,12"
|
||||
];
|
||||
|
||||
xwayland = {
|
||||
force_zero_scaling = true;
|
||||
};
|
||||
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/ for more
|
||||
|
||||
# Execute your favorite apps at launch
|
||||
# exec-once = waybar & hyprpaper & firefox
|
||||
|
||||
# Source a file (multi-file configs)
|
||||
# source = ~/.config/hypr/myColors.conf
|
||||
|
||||
# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
|
||||
input = {
|
||||
kb_layout = "de";
|
||||
kb_variant = "deadacute";
|
||||
kb_model = "";
|
||||
kb_options = "caps:ctrl_modifier";
|
||||
kb_rules = "";
|
||||
repeat_delay = 250;
|
||||
repeat_rate = 30;
|
||||
follow_mouse = 1;
|
||||
|
||||
touchpad = {
|
||||
natural_scroll = "yes";
|
||||
};
|
||||
|
||||
sensitivity = 0; # -1.0 - 1.0, 0 means no modification.
|
||||
};
|
||||
|
||||
general = {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
|
||||
gaps_in = 5;
|
||||
gaps_out = 10;
|
||||
border_size = 2;
|
||||
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
|
||||
"col.inactive_border" = "rgba(595959aa)";
|
||||
|
||||
layout = "dwindle";
|
||||
|
||||
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
|
||||
allow_tearing = false;
|
||||
};
|
||||
|
||||
layerrule = [
|
||||
# blur for wlogout
|
||||
"blur, logout_dialog"
|
||||
|
||||
# blur for swaync
|
||||
"blur, swaync-control-center"
|
||||
"blur, swaync-notification-window"
|
||||
"ignorezero, swaync-control-center"
|
||||
"ignorezero, swaync-notification-window"
|
||||
"ignorealpha 0.5, swaync-control-center"
|
||||
"ignorealpha 0.5, swaync-notification-window"
|
||||
];
|
||||
|
||||
decoration = {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
|
||||
rounding = 10;
|
||||
|
||||
blur = {
|
||||
enabled = true;
|
||||
size = 8;
|
||||
passes = 1;
|
||||
new_optimizations = true;
|
||||
};
|
||||
};
|
||||
|
||||
animations = {
|
||||
enabled = "yes";
|
||||
|
||||
# Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
|
||||
|
||||
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
|
||||
|
||||
animation = [
|
||||
"windows, 1, 7, myBezier"
|
||||
"windowsOut, 1, 7, default, popin 80%"
|
||||
"border, 1, 10, default"
|
||||
"borderangle, 1, 8, default"
|
||||
"fade, 1, 7, default"
|
||||
"workspaces, 1, 6, default"
|
||||
];
|
||||
};
|
||||
|
||||
dwindle = {
|
||||
# See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
|
||||
pseudotile = "yes"; # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
|
||||
preserve_split = "yes"; # you probably want this
|
||||
};
|
||||
|
||||
master = {
|
||||
# See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
|
||||
# new_is_master = true;
|
||||
};
|
||||
|
||||
ecosystem = {
|
||||
no_update_news = true;
|
||||
};
|
||||
|
||||
misc = {
|
||||
# See https://wiki.hyprland.org/Configuring/Variables/ for more
|
||||
force_default_wallpaper = 0; # Set to 0 to disable the anime mascot wallpapers
|
||||
};
|
||||
|
||||
# Example per-device config
|
||||
# See https://wiki.hyprland.org/Configuring/Keywords/#executing for more
|
||||
# "device:epic-mouse-v1" = {
|
||||
# sensitivity = -0.5;
|
||||
# };
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
{lib, ...}: {
|
||||
options.hive.hyprland = {
|
||||
enable = lib.mkEnableOption "Enable Hyprland configuration";
|
||||
};
|
||||
|
||||
imports = [
|
||||
./config.nix
|
||||
./hyprland.nix
|
||||
];
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.hyprland;
|
||||
in {
|
||||
config = lib.mkIf cfg.enable {
|
||||
wayland.windowManager.hyprland = {
|
||||
enable = true;
|
||||
systemd.enable = false;
|
||||
systemd.variables = ["--all"];
|
||||
xwayland.enable = true;
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
wl-clipboard
|
||||
];
|
||||
|
||||
services.hypridle.enable = true;
|
||||
|
||||
services.wpaperd = {
|
||||
enable = true;
|
||||
settings = {
|
||||
default = {
|
||||
path = ../../../static/wallpaper/stones.jpg;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.kdeconnect;
|
||||
in {
|
||||
options.hive.kdeconnect = {
|
||||
enable = lib.mkEnableOption "Enable KDE Connect";
|
||||
indicatorOnly = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Only enable the incicator service.
|
||||
'';
|
||||
};
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.kdeconnect.enable = ! cfg.indicatorOnly;
|
||||
services.kdeconnect.indicator = true;
|
||||
};
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.kitty;
|
||||
in {
|
||||
options.hive.kitty = {
|
||||
enable = lib.mkEnableOption "Enable kitty terminal";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.kitty = {
|
||||
enable = true;
|
||||
shellIntegration.enableZshIntegration = true;
|
||||
font = {
|
||||
package = pkgs.nerd-fonts.fira-code;
|
||||
name = "FiraCode Nerd Font";
|
||||
size = 12;
|
||||
};
|
||||
themeFile = "Molokai";
|
||||
settings = {
|
||||
background_opacity = "0.6";
|
||||
enable_audio_bell = false;
|
||||
confirm_os_window_close = 0;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.nextcloud;
|
||||
in {
|
||||
options.hive.nextcloud = {
|
||||
enable = lib.mkEnableOption "Enable Nextcloud client";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.nextcloud-client = {
|
||||
enable = true;
|
||||
startInBackground = true;
|
||||
package = pkgs.nextcloud-client;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,147 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.plasma;
|
||||
in {
|
||||
options.hive.plasma.enable = lib.mkEnableOption "Plasma configuration";
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# load hm-vars in x-session
|
||||
xsession.enable = true;
|
||||
|
||||
# symlink wallpapers
|
||||
home.file.".local/share/wallpaper" = {
|
||||
source = ../../static/wallpaper;
|
||||
recursive = true;
|
||||
};
|
||||
|
||||
# provide kvantum and nord theme
|
||||
home.packages = [
|
||||
pkgs.kdePackages.qtstyleplugin-kvantum
|
||||
pkgs.layan-kde
|
||||
pkgs.nordzy-cursor-theme
|
||||
pkgs.qt6ct
|
||||
pkgs.tela-circle-icon-theme
|
||||
];
|
||||
|
||||
programs.konsole = {
|
||||
enable = true;
|
||||
defaultProfile = "default";
|
||||
profiles = {
|
||||
default = {
|
||||
name = "default";
|
||||
colorScheme = "Layan";
|
||||
font = {
|
||||
name = "Fira Code";
|
||||
size = 10;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# use kvantum theme
|
||||
qt.enable = true;
|
||||
qt.style.name = "kvantum";
|
||||
home.sessionVariables = {
|
||||
QT_STYLE_OVERRIDE = "kvantum";
|
||||
};
|
||||
|
||||
# add nord like gtk theme
|
||||
gtk = {
|
||||
enable = true;
|
||||
cursorTheme = {
|
||||
package = pkgs.nordzy-cursor-theme;
|
||||
name = "Nordzy-cursors";
|
||||
};
|
||||
theme = {
|
||||
package = pkgs.nordic;
|
||||
name = "Nordic";
|
||||
};
|
||||
iconTheme = {
|
||||
package = pkgs.tela-circle-icon-theme;
|
||||
name = "Tela-circle-nord";
|
||||
};
|
||||
};
|
||||
|
||||
programs.plasma = {
|
||||
enable = true;
|
||||
|
||||
#
|
||||
# Some high-level settings:
|
||||
#
|
||||
workspace = {
|
||||
clickItemTo = "select";
|
||||
lookAndFeel = "com.github.vinceliuice.Layan";
|
||||
cursor = {
|
||||
theme = "Nordzy-cursors";
|
||||
size = 24;
|
||||
};
|
||||
iconTheme = "Tela-circle-nord";
|
||||
wallpaper = "/home/jonas/.local/share/wallpaper/nord.png";
|
||||
};
|
||||
|
||||
hotkeys.commands."launch-konsole" = {
|
||||
name = "Launch Konsole";
|
||||
key = "Meta+Return";
|
||||
command = "konsole";
|
||||
};
|
||||
|
||||
kwin = {
|
||||
edgeBarrier = 0; # Disables the edge-barriers introduced in plasma 6.1
|
||||
cornerBarrier = false;
|
||||
|
||||
scripts.polonium.enable = false;
|
||||
};
|
||||
|
||||
kscreenlocker = {
|
||||
lockOnResume = true;
|
||||
timeout = 10;
|
||||
};
|
||||
|
||||
#
|
||||
# Some mid-level settings:
|
||||
#
|
||||
shortcuts = {
|
||||
ksmserver = {
|
||||
"Lock Session" = ["Screensaver" "Meta+Ctrl+Alt+L"];
|
||||
};
|
||||
|
||||
kwin =
|
||||
{
|
||||
"Expose" = "Meta+,";
|
||||
"Switch Window Down" = "Meta+J";
|
||||
"Switch Window Left" = "Meta+H";
|
||||
"Switch Window Right" = "Meta+L";
|
||||
"Switch Window Up" = "Meta+K";
|
||||
"Window Quick Tile Bottom" = "Meta+Shift+J";
|
||||
"Window Quick Tile Left" = "Meta+Shift+H";
|
||||
"Window Quick Tile Right" = "Meta+Shift+L";
|
||||
"Window Quick Tile Top" = "Meta+Shift+K";
|
||||
"Kill Window" = "Meta+Alt+Q";
|
||||
"Window Close" = "Meta+Shift+Q";
|
||||
}
|
||||
// (
|
||||
with lib; let
|
||||
desktops = map toString (lists.range 1 8);
|
||||
in
|
||||
listToAttrs
|
||||
(map
|
||||
(i: {
|
||||
name = "Switch to Desktop ${i}";
|
||||
value = "Meta+${i}";
|
||||
})
|
||||
desktops)
|
||||
// listToAttrs (map
|
||||
(i: {
|
||||
name = "Window to Desktop ${i}";
|
||||
value = "Meta+Shift+${i}";
|
||||
})
|
||||
desktops)
|
||||
);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.ranger;
|
||||
in {
|
||||
options.hive.ranger = {
|
||||
enable = lib.mkEnableOption "Enable ranger";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.ranger = {
|
||||
enable = true;
|
||||
settings = {
|
||||
preview_images = true;
|
||||
preview_images_method =
|
||||
if config.programs.kitty.enable
|
||||
then "kitty"
|
||||
else "ueberzug";
|
||||
};
|
||||
extraConfig = lib.strings.concatStringsSep "\n" [
|
||||
"default_linemode devicons"
|
||||
];
|
||||
mappings = {
|
||||
f = "console fzf_filter%space";
|
||||
};
|
||||
plugins =
|
||||
[
|
||||
{
|
||||
name = "ranger_fzf_filter";
|
||||
src = builtins.fetchGit {
|
||||
url = "https://github.com/MuXiu1997/ranger-fzf-filter";
|
||||
rev = "bf16de2e4ace415b685ff7c58306d0c5146f9f43";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "ranger_archives";
|
||||
src = builtins.fetchGit {
|
||||
url = "https://github.com/maximtrp/ranger-archives";
|
||||
rev = "b4e136b24fdca7670e0c6105fb496e5df356ef25";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "ranger_devicons";
|
||||
src = builtins.fetchGit {
|
||||
url = "https://github.com/alexanderjeurissen/ranger_devicons";
|
||||
rev = "f227f212e14996fbb366f945ec3ecaf5dc5f44b0";
|
||||
};
|
||||
}
|
||||
]
|
||||
++ (
|
||||
if config.services.kdeconnect.enable
|
||||
then
|
||||
lib.lists.singleton
|
||||
{
|
||||
name = "ranger_kdeconnect.py";
|
||||
src =
|
||||
builtins.fetchGit {
|
||||
url = "https://github.com/bwconrad/ranger-kdeconnect";
|
||||
rev = "710c600bb894fed3e293f6518930c16a494dd154";
|
||||
}
|
||||
+ "/kdeconnect_send.py";
|
||||
}
|
||||
else []
|
||||
);
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.ssh;
|
||||
in {
|
||||
options.hive.ssh = {
|
||||
enable = lib.mkEnableOption "SSH keys and config";
|
||||
keys = lib.mkOption {
|
||||
type = lib.types.listOf (lib.types.str);
|
||||
default = [];
|
||||
description = ''
|
||||
A list of SSH key names. Each one results in a id_<name> file in .ssh
|
||||
'';
|
||||
};
|
||||
sopsFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to the sops file containing the SSH keys.
|
||||
Requires a config key. And for each private key names in <keys> an keys.<name> entry.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
sops.secrets =
|
||||
{
|
||||
"ssh/config" = {
|
||||
inherit (cfg) sopsFile;
|
||||
key = "config";
|
||||
path = "${config.home.homeDirectory}/.ssh/config";
|
||||
};
|
||||
}
|
||||
// builtins.listToAttrs (map (name: {
|
||||
name = "ssh/id_${name}";
|
||||
value = {
|
||||
inherit (cfg) sopsFile;
|
||||
key = "keys/${name}";
|
||||
path = "${config.home.homeDirectory}/.ssh/id_${name}";
|
||||
};
|
||||
})
|
||||
cfg.keys);
|
||||
};
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.swaync;
|
||||
in {
|
||||
options.hive.swaync = {
|
||||
enable = lib.mkEnableOption "Enable swaync";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
xdg.enable = true;
|
||||
xdg.configFile = {
|
||||
"swaync/themes" = {
|
||||
source = ./themes;
|
||||
};
|
||||
"swaync/icons" = {
|
||||
source = ./icons;
|
||||
recursive = true;
|
||||
};
|
||||
};
|
||||
services.swaync.enable = true;
|
||||
services.swaync.style = ''
|
||||
@import 'themes/nova-dark/notifications.css';
|
||||
@import 'themes/nova-dark/central_control.css';
|
||||
'';
|
||||
services.swaync.settings = {
|
||||
positionX = "right";
|
||||
positionY = "top";
|
||||
cssPriority = "user";
|
||||
|
||||
control-center-width = 380;
|
||||
control-center-height = 860;
|
||||
control-center-margin-top = 2;
|
||||
control-center-margin-bottom = 2;
|
||||
control-center-margin-right = 1;
|
||||
control-center-margin-left = 0;
|
||||
|
||||
notification-window-width = 400;
|
||||
notification-icon-size = 48;
|
||||
notification-body-image-height = 160;
|
||||
notification-body-image-width = 200;
|
||||
|
||||
timeout = 4;
|
||||
timeout-low = 2;
|
||||
timeout-critical = 6;
|
||||
|
||||
fit-to-screen = false;
|
||||
keyboard-shortcuts = true;
|
||||
image-visibility = "when-available";
|
||||
transition-time = 200;
|
||||
hide-on-clear = false;
|
||||
hide-on-action = false;
|
||||
script-fail-notify = true;
|
||||
scripts = {
|
||||
example-script = {
|
||||
exec = "echo 'Do something...'";
|
||||
urgency = "Normal";
|
||||
};
|
||||
};
|
||||
notification-visibility = {
|
||||
example-name = {
|
||||
state = "muted";
|
||||
urgency = "Low";
|
||||
app-name = "Spotify";
|
||||
};
|
||||
};
|
||||
widgets = [
|
||||
"label"
|
||||
"buttons-grid"
|
||||
"mpris"
|
||||
"title"
|
||||
"dnd"
|
||||
"notifications"
|
||||
];
|
||||
widget-config = {
|
||||
title = {
|
||||
text = "Notifications";
|
||||
clear-all-button = true;
|
||||
button-text = " ";
|
||||
};
|
||||
dnd = {
|
||||
text = "Do not disturb";
|
||||
};
|
||||
label = {
|
||||
max-lines = 1;
|
||||
text = " ";
|
||||
};
|
||||
mpris = {
|
||||
image-size = 96;
|
||||
image-radius = 12;
|
||||
};
|
||||
volume = {
|
||||
label = "";
|
||||
show-per-app = true;
|
||||
};
|
||||
buttons-grid = {
|
||||
actions = [
|
||||
{
|
||||
label = " ";
|
||||
command = "${pkgs.alsa-utils}/bin/amixer set Master toggle";
|
||||
}
|
||||
{
|
||||
label = "";
|
||||
command = "${pkgs.alsa-utils}/bin/amixer set Capture toggle";
|
||||
}
|
||||
{
|
||||
label = " ";
|
||||
command = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
|
||||
}
|
||||
{
|
||||
label = "";
|
||||
command = "${pkgs.blueman}/bin/blueman-manager";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 16 KiB |
@@ -1,258 +0,0 @@
|
||||
@define-color text @foreground;
|
||||
@define-color background-alt alpha(@color1, .4);
|
||||
@define-color selected @color6;
|
||||
@define-color hover alpha(@selected, .4);
|
||||
@define-color urgent @color2;
|
||||
|
||||
/* Temporary color defs */
|
||||
@define-color background rgb(0,10,20);
|
||||
@define-color background-alt rgb(0,20,30);
|
||||
@define-color selected rgb(0,30,130);
|
||||
|
||||
* {
|
||||
color: @text;
|
||||
|
||||
all: unset;
|
||||
font-size: 14px;
|
||||
/*font-family: "JetBrains Mono Nerd Font 10";*/
|
||||
transition: 200ms;
|
||||
|
||||
}
|
||||
|
||||
/* Avoid 'annoying' backgroud */
|
||||
.blank-window {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
/* CONTROL CENTER ------------------------------------------------------------------------ */
|
||||
|
||||
.control-center {
|
||||
background: alpha(@background, .55);
|
||||
border-radius: 24px;
|
||||
border: 1px solid @selected;
|
||||
box-shadow: 0 0 10px 0 rgba(0,0,0,.6);
|
||||
margin: 18px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
/* Notifications */
|
||||
.control-center .notification-row .notification-background,
|
||||
.control-center .notification-row .notification-background .notification.critical {
|
||||
background-color: @background-alt;
|
||||
border-radius: 16px;
|
||||
margin: 4px 0px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification.critical {
|
||||
color: @urgent;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification .notification-content {
|
||||
margin: 6px;
|
||||
padding: 8px 6px 2px 2px;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification > *:last-child > * {
|
||||
min-height: 3.4em;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action {
|
||||
background: alpha(@selected, .6);
|
||||
color: @text;
|
||||
border-radius: 12px;
|
||||
margin: 6px;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:hover {
|
||||
background: @selected;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:active {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.control-center .notification-row .notification-background .close-button {
|
||||
background: transparent;
|
||||
border-radius: 6px;
|
||||
color: @text;
|
||||
margin: 0px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .close-button:hover {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
.control-center .notification-row .notification-background .close-button:active {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
progressbar,
|
||||
progress,
|
||||
trough {
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
progressbar {
|
||||
background-color: rgba(255,255,255,.1);
|
||||
}
|
||||
|
||||
/* Notifications expanded-group */
|
||||
|
||||
.notification-group {
|
||||
margin: 2px 8px 2px 8px;
|
||||
|
||||
}
|
||||
.notification-group-headers {
|
||||
font-weight: bold;
|
||||
font-size: 1.25rem;
|
||||
color: @text;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.notification-group-icon {
|
||||
color: @text;
|
||||
}
|
||||
|
||||
.notification-group-collapse-button,
|
||||
.notification-group-close-all-button {
|
||||
background: transparent;
|
||||
color: @text;
|
||||
margin: 4px;
|
||||
border-radius: 6px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.notification-group-collapse-button:hover,
|
||||
.notification-group-close-all-button:hover {
|
||||
background: @hover;
|
||||
}
|
||||
|
||||
/* WIDGETS --------------------------------------------------------------------------- */
|
||||
|
||||
/* Notification clear button */
|
||||
.widget-title {
|
||||
font-size: 1.2em;
|
||||
margin: 6px;
|
||||
}
|
||||
|
||||
.widget-title button {
|
||||
background: @background-alt;
|
||||
border-radius: 6px;
|
||||
padding: 4px 16px;
|
||||
}
|
||||
|
||||
.widget-title button:hover {
|
||||
background-color: @hover;
|
||||
}
|
||||
|
||||
.widget-title button:active {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
/* Do not disturb */
|
||||
.widget-dnd {
|
||||
margin: 6px;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
.widget-dnd > switch {
|
||||
background: @background-alt;
|
||||
font-size: initial;
|
||||
border-radius: 8px;
|
||||
box-shadow: none;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.widget-dnd > switch:hover {
|
||||
background: @hover;
|
||||
}
|
||||
|
||||
.widget-dnd > switch:checked {
|
||||
background: @selected;
|
||||
}
|
||||
|
||||
.widget-dnd > switch:checked:hover {
|
||||
background: @hover;
|
||||
}
|
||||
|
||||
.widget-dnd > switch slider {
|
||||
background: @text;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
/* Buttons menu */
|
||||
.widget-buttons-grid {
|
||||
font-size: x-large;
|
||||
padding: 6px 2px;
|
||||
margin: 6px;
|
||||
border-radius: 12px;
|
||||
background: @background-alt;
|
||||
}
|
||||
|
||||
.widget-buttons-grid>flowbox>flowboxchild>button {
|
||||
margin: 4px 10px;
|
||||
padding: 6px 12px;
|
||||
background: transparent;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.widget-buttons-grid>flowbox>flowboxchild>button:hover {
|
||||
background: @hover;
|
||||
}
|
||||
|
||||
|
||||
/* Music player */
|
||||
.widget-mpris {
|
||||
background: @background-alt;
|
||||
border-radius: 16px;
|
||||
color: @text;
|
||||
margin: 20px 6px;
|
||||
}
|
||||
|
||||
/* NOTE: Background need *opacity 1* otherwise will turn into the album art blurred */
|
||||
.widget-mpris-player {
|
||||
background-color: @background-sec;
|
||||
border-radius: 22px;
|
||||
padding: 6px 14px;
|
||||
margin: 6px;
|
||||
}
|
||||
|
||||
.widget-mpris > box > button {
|
||||
color: @text;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.widget-mpris button {
|
||||
color: alpha(@text, .6);
|
||||
}
|
||||
|
||||
.widget-mpris button:hover {
|
||||
color: @text;
|
||||
}
|
||||
|
||||
.widget-mpris-album-art {
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
.widget-mpris-title {
|
||||
font-weight: 700;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.widget-mpris-subtitle {
|
||||
font-weight: 500;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
/* Volume */
|
||||
.widget-volume {
|
||||
background: @background-sec;
|
||||
color: @background;
|
||||
padding: 4px;
|
||||
margin: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
@define-color text @foreground;
|
||||
@define-color background-alt @color1;
|
||||
@define-color selected @color3;
|
||||
@define-color hover @color5;
|
||||
@define-color urgent @color2;
|
||||
/* Temporary color defs */
|
||||
@define-color background rgb(0,10,20);
|
||||
@define-color background-alt rgb(0,20,30);
|
||||
@define-color selected rgb(0,30,130);
|
||||
|
||||
* {
|
||||
|
||||
/*background-alt: @color1; Buttons background */
|
||||
/*selected: @color2; Button selected */
|
||||
/*hover: @color5; Hover button */
|
||||
/*urgent: @color6; Urgency critical */
|
||||
/*text-selected: @background; */
|
||||
|
||||
color: @text;
|
||||
|
||||
all: unset;
|
||||
font-size: 14px;
|
||||
font-family: "JetBrains Mono Nerd Font 10";
|
||||
transition: 200ms;
|
||||
|
||||
}
|
||||
|
||||
.notification-row {
|
||||
outline: none;
|
||||
margin: 0;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background {
|
||||
background: alpha(@background, .55);
|
||||
box-shadow: 0 0 8px 0 rgba(0,0,0,.6);
|
||||
border: 1px solid @selected;
|
||||
border-radius: 24px;
|
||||
margin: 16px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification {
|
||||
padding: 6px;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification.critical {
|
||||
border: 2px solid @urgent;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification .notification-content {
|
||||
margin: 14px;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * {
|
||||
min-height: 3.4em;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action {
|
||||
border-radius: 8px;
|
||||
background-color: @background-alt ;
|
||||
margin: 6px;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:hover {
|
||||
background-color: @hover;
|
||||
border: 1px solid @selected;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:active {
|
||||
background-color: @selected;
|
||||
color: @background;
|
||||
}
|
||||
|
||||
.image {
|
||||
margin: 10px 20px 10px 0px;
|
||||
}
|
||||
|
||||
.summary {
|
||||
font-weight: 800;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.body {
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .close-button {
|
||||
margin: 6px;
|
||||
padding: 2px;
|
||||
border-radius: 6px;
|
||||
background-color: transparent;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .close-button:hover {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
.floating-notifications.background .notification-row .notification-background .close-button:active {
|
||||
background-color: @selected;
|
||||
color: @background;
|
||||
}
|
||||
|
||||
.notification.critical progress {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
.notification.low progress,
|
||||
.notification.normal progress {
|
||||
background-color: @selected;
|
||||
}
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.themes.layan;
|
||||
in {
|
||||
options.hive.themes.layan = {
|
||||
enable = lib.mkEnableOption "Layan theme configuration";
|
||||
pkgsInHome = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = "Whether to install Layan theme packages in the user's home directory.";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
home.packages = lib.optionals cfg.pkgsInHome [
|
||||
pkgs.hive.layan-qt6
|
||||
pkgs.kdePackages.qtstyleplugin-kvantum
|
||||
pkgs.unstable.layan-cursors
|
||||
pkgs.layan-gtk-theme
|
||||
pkgs.tela-circle-icon-theme
|
||||
];
|
||||
|
||||
qt.enable = false;
|
||||
qt.style.name = "kvantum";
|
||||
qt.style.package = pkgs.kdePackages.qtstyleplugin-kvantum;
|
||||
qt.platformTheme.name = "gtk";
|
||||
systemd.user.settings.Manager.DefaultEnvironment = lib.mapAttrs (_: lib.mkDefault) {
|
||||
QT_STYLE_OVERRIDE = "kvantum";
|
||||
QT_QPA_PLATFORMTHEME = "gtk";
|
||||
};
|
||||
xdg.configFile."Kvantum/kvantum.kvconfig".text = lib.generators.toINI {} {
|
||||
General.theme = "LayanDark";
|
||||
};
|
||||
|
||||
# add nord like gtk theme
|
||||
gtk = {
|
||||
enable = true;
|
||||
cursorTheme = {
|
||||
package = pkgs.unstable.layan-cursors;
|
||||
name = "Layan-cursors";
|
||||
};
|
||||
theme = {
|
||||
package = pkgs.layan-gtk-theme;
|
||||
name = "Layan-Dark";
|
||||
};
|
||||
iconTheme = {
|
||||
package = pkgs.tela-circle-icon-theme;
|
||||
name = "Tela-circle-dark";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,266 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.waybar;
|
||||
in {
|
||||
options.hive.waybar = {
|
||||
enable = lib.mkEnableOption "Enable Waybar";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.waybar.enable = true;
|
||||
programs.waybar.systemd.enable = true;
|
||||
|
||||
services.blueman-applet.enable = true;
|
||||
services.network-manager-applet.enable = true;
|
||||
services.pasystray.enable = true;
|
||||
|
||||
# is already fixed on latest home-manager rev
|
||||
systemd.user.services = {
|
||||
blueman-applet.Unit.After = lib.mkForce ["graphical-session.target"];
|
||||
network-manager-applet.Unit.After = lib.mkForce ["graphical-session.target"];
|
||||
pasystray.Unit.After = lib.mkForce ["graphical-session.target"];
|
||||
waybar.Unit.After = lib.mkForce ["graphical-session.target"];
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
pulsemixer
|
||||
pavucontrol
|
||||
networkmanagerapplet
|
||||
];
|
||||
|
||||
programs.waybar = {
|
||||
settings.mainBar = {
|
||||
position = "top";
|
||||
layer = "top";
|
||||
height = 5;
|
||||
margin-top = 0;
|
||||
margin-bottom = 0;
|
||||
margin-left = 0;
|
||||
margin-right = 0;
|
||||
modules-left = [
|
||||
"custom/launcher"
|
||||
"hyprland/workspaces"
|
||||
];
|
||||
modules-center = [
|
||||
"hyprland/window"
|
||||
];
|
||||
modules-right = [
|
||||
"clock"
|
||||
"cpu"
|
||||
"memory"
|
||||
"disk"
|
||||
"battery"
|
||||
"network"
|
||||
"tray"
|
||||
];
|
||||
clock = {
|
||||
calendar = {
|
||||
format = {today = "<span color='#b4befe'><b>{}</b></span>";};
|
||||
};
|
||||
format = " {:%H:%M}";
|
||||
tooltip = "true";
|
||||
tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
|
||||
format-alt = " {:%d/%m}";
|
||||
};
|
||||
"hyprland/workspaces" = {
|
||||
active-only = false;
|
||||
disable-scroll = true;
|
||||
format = "{icon}";
|
||||
on-click = "activate";
|
||||
format-icons = {
|
||||
"1" = "1";
|
||||
"2" = "2";
|
||||
"3" = "3";
|
||||
"4" = "4";
|
||||
"5" = "5";
|
||||
"6" = "6";
|
||||
"7" = "7";
|
||||
"8" = "8";
|
||||
urgent = "";
|
||||
default = "";
|
||||
sort-by-number = true;
|
||||
};
|
||||
persistent-workspaces = {
|
||||
"1" = [];
|
||||
"2" = [];
|
||||
"3" = [];
|
||||
"4" = [];
|
||||
"5" = [];
|
||||
"6" = [];
|
||||
"7" = [];
|
||||
"8" = [];
|
||||
};
|
||||
};
|
||||
memory = {
|
||||
format = " {}%";
|
||||
format-alt = " {used} GiB"; #
|
||||
interval = 2;
|
||||
};
|
||||
cpu = {
|
||||
format = " {usage}%";
|
||||
format-alt = " {avg_frequency} GHz";
|
||||
interval = 2;
|
||||
};
|
||||
disk = {
|
||||
# path = "/";
|
||||
format = " {percentage_used}%";
|
||||
interval = 60;
|
||||
};
|
||||
network = {
|
||||
format-wifi = " {signalStrength}%";
|
||||
format-ethernet = " ";
|
||||
tooltip-format = "Connected to {essid} {ifname} via {gwaddr}";
|
||||
format-linked = "{ifname} (No IP)";
|
||||
format-disconnected = " ";
|
||||
};
|
||||
tray = {
|
||||
icon-size = 20;
|
||||
spacing = 8;
|
||||
};
|
||||
pulseaudio = {
|
||||
format = "{icon} {volume}%";
|
||||
format-muted = " {volume}%";
|
||||
format-icons = {
|
||||
default = [" "];
|
||||
};
|
||||
scroll-step = 5;
|
||||
on-click = "pamixer -t";
|
||||
};
|
||||
battery = {
|
||||
format = "{icon} {capacity}%";
|
||||
format-icons = [" " " " " " " " " "];
|
||||
format-charging = " {capacity}%";
|
||||
format-full = " {capacity}%";
|
||||
format-warning = " {capacity}%";
|
||||
interval = 5;
|
||||
states = {
|
||||
warning = 20;
|
||||
};
|
||||
format-time = "{H}h{M}m";
|
||||
tooltip = true;
|
||||
tooltip-format = "{time}";
|
||||
};
|
||||
"custom/launcher" = {
|
||||
format = "";
|
||||
on-click = "${pkgs.wofi}/bin/wofi --show drun";
|
||||
tooltip = "false";
|
||||
};
|
||||
};
|
||||
style = ''
|
||||
* {
|
||||
border: none;
|
||||
font-family: Font Awesome, Roboto, Arial, sans-serif;
|
||||
font-size: 13px;
|
||||
color: #ffffff;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
window {
|
||||
/*font-weight: bold;*/
|
||||
}
|
||||
window#waybar {
|
||||
border-style: none;
|
||||
border-width: 1px;
|
||||
border-color: #33ccff;
|
||||
background: rgba(0, 0, 0, 0);
|
||||
}
|
||||
/*-----module groups----*/
|
||||
.modules-right {
|
||||
background-color: rgba(0,43,51,0.85);
|
||||
margin: 2px 10px 2px 0;
|
||||
}
|
||||
.modules-left {
|
||||
margin: 2px 0 2px 5px;
|
||||
background-color: rgba(0,119,179,0.6);
|
||||
}
|
||||
/*-----modules indv----*/
|
||||
#workspaces button {
|
||||
padding: 1px 5px;
|
||||
background-color: transparent;
|
||||
}
|
||||
#workspaces button:hover {
|
||||
box-shadow: inherit;
|
||||
background-color: rgba(0,153,153,1);
|
||||
}
|
||||
#workspaces button.empty {
|
||||
color: rgba(0 ,40, 40, 40);
|
||||
}
|
||||
#workspaces button.active {
|
||||
background-color: rgba(0,43,51,0.85);
|
||||
}
|
||||
#window {
|
||||
border-style: solid;
|
||||
background-color: rgba(0,43,51,0.5);
|
||||
margin: 2px 5px;
|
||||
padding: 2px 5px;
|
||||
border-width: 1px;
|
||||
border-color: #33ccff;
|
||||
}
|
||||
#window.empty {
|
||||
border-style: none;
|
||||
background-color: transparent;
|
||||
}
|
||||
#custom-launcher {
|
||||
background-color: rgba(0,119,179,0.6);
|
||||
border-radius: 100px;
|
||||
margin: 5px 5px;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#battery,
|
||||
#cpu,
|
||||
#memory,
|
||||
#temperature,
|
||||
#network,
|
||||
#pulseaudio,
|
||||
#custom-media,
|
||||
#tray,
|
||||
#mode,
|
||||
#custom-power,
|
||||
#custom-menu,
|
||||
#idle_inhibitor {
|
||||
padding: 0 10px;
|
||||
}
|
||||
#mode {
|
||||
color: #cc3436;
|
||||
font-weight: bold;
|
||||
}
|
||||
#custom-power {
|
||||
background-color: rgba(0,119,179,0.6);
|
||||
border-radius: 100px;
|
||||
margin: 5px 5px;
|
||||
padding: 1px 1px 1px 6px;
|
||||
}
|
||||
/*-----Indicators----*/
|
||||
#idle_inhibitor.activated {
|
||||
color: #2dcc36;
|
||||
}
|
||||
#pulseaudio.muted {
|
||||
color: #cc3436;
|
||||
}
|
||||
#battery.charging {
|
||||
color: #2dcc36;
|
||||
}
|
||||
#battery.warning:not(.charging) {
|
||||
color: #e6e600;
|
||||
}
|
||||
#battery.critical:not(.charging) {
|
||||
color: #cc3436;
|
||||
}
|
||||
#temperature.critical {
|
||||
color: #cc3436;
|
||||
}
|
||||
/*-----Colors----*/
|
||||
/*
|
||||
*rgba(0,85,102,1),#005566 --> Indigo(dye)
|
||||
*rgba(0,43,51,1),#002B33 --> Dark Green
|
||||
*RGBA(0,153,153,1),#009999 --> PERSIAN GREEN
|
||||
*
|
||||
*/
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wlogout;
|
||||
in {
|
||||
options.hive.wlogout = {
|
||||
enable = lib.mkEnableOption "Enable Wlogout";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.wlogout.enable = true;
|
||||
programs.wlogout.layout = [
|
||||
{
|
||||
label = "shutdown";
|
||||
action = "systemctl poweroff";
|
||||
text = "Shutdown";
|
||||
keybind = "s";
|
||||
}
|
||||
{
|
||||
label = "reboot";
|
||||
action = "systemctl reboot";
|
||||
text = "Reboot";
|
||||
keybind = "r";
|
||||
}
|
||||
{
|
||||
label = "logout";
|
||||
action = "loginctl kill-session $XDG_SESSION_ID";
|
||||
text = "Logout";
|
||||
keybind = "e";
|
||||
}
|
||||
{
|
||||
label = "hibernate";
|
||||
action = "hyprlock --immediate & (sleep 1; systemctl hibernate -i)";
|
||||
text = "Hibernate";
|
||||
keybind = "h";
|
||||
}
|
||||
{
|
||||
label = "lock";
|
||||
action = "hyprlock";
|
||||
text = "Lock";
|
||||
keybind = "l";
|
||||
}
|
||||
];
|
||||
programs.wlogout.style = builtins.readFile ./style.css;
|
||||
xdg.enable = true;
|
||||
xdg.configFile = {
|
||||
"wlogout/icons/hibernate.png" = {
|
||||
source = ./icons/hibernate.png;
|
||||
};
|
||||
"wlogout/icons/lock.png" = {
|
||||
source = ./icons/lock.png;
|
||||
};
|
||||
"wlogout/icons/logout.png" = {
|
||||
source = ./icons/logout.png;
|
||||
};
|
||||
"wlogout/icons/power.png" = {
|
||||
source = ./icons/power.png;
|
||||
};
|
||||
"wlogout/icons/restart.png" = {
|
||||
source = ./icons/restart.png;
|
||||
};
|
||||
"wlogout/icons/hibernate-hover.png" = {
|
||||
source = ./icons/hibernate-hover.png;
|
||||
};
|
||||
"wlogout/icons/lock-hover.png" = {
|
||||
source = ./icons/lock-hover.png;
|
||||
};
|
||||
"wlogout/icons/logout-hover.png" = {
|
||||
source = ./icons/logout-hover.png;
|
||||
};
|
||||
"wlogout/icons/power-hover.png" = {
|
||||
source = ./icons/power-hover.png;
|
||||
};
|
||||
"wlogout/icons/restart-hover.png" = {
|
||||
source = ./icons/restart-hover.png;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 9.9 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 9.8 KiB |
@@ -1,80 +0,0 @@
|
||||
/* ----------- 💫 https://github.com/JaKooLit 💫 -------- */
|
||||
/* pywal-wlogout */
|
||||
|
||||
/* Importing pywal colors */
|
||||
|
||||
/*
|
||||
@import '../../.cache/wal/colors-waybar.css';
|
||||
*/
|
||||
|
||||
window {
|
||||
font-family: Fira Code Medium;
|
||||
font-size: 16pt;
|
||||
/* color: @foreground; */
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
background-color: rgba(24, 27, 32, 0.2);
|
||||
|
||||
}
|
||||
|
||||
button {
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 20%;
|
||||
background-color: transparent;
|
||||
animation: gradient_f 20s ease-in infinite;
|
||||
transition: all 0.3s ease-in;
|
||||
box-shadow: 0 0 10px 2px transparent;
|
||||
border-radius: 36px;
|
||||
border-style: none;
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
button:focus {
|
||||
box-shadow: none;
|
||||
background-size : 20%;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-size: 50%;
|
||||
box-shadow: 0 0 10px 3px rgba(0,0,0,.4);
|
||||
/* background-color: @color6;*/
|
||||
background-color: rgba(24, 27, 32, 0);
|
||||
color: transparent;
|
||||
transition: all 0.3s cubic-bezier(.55, 0.0, .28, 1.682), box-shadow 0.5s ease-in;
|
||||
}
|
||||
|
||||
#shutdown {
|
||||
background-image: image(url("./icons/power.png"));
|
||||
}
|
||||
#shutdown:hover {
|
||||
background-image: image(url("./icons/power-hover.png"));
|
||||
}
|
||||
|
||||
#logout {
|
||||
background-image: image(url("./icons/logout.png"));
|
||||
|
||||
}
|
||||
#logout:hover {
|
||||
background-image: image(url("./icons/logout-hover.png"));
|
||||
}
|
||||
|
||||
#reboot {
|
||||
background-image: image(url("./icons/restart.png"));
|
||||
}
|
||||
#reboot:hover {
|
||||
background-image: image(url("./icons/restart-hover.png"));
|
||||
}
|
||||
|
||||
#lock {
|
||||
background-image: image(url("./icons/lock.png"));
|
||||
}
|
||||
#lock:hover {
|
||||
background-image: image(url("./icons/lock-hover.png"));
|
||||
}
|
||||
|
||||
#hibernate {
|
||||
background-image: image(url("./icons/hibernate.png"));
|
||||
}
|
||||
#hibernate:hover {
|
||||
background-image: image(url("./icons/hibernate-hover.png"));
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.wofi;
|
||||
in {
|
||||
options.hive.wofi = {
|
||||
enable = lib.mkEnableOption "Enable Wofi";
|
||||
};
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.wofi.enable = true;
|
||||
programs.wofi.settings = {
|
||||
location = "center";
|
||||
allow_images = true;
|
||||
allow_markup = true;
|
||||
key_expand = "Tab";
|
||||
key_up = "Ctrl-k";
|
||||
key_down = "Ctrl-j";
|
||||
key_left = "Ctrl-h";
|
||||
key_right = "Ctrl-l";
|
||||
insensitive = true;
|
||||
};
|
||||
|
||||
programs.wofi.style = ''
|
||||
#window {
|
||||
border-radius: 15px;
|
||||
border-color: #33ccff;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background-color: rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
||||
#input {
|
||||
margin: 5px;
|
||||
border-radius: 15px;
|
||||
border-color: #33ccff;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background: transparent;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#input {
|
||||
margin: 5px;
|
||||
border-radius: 15px;
|
||||
border-color: #33ccff;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background: transparent;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#img {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#inner-box {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
#outer-box {
|
||||
margin: 2px;
|
||||
padding: 10px;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
#scroll {
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
#text {
|
||||
padding: 4px;
|
||||
color: white;
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#entry {
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#entry:selected {
|
||||
border-radius: 15px;
|
||||
border-color: #33ccff;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
#expander {
|
||||
border-radius: 15px;
|
||||
border-color: #33ccff;
|
||||
border-width: 2px;
|
||||
border-style: solid;
|
||||
background: transparent;
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.yubikey;
|
||||
in {
|
||||
options.hive.yubikey = with lib; {
|
||||
enable = mkEnableOption "Yubikey support";
|
||||
pinentry = mkOption {
|
||||
type = types.enum ["qt" "gnome3"];
|
||||
default = "qt";
|
||||
description = "The pinentry flavour to use";
|
||||
};
|
||||
withCCID = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = "Use stand-alone CCID (instead of a running pcscd service)";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.gpg = {
|
||||
enable = true;
|
||||
mutableKeys = false;
|
||||
mutableTrust = false;
|
||||
publicKeys = [
|
||||
{
|
||||
source = ../../static/keys/my_pub.asc;
|
||||
trust = "ultimate";
|
||||
}
|
||||
];
|
||||
scdaemonSettings = lib.mkIf (!cfg.withCCID) {
|
||||
disable-ccid = true;
|
||||
};
|
||||
};
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
enableSshSupport = true;
|
||||
enableZshIntegration = true;
|
||||
pinentry =
|
||||
if cfg.pinentry == "gnome3"
|
||||
then {
|
||||
package = pkgs.pinentry-gnome3;
|
||||
program = "pinentry-gnome3";
|
||||
}
|
||||
else if cfg.pinentry == "qt"
|
||||
then {
|
||||
package = pkgs.pinentry-qt;
|
||||
program = "pinentry-qt";
|
||||
}
|
||||
else {};
|
||||
sshKeys = [config.programs.git.signing.key];
|
||||
};
|
||||
home.sessionVariables = {
|
||||
SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/gnupg/S.gpg-agent.ssh";
|
||||
};
|
||||
systemd.user.settings.Manager.DefaultEnvironment = {
|
||||
SSH_AUTH_SOCK = "/run/user/%U/gnupg/S.gpg-agent.ssh";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.zsh;
|
||||
omz_custom = "${config.home.homeDirectory}/.config/omz_custom";
|
||||
in {
|
||||
options.hive.zsh = {
|
||||
enable = lib.mkEnableOption "Enable Zsh";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
home.file."${omz_custom}" = {
|
||||
source = ./static/omz_custom;
|
||||
recursive = true;
|
||||
};
|
||||
|
||||
# direnv
|
||||
programs.direnv = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
|
||||
# fancy ls command
|
||||
programs.lsd = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# Zsh
|
||||
programs.zsh = {
|
||||
enable = true;
|
||||
enableCompletion = true;
|
||||
syntaxHighlighting.enable = true;
|
||||
|
||||
history.size = 10000;
|
||||
history.path = "${config.xdg.dataHome}/zsh/history";
|
||||
oh-my-zsh = {
|
||||
enable = true;
|
||||
plugins = [
|
||||
"docker"
|
||||
"docker-compose"
|
||||
"fzf"
|
||||
"git"
|
||||
"pass"
|
||||
"poetry"
|
||||
"python"
|
||||
"rust"
|
||||
];
|
||||
theme = "my_bureau";
|
||||
custom = omz_custom;
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
bat
|
||||
fzf
|
||||
git
|
||||
htop
|
||||
killall
|
||||
mmtui
|
||||
nh
|
||||
nix-output-monitor
|
||||
nix-search-cli
|
||||
nix-tree
|
||||
nixpkgs-fmt
|
||||
pass
|
||||
pay-respects
|
||||
ranger
|
||||
unzip
|
||||
vim
|
||||
w3m
|
||||
wget
|
||||
yt-dlp
|
||||
zip
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,154 +0,0 @@
|
||||
# oh-my-zsh Bureau Theme
|
||||
|
||||
### NVM
|
||||
|
||||
ZSH_THEME_NVM_PROMPT_PREFIX="%B⬡%b "
|
||||
ZSH_THEME_NVM_PROMPT_SUFFIX=""
|
||||
|
||||
### Git [±master ▾●]
|
||||
|
||||
ZSH_THEME_GIT_PROMPT_PREFIX="[%{$fg_bold[green]%}±%{$reset_color%}%{$fg_bold[white]%}"
|
||||
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}]"
|
||||
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}✓%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_AHEAD="%{$fg[cyan]%}▴%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[magenta]%}▾%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_STAGED="%{$fg_bold[green]%}●%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}"
|
||||
ZSH_THEME_GIT_PROMPT_STASHED="(%{$fg_bold[blue]%}✹%{$reset_color%})"
|
||||
|
||||
bureau_nix_shell () {
|
||||
if [ -n "$IN_NIX_SHELL" ]; then
|
||||
if [ -n "$out" ]; then
|
||||
local name=$(basename $(realpath -mL "$out/../../"))
|
||||
echo -n "[nix-shell@$name]"
|
||||
else
|
||||
echo -n "[nix-shell]"
|
||||
fi
|
||||
else
|
||||
echo -n ""
|
||||
fi
|
||||
}
|
||||
|
||||
bureau_nix_shell_prompt () {
|
||||
if [ -n "$IN_NIX_SHELL" ]; then
|
||||
echo -n "[nix]"
|
||||
else
|
||||
echo -n ""
|
||||
fi
|
||||
}
|
||||
|
||||
bureau_git_info () {
|
||||
local ref
|
||||
ref=$(command git symbolic-ref HEAD 2> /dev/null) || \
|
||||
ref=$(command git rev-parse --short HEAD 2> /dev/null) || return
|
||||
echo "${ref#refs/heads/}"
|
||||
}
|
||||
|
||||
bureau_git_status() {
|
||||
local result gitstatus
|
||||
gitstatus="$(command git status --porcelain -b 2>/dev/null)"
|
||||
|
||||
# check status of files
|
||||
local gitfiles="$(tail -n +2 <<< "$gitstatus")"
|
||||
if [[ -n "$gitfiles" ]]; then
|
||||
if [[ "$gitfiles" =~ $'(^|\n)[AMRD]. ' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_STAGED"
|
||||
fi
|
||||
if [[ "$gitfiles" =~ $'(^|\n).[MTD] ' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_UNSTAGED"
|
||||
fi
|
||||
if [[ "$gitfiles" =~ $'(^|\n)\\?\\? ' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_UNTRACKED"
|
||||
fi
|
||||
if [[ "$gitfiles" =~ $'(^|\n)UU ' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_UNMERGED"
|
||||
fi
|
||||
else
|
||||
result+="$ZSH_THEME_GIT_PROMPT_CLEAN"
|
||||
fi
|
||||
|
||||
# check status of local repository
|
||||
local gitbranch="$(head -n 1 <<< "$gitstatus")"
|
||||
if [[ "$gitbranch" =~ '^## .*ahead' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_AHEAD"
|
||||
fi
|
||||
if [[ "$gitbranch" =~ '^## .*behind' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_BEHIND"
|
||||
fi
|
||||
if [[ "$gitbranch" =~ '^## .*diverged' ]]; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_DIVERGED"
|
||||
fi
|
||||
|
||||
# check if there are stashed changes
|
||||
if command git rev-parse --verify refs/stash &> /dev/null; then
|
||||
result+="$ZSH_THEME_GIT_PROMPT_STASHED"
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
bureau_git_prompt() {
|
||||
# ignore non git folders and hidden repos (adapted from lib/git.zsh)
|
||||
if ! command git rev-parse --git-dir &> /dev/null \
|
||||
|| [[ "$(command git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# check git information
|
||||
local gitinfo=$(bureau_git_info)
|
||||
if [[ -z "$gitinfo" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
# quote % in git information
|
||||
local output="${gitinfo:gs/%/%%}"
|
||||
|
||||
# check git status
|
||||
local gitstatus=$(bureau_git_status)
|
||||
if [[ -n "$gitstatus" ]]; then
|
||||
output+=" $gitstatus"
|
||||
fi
|
||||
|
||||
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${output}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
|
||||
}
|
||||
|
||||
|
||||
_PATH="%{$fg_bold[white]%}%~%{$reset_color%}"
|
||||
|
||||
if [[ $EUID -eq 0 ]]; then
|
||||
_USERNAME="%{$fg_bold[red]%}%n"
|
||||
_LIBERTY="%{$fg[red]%}#"
|
||||
else
|
||||
_USERNAME="%{$fg_bold[white]%}%n"
|
||||
_LIBERTY="%{$fg[green]%}$"
|
||||
fi
|
||||
_USERNAME="$_USERNAME%{$reset_color%}@%m"
|
||||
_LIBERTY="$_LIBERTY%{$reset_color%}"
|
||||
|
||||
|
||||
get_space () {
|
||||
local STR=$1$2
|
||||
local zero='%([BSUbfksu]|([FB]|){*})'
|
||||
local LENGTH=${#${(S%%)STR//$~zero/}}
|
||||
local SPACES=$(( COLUMNS - LENGTH - ${ZLE_RPROMPT_INDENT:-1} ))
|
||||
|
||||
(( SPACES > 0 )) || return
|
||||
printf ' %.0s' {1..$SPACES}
|
||||
}
|
||||
|
||||
_1LEFT="$_USERNAME $_PATH"
|
||||
_1RIGHT="[%*]"
|
||||
|
||||
bureau_precmd () {
|
||||
_1SPACES=`get_space $_1LEFT $_1RIGHT`
|
||||
print
|
||||
print -rP "$_1LEFT$_1SPACES$_1RIGHT"
|
||||
}
|
||||
|
||||
setopt prompt_subst
|
||||
PROMPT='$(bureau_nix_shell_prompt)> $_LIBERTY '
|
||||
RPROMPT='$(nvm_prompt_info) $(bureau_nix_shell) $(bureau_git_prompt)'
|
||||
|
||||
autoload -U add-zsh-hook
|
||||
add-zsh-hook precmd bureau_precmd
|
||||
@@ -1,89 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.creative;
|
||||
avidemux-wayland-fix = pkgs.avidemux.overrideAttrs (prev: {
|
||||
installPhase =
|
||||
(prev.installPhase or "")
|
||||
+ ''
|
||||
wrapProgram $out/bin/avidemux3_qt5 \
|
||||
--add-flags "--platform" \
|
||||
--add-flags "xcb"
|
||||
'';
|
||||
});
|
||||
in {
|
||||
options.hive.programs.creative = {
|
||||
enable = lib.mkEnableOption "Enable creative programs (video/image editing, etc.)";
|
||||
image-management = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Enable image management tools.
|
||||
'';
|
||||
};
|
||||
image-editing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable image editing tools.
|
||||
'';
|
||||
};
|
||||
image-raw-processing = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable raw processing programs.
|
||||
'';
|
||||
};
|
||||
video-editing-light = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable light video editing tools.
|
||||
'';
|
||||
};
|
||||
video-editing-heavy = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable heavy video editing tools.
|
||||
'';
|
||||
};
|
||||
daws = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable DAWs (currently bitwig beta)
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = with pkgs;
|
||||
lib.optionals cfg.image-editing [gimp krita drawio]
|
||||
++ lib.optional cfg.image-management digikam
|
||||
++ lib.optionals cfg.image-raw-processing [
|
||||
enblend-enfuse
|
||||
hdrmerge
|
||||
hugin
|
||||
rawtherapee
|
||||
unstable.darktable
|
||||
unstable.rapidraw
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-light [
|
||||
avidemux-wayland-fix
|
||||
ffmpeg
|
||||
hive.bulk-transcode
|
||||
losslesscut-bin
|
||||
]
|
||||
++ lib.optionals cfg.video-editing-heavy [
|
||||
davinci-resolve
|
||||
kdePackages.kdenlive
|
||||
obs-studio
|
||||
]
|
||||
++ lib.optional cfg.daws bitwig-studio-latest;
|
||||
};
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.spotify-shortcuts;
|
||||
in {
|
||||
options.hive.programs.spotify-shortcuts = {
|
||||
enable = lib.mkEnableOption "Enable Spotify Shortcuts";
|
||||
clientIdSopsKey = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
description = "Spotify API Client ID sops secret name";
|
||||
};
|
||||
clientSecretSopsKey = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
description = "Spotify API Client Secret Path sops secret name";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = [pkgs.hive.spotify-shortcuts];
|
||||
environment.variables = {
|
||||
SPOTIFY_SHORTCUTS_CONFIG = config.sops.templates."spotify-shortcuts-client.json".path;
|
||||
};
|
||||
sops.templates."spotify-shortcuts-client.json" = {
|
||||
mode = "444";
|
||||
content = ''
|
||||
{
|
||||
"clientId": "${config.sops.placeholder.${cfg.clientIdSopsKey}}",
|
||||
"clientSecret": "${config.sops.placeholder.${cfg.clientSecretSopsKey}}"
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.programs.utils;
|
||||
in {
|
||||
options.hive.programs.utils = {
|
||||
enable = lib.mkEnableOption "Enable utilities";
|
||||
camera = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Camera utilities
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = lib.optionals cfg.camera [
|
||||
pkgs.cheese
|
||||
pkgs.obs-studio
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.borg-server;
|
||||
in {
|
||||
options.hive.borg-server = {
|
||||
enable = lib.mkEnableOption "Enable the borg server";
|
||||
package = lib.mkOption {
|
||||
type = lib.types.package;
|
||||
default = pkgs.borgbackup;
|
||||
example = "pkgs.borgbackup";
|
||||
description = "The borg package to use";
|
||||
};
|
||||
borg_user = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
example = "borg";
|
||||
default = "borg";
|
||||
description = "The user for the borg repository home.";
|
||||
};
|
||||
repositories_path = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
example = "/var/lib/borg-repositories";
|
||||
default = "/var/lib/borg-repositories";
|
||||
description = "The user for the borg repository home.";
|
||||
};
|
||||
repositories = lib.mkOption {
|
||||
type = lib.types.attrsOf (lib.types.submodule {
|
||||
options = {
|
||||
name = lib.mkOption {
|
||||
type = lib.types.nullOr (lib.types.strMatching "^[a-zA-Z0-9._-]+$");
|
||||
default = null;
|
||||
example = "borg-repo";
|
||||
description = "The name of the borg repository. If null, use key of attrset";
|
||||
};
|
||||
ssh_public_key = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "ssh-rsa AAAA...";
|
||||
description = "The path to the public key for the borg repository.";
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.${cfg.borg_user} = {
|
||||
isNormalUser = true;
|
||||
description = "Borg user";
|
||||
home = cfg.repositories_path;
|
||||
createHome = true;
|
||||
extraGroups = ["borg"];
|
||||
openssh.authorizedKeys.keys =
|
||||
lib.attrsets.mapAttrsToList
|
||||
(key: repo: "command=\"${cfg.package}/bin/borg serve --restrict-to-path=${cfg.repositories_path}/${lib.defaultTo key repo.name}\",restrict ${repo.ssh_public_key}")
|
||||
cfg.repositories;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,123 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.gitea-instance;
|
||||
in {
|
||||
options.hive.gitea-instance = {
|
||||
enable = lib.mkEnableOption "Enable the Gitea instance";
|
||||
|
||||
instanceFQDN = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "git.example.com";
|
||||
description = "Fully qualified domain name of the Gitea instance";
|
||||
};
|
||||
|
||||
databasePasswordFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
example = "/etc/gitea-db-pass.txt";
|
||||
description = "Path to the file containing the Gitea database password";
|
||||
};
|
||||
nativeRunner = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
description = "Install a gitea act_runner using the native nix store";
|
||||
default = false;
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# Gitea instance
|
||||
services.gitea = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
appName = "Git yourself some Tea!";
|
||||
database = {
|
||||
name = "gitea";
|
||||
type = "postgres";
|
||||
passwordFile = cfg.databasePasswordFile;
|
||||
};
|
||||
settings = {
|
||||
server.PROTOCOL = "http+unix";
|
||||
server.ROOT_URL = "https://${cfg.instanceFQDN}/";
|
||||
server.DOMAIN = cfg.instanceFQDN;
|
||||
service.DISABLE_REGISTRATION = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Fallback server with only 403
|
||||
services.nginx.virtualHosts.${config.networking.domain} = lib.mkDefault {
|
||||
default = true;
|
||||
locations."/".return = 403;
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
};
|
||||
|
||||
# Virtual host for gitea
|
||||
services.nginx.virtualHosts."${cfg.instanceFQDN}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://unix:/run/gitea/gitea.sock";
|
||||
};
|
||||
};
|
||||
|
||||
# Database setup
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
ensureDatabases = [config.services.gitea.user];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = config.services.gitea.database.user;
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
# act_runner
|
||||
services.gitea-actions-runner = lib.mkIf cfg.nativeRunner {
|
||||
instances.nixos-host = {
|
||||
enable = true;
|
||||
name = "nixos-host-runner";
|
||||
url = "https://${cfg.instanceFQDN}";
|
||||
tokenFile = "/var/lib/gitea-registration/nixos-host";
|
||||
|
||||
labels = ["nixos:host"];
|
||||
|
||||
settings = {
|
||||
runner = {
|
||||
capacity = 1;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
systemd.services.gitea-runner-nixos-host = lib.mkIf cfg.nativeRunner {
|
||||
after = ["gitea-runner-gen-token.service"];
|
||||
requires = ["gitea-runner-gen-token.service"];
|
||||
serviceConfig.Environment = ''
|
||||
PATH=/run/current-system/sw/bin:/usr/bin:/bin
|
||||
'';
|
||||
};
|
||||
systemd.services.gitea-runner-gen-token = lib.mkIf cfg.nativeRunner {
|
||||
wantedBy = ["multi-user.target"];
|
||||
after = ["gitea.service"];
|
||||
environment = {
|
||||
GITEA_CUSTOM = "/var/lib/gitea/custom";
|
||||
GITEA_WORK_DIR = "/var/lib/gitea";
|
||||
};
|
||||
script = ''
|
||||
set -euo pipefail
|
||||
token=$(${config.services.gitea.package}/bin/gitea actions generate-runner-token)
|
||||
echo "TOKEN=$token" > /var/lib/gitea-registration/nixos-host
|
||||
'';
|
||||
unitConfig.ConditionPathExists = ["!/var/lib/gitea-registration/nixos-host"];
|
||||
serviceConfig = {
|
||||
User = "gitea";
|
||||
Group = "gitea";
|
||||
StateDirectory = "gitea-registration";
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,131 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.gotify-instance;
|
||||
server-config = {
|
||||
server = {
|
||||
listenaddr = "localhost";
|
||||
port = 54545;
|
||||
ssl.enabled = false;
|
||||
ssl.redirecttohttps = false;
|
||||
cors.alloworigins = ["${cfg.instanceFQDN}"];
|
||||
stream.allowedorigins = ["${cfg.instanceFQDN}"];
|
||||
};
|
||||
database = {
|
||||
dialect = "postgres";
|
||||
connection = "host=/run/postgresql dbname=${cfg.user} user=${cfg.user}";
|
||||
};
|
||||
defaultuser = {
|
||||
name = "admin";
|
||||
pass = config.sops.placeholder.${cfg.adminPasswordSopsKey};
|
||||
};
|
||||
registration = false;
|
||||
};
|
||||
server-config-yaml = lib.generators.toYAML {} server-config;
|
||||
in {
|
||||
options.hive.gotify-instance = {
|
||||
enable = lib.mkEnableOption "Enable the Gotify instance";
|
||||
instanceFQDN = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
example = "gotify.example.com";
|
||||
description = "Fully qualified domain name of the Gotify instance";
|
||||
};
|
||||
user = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
default = "gotify";
|
||||
description = "The user to run the service as";
|
||||
};
|
||||
group = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
default = "gotify";
|
||||
description = "The group to run the service as";
|
||||
};
|
||||
adminPasswordSopsKey = lib.mkOption {
|
||||
type = lib.types.singleLineStr;
|
||||
description = "The SOPS key for the default admin user";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.gotify.enable = true;
|
||||
|
||||
# Config setup
|
||||
sops.templates."gotify-server-config.yml" = {
|
||||
owner = cfg.user;
|
||||
content = server-config-yaml;
|
||||
};
|
||||
environment.etc."gotify/config.yml".source = config.sops.templates."gotify-server-config.yml".path;
|
||||
|
||||
# User setup
|
||||
users.users = lib.mkIf (cfg.user == "gotify") {
|
||||
gotify = {
|
||||
description = "Gotify service";
|
||||
useDefaultShell = true;
|
||||
group = cfg.group;
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
|
||||
users.groups = lib.mkIf (cfg.group == "gotify") {
|
||||
gotify = {};
|
||||
};
|
||||
|
||||
# Configure gotify to run as the specified user (for postgres authentication)
|
||||
systemd.services.gotify-server = {
|
||||
serviceConfig = {
|
||||
DynamicUser = lib.mkForce false;
|
||||
User = cfg.user;
|
||||
RuntimeDirectory = "gotify";
|
||||
};
|
||||
};
|
||||
|
||||
# Fallback server with only 403
|
||||
services.nginx.virtualHosts.${config.networking.domain} = lib.mkDefault {
|
||||
default = true;
|
||||
locations."/".return = 403;
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
};
|
||||
|
||||
# Virtual host for gotify
|
||||
services.nginx.virtualHosts."${cfg.instanceFQDN}" = {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://${server-config.server.listenaddr}:${toString server-config.server.port}";
|
||||
extraConfig = ''
|
||||
# Ensuring it can use websockets
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto http;
|
||||
proxy_redirect http:// $scheme://;
|
||||
|
||||
# The proxy must preserve the host because gotify verifies the host with the origin
|
||||
# for WebSocket connections
|
||||
proxy_set_header Host $host;
|
||||
|
||||
# These sets the timeout so that the websocket can stay alive
|
||||
proxy_connect_timeout 1m;
|
||||
proxy_send_timeout 1m;
|
||||
proxy_read_timeout 1m;
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
# Database setup
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
ensureDatabases = [cfg.user];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = cfg.user;
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.services.kdeconnect;
|
||||
in {
|
||||
options.hive.services.kdeconnect = {
|
||||
enable = lib.mkEnableOption "KDE Connect system service (plasma6)";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.kdeconnect.enable = true;
|
||||
programs.kdeconnect.package = lib.mkForce pkgs.kdePackages.kdeconnect-kde;
|
||||
};
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.minecraft-server;
|
||||
|
||||
modpack = pkgs.callPackage ./loadCurseForge.nix {
|
||||
url = "https://mediafilez.forgecdn.net/files/7765/203/BMC3_Server_Pack_v44.zip";
|
||||
hash = "sha256-doqPzo9fhYM9ng/3RO6OPqhKA2ibfoaKx3Es7M0lpuU=";
|
||||
};
|
||||
|
||||
mcVersion = modpack.variables.MINECRAFT_VERSION;
|
||||
loader = lib.toLower modpack.variables.MODLOADER;
|
||||
loaderVersion = modpack.variables.MODLOADER_VERSION;
|
||||
serverVersion = lib.replaceStrings ["."] ["_"] "${loader}-${mcVersion}";
|
||||
in {
|
||||
options.hive.minecraft-server = {
|
||||
enable = lib.mkEnableOption "Enable BMC3 server";
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.minecraft-servers = {
|
||||
enable = true;
|
||||
eula = true;
|
||||
openFirewall = true;
|
||||
|
||||
servers.bmc3 = lib.optionalAttrs cfg.enable {
|
||||
enable = true;
|
||||
autoStart = false;
|
||||
package = pkgs."${loader}Servers".${serverVersion}.override {inherit loaderVersion;};
|
||||
jvmOpts = modpack.variables.JAVA_ARGS;
|
||||
symlinks = {
|
||||
"mods" = "${modpack.root}/mods";
|
||||
};
|
||||
serverProperties = {
|
||||
motd = "Woher kommt der Stein?";
|
||||
white-list = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
{
|
||||
url ? null,
|
||||
hash ? null,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
modpack = pkgs.fetchzip {
|
||||
inherit url hash;
|
||||
stripRoot = false;
|
||||
};
|
||||
|
||||
variablesStr = builtins.readFile "${modpack}/variables.txt";
|
||||
variableLines =
|
||||
builtins.filter (l: l != "" && (lib.strings.elemAt (lib.stringToCharacters l) 0) != "#")
|
||||
(lib.strings.splitString "\n" variablesStr);
|
||||
|
||||
stripQuotes = s:
|
||||
if builtins.match "^\".*\"$" s != null
|
||||
then builtins.substring 1 (builtins.stringLength s - 2) s
|
||||
else s;
|
||||
|
||||
parseLine = line: let
|
||||
parts = lib.strings.splitString "=" line;
|
||||
in {
|
||||
name = builtins.elemAt parts 0;
|
||||
value = stripQuotes (builtins.concatStringsSep "=" (builtins.tail parts));
|
||||
};
|
||||
|
||||
variables = builtins.listToAttrs (map parseLine variableLines);
|
||||
in {
|
||||
inherit variables;
|
||||
root = modpack;
|
||||
mods = "${modpack}/mods";
|
||||
config = "${modpack}/config";
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
{
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.hive.nextcloud-instance;
|
||||
in {
|
||||
options.hive.nextcloud-instance = {
|
||||
enable = lib.mkEnableOption "Enable the Nextcloud instance";
|
||||
|
||||
instanceFQDN = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
example = "nextcloud.example.com";
|
||||
description = "Fully qualified domain name of the Nextcloud instance";
|
||||
};
|
||||
|
||||
ssl = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = true;
|
||||
description = "Use SSL and auto-update certificates";
|
||||
};
|
||||
|
||||
adminPasswordFile = lib.mkOption {
|
||||
type = lib.types.path;
|
||||
example = "/etc/nc-admin-pass.txt";
|
||||
description = "Path to the file containing the Nextcloud admin password";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.nextcloud = {
|
||||
# Instance
|
||||
enable = true;
|
||||
package = pkgs.nextcloud33;
|
||||
hostName = cfg.instanceFQDN;
|
||||
https = cfg.ssl;
|
||||
configureRedis = true;
|
||||
|
||||
# DB
|
||||
config.dbtype = "pgsql";
|
||||
config.dbhost = "/run/postgresql";
|
||||
config.adminpassFile = cfg.adminPasswordFile;
|
||||
|
||||
#Mail
|
||||
settings = {
|
||||
mail_smtpmode = "sendmail";
|
||||
mail_sendmailmode = "pipe";
|
||||
};
|
||||
|
||||
# Apps
|
||||
extraAppsEnable = true;
|
||||
extraApps = {
|
||||
inherit
|
||||
(config.services.nextcloud.package.packages.apps)
|
||||
calendar
|
||||
contacts
|
||||
tasks
|
||||
;
|
||||
drop_account = pkgs.fetchNextcloudApp {
|
||||
sha256 = "sha256-J+bZVNIb/MokuTYQu8RBKdnZFakh180pa1pW5KHlC80=";
|
||||
url = "https://packages.framasoft.org/projects/nextcloud-apps/drop-account/drop_account-3.0.0.tar.gz";
|
||||
license = "agpl3Only";
|
||||
};
|
||||
};
|
||||
|
||||
# Raise Upload limit
|
||||
maxUploadSize = "20G";
|
||||
|
||||
# Preview settings (video may be a security risk)
|
||||
settings = {
|
||||
enable_previews = true;
|
||||
enabledPreviewProviders = [
|
||||
"OC\\Preview\\BMP"
|
||||
"OC\\Preview\\GIF"
|
||||
"OC\\Preview\\JPEG"
|
||||
"OC\\Preview\\Krita"
|
||||
"OC\\Preview\\MarkDown"
|
||||
"OC\\Preview\\MP3"
|
||||
"OC\\Preview\\OpenDocument"
|
||||
"OC\\Preview\\PNG"
|
||||
"OC\\Preview\\TXT"
|
||||
"OC\\Preview\\XBitmap"
|
||||
"OC\\Preview\\Movie"
|
||||
"OC\\Preview\\MP4"
|
||||
"OC\\Preview\\AVI"
|
||||
"OC\\Preview\\MKV"
|
||||
];
|
||||
preview_ffmpeg_path = "${pkgs.ffmpeg}/bin/ffmpeg";
|
||||
};
|
||||
};
|
||||
|
||||
# Fallback server with only 403
|
||||
services.nginx.virtualHosts.${config.networking.domain} = lib.mkDefault {
|
||||
default = true;
|
||||
locations."/".return = 403;
|
||||
forceSSL = cfg.ssl;
|
||||
enableACME = cfg.ssl;
|
||||
};
|
||||
|
||||
# Webserver setup with optional SSL
|
||||
services.nginx.virtualHosts.${cfg.instanceFQDN} =
|
||||
if cfg.ssl
|
||||
then {
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
}
|
||||
else {
|
||||
listen = [
|
||||
{
|
||||
addr = "0.0.0.0";
|
||||
port = 80;
|
||||
}
|
||||
];
|
||||
};
|
||||
security.acme = lib.mkIf cfg.ssl {
|
||||
acceptTerms = true;
|
||||
defaults.email = "jonas.roeger+acme@gmail.com";
|
||||
};
|
||||
networking.firewall.allowedTCPPorts = [80] ++ lib.optional cfg.ssl 443;
|
||||
|
||||
# DB setup
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
ensureDatabases = ["nextcloud"];
|
||||
ensureUsers = [
|
||||
{
|
||||
name = "nextcloud";
|
||||
ensureDBOwnership = true;
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
1
old/templates/cmake-c/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
build
|
||||
@@ -1,10 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
project(Hello
|
||||
DESCRIPTION "Hello World"
|
||||
LANGUAGES C
|
||||
)
|
||||
|
||||
add_executable(hello src/main.c)
|
||||
|
||||
install(TARGETS hello)
|
||||
@@ -1,56 +0,0 @@
|
||||
{
|
||||
description = "Cmake C Flake";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||
};
|
||||
|
||||
outputs = inputs @ {
|
||||
self,
|
||||
flake-parts,
|
||||
...
|
||||
}:
|
||||
flake-parts.lib.mkFlake {inherit inputs;} (
|
||||
top: {
|
||||
imports = [];
|
||||
|
||||
flake = {
|
||||
overlays.default = final: prev: {
|
||||
my-derivation = final.callPackage ./nix/derivation.nix {};
|
||||
};
|
||||
};
|
||||
|
||||
systems = [
|
||||
"x86_64-linux"
|
||||
];
|
||||
|
||||
perSystem = {
|
||||
self',
|
||||
pkgs,
|
||||
system,
|
||||
...
|
||||
}: {
|
||||
_module.args.pkgs = import inputs.nixpkgs {
|
||||
inherit system;
|
||||
overlays = [self.overlays.default];
|
||||
};
|
||||
|
||||
packages.default = pkgs.my-derivation;
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
packages = [
|
||||
pkgs.cmake-language-server
|
||||
pkgs.cmake-format
|
||||
pkgs.clang-tools
|
||||
pkgs.gdb
|
||||
];
|
||||
inputsFrom = [self'.packages.default];
|
||||
shellHook = ''
|
||||
export CMAKE_EXPORT_COMPILE_COMMANDS=ON
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
cmake,
|
||||
stdenv,
|
||||
...
|
||||
}:
|
||||
stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "my-derivation";
|
||||
version = "0.1.0";
|
||||
src = ../.;
|
||||
nativeBuildInputs = [cmake];
|
||||
buildInputs = [];
|
||||
|
||||
meta = {
|
||||
description = "Hello World Binary";
|
||||
mainProgram = "hello";
|
||||
};
|
||||
})
|
||||
@@ -1,6 +0,0 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
puts("Hello, Flake!");
|
||||
return 0;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# ^ make editor happy
|
||||
|
||||
#
|
||||
# Use https://direnv.net/ to automatically load the dev shell.
|
||||
#
|
||||
|
||||
if ! has nix_direnv_version || ! nix_direnv_version 3.0.4; then
|
||||
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/3.0.4/direnvrc" "sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4="
|
||||
fi
|
||||
|
||||
watch_file nix/**
|
||||
watch_file -- **/*.nix
|
||||
# Adding files to git includes them in a flake
|
||||
# But it is also a bit much reloading.
|
||||
# watch_file .git/index .git/HEAD
|
||||
use flake . --show-trace
|
||||
3
old/templates/rust/.gitignore
vendored
@@ -1,3 +0,0 @@
|
||||
.direnv/
|
||||
target/
|
||||
result/
|
||||
@@ -1,11 +0,0 @@
|
||||
[package]
|
||||
name = "hello"
|
||||
description = "A test rust binary"
|
||||
publish = false
|
||||
version = "0.1.0"
|
||||
|
||||
edition = "2021"
|
||||
|
||||
[[bin]]
|
||||
name = "hello"
|
||||
path = "src/main.rs"
|
||||
@@ -1,61 +0,0 @@
|
||||
{
|
||||
description = "Rust-Hello";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
rust-overlay = {
|
||||
url = "github:oxalica/rust-overlay";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
crate2nix = {
|
||||
url = "github:nix-community/crate2nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = inputs @ {
|
||||
crate2nix,
|
||||
flake-utils,
|
||||
nixpkgs,
|
||||
rust-overlay,
|
||||
...
|
||||
}:
|
||||
flake-utils.lib.eachDefaultSystem (
|
||||
system: let
|
||||
# Overlay pkgs with rust-bin
|
||||
overlays = [(import rust-overlay)];
|
||||
pkgs = import nixpkgs {
|
||||
inherit system overlays;
|
||||
};
|
||||
|
||||
# Use rust-bin to generate the toolchain from rust-toolchain.toml
|
||||
rust-toolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml;
|
||||
|
||||
buildRustCrateForPkgs = _:
|
||||
pkgs.buildRustCrate.override {
|
||||
rustc = rust-toolchain; # Use rustc from toolchain
|
||||
cargo = rust-toolchain; # Use cargo from toolchain
|
||||
};
|
||||
|
||||
# Cargo.nix for IFD
|
||||
generatedCargoNix = crate2nix.tools.${system}.generatedCargoNix {
|
||||
name = "rustnix";
|
||||
src = ./.;
|
||||
};
|
||||
|
||||
cargoNix = import generatedCargoNix {
|
||||
inherit pkgs buildRustCrateForPkgs;
|
||||
};
|
||||
in {
|
||||
packages = rec {
|
||||
hello = cargoNix.rootCrate.build;
|
||||
default = hello;
|
||||
};
|
||||
|
||||
devShell = pkgs.mkShell {
|
||||
buildInputs = [rust-toolchain];
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
[toolchain]
|
||||
channel = "1.85.0"
|
||||
components = [ "rustfmt", "rustc-dev", "rust-analyzer", "rust-src"]
|
||||
@@ -1,3 +0,0 @@
|
||||
fn main() {
|
||||
println!("{}", "Hello, world!");
|
||||
}
|
||||