Compare commits

1 Commits

Author SHA1 Message Date
22e21be60a feat(elcafe): add new server configuration 2025-11-05 05:01:58 +01:00
38 changed files with 5105 additions and 786 deletions

View File

@@ -132,6 +132,13 @@
inputs.sops-nix.nixosModules.sops
];
};
elcafe = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = [
./hosts/elcafe/configuration.nix
inputs.sops-nix.nixosModules.sops
];
};
gampo = nixpkgs.lib.nixosSystem {
inherit specialArgs;
modules = [

View File

@@ -0,0 +1,74 @@
{
inputs,
config,
...
}: {
imports = [
./hardware-configuration.nix
inputs.home-manager.nixosModules.default
../../system
];
sops.secrets = {
"elcafe/traefik/env".restartUnits = ["traefik.service"];
"elcafe/traefik/dynamic".restartUnits = ["traefik.service"];
};
mySystem = {
boot = {
kernel = {
hardened = true;
cpuVendor = "intel";
};
zfs = {
enable = true;
pools = ["tank"];
};
};
dev.docker = {
enable = true;
extraDaemonSettings.data-root = "/tank/docker/";
};
misc.keymap = "fr";
networking = {
hostname = "elcafe";
id = "501c7fb9";
};
packages.nix = {
gc.automatic = true;
trusted-users = [
"root"
"phundrak"
];
};
services = {
endlessh.enable = true;
plex = {
enable = true;
dataDir = "/tank/web/plex-config";
};
ssh = {
enable = true;
allowedUsers = ["phundrak"];
passwordAuthentication = false;
};
traefik = {
enable = true;
envFiles = [config.sops.secrets."elcafe/traefik/env".path];
dynConf = config.sops.secrets."elcafe/traefik/dynamic".path;
};
};
users = {
root.disablePassword = true;
phundrak.enable = true;
};
};
# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. Its perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "23.11"; # Did you read the comment?
}

View File

@@ -0,0 +1,42 @@
# Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead.
{
config,
lib,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
];
boot = {
initrd = {
availableKernelModules = ["ahci" "xhci_pci" "ehci_pci" "megaraid_sas" "usbhid" "usb_storage" "sd_mod" "sr_mod"];
kernelModules = [];
};
kernelModules = ["kvm-intel"];
extraModulePackages = [];
};
fileSystems."/" = {
device = "/dev/disk/by-uuid/d2e703f7-90e0-43e7-9872-ce036f201c4b";
fsType = "ext4";
};
swapDevices = [];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.eno1.useDHCP = lib.mkDefault true;
# networking.interfaces.eno2.useDHCP = lib.mkDefault true;
# networking.interfaces.eno3.useDHCP = lib.mkDefault true;
# networking.interfaces.eno4.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

View File

@@ -34,11 +34,9 @@
};
hardware = {
bluetooth.enable = true;
input = {
corne.allowHidAccess = true;
ibmTrackpoint.disable = true;
opentablet.enable = true;
};
corne.allowHidAccess = true;
ibmTrackpoint.disable = true;
opentablet.enable = true;
sound.enable = true;
};
misc.keymap = "fr-bepo";

View File

@@ -38,10 +38,8 @@
hardware = {
amdgpu.enable = true;
bluetooth.enable = true;
input = {
corne.allowHidAccess = true;
opentablet.enable = true;
};
corne.allowHidAccess = true;
opentablet.enable = true;
sound = {
enable = true;
jack = true;
@@ -92,11 +90,6 @@
mode = "0440";
};
services.udev.extraHwdb = ''
mouse:usb:047d:80a6:*
LIBINPUT_MIDDLE_EMULATION_ENABLED=1
'';
security = {
polkit.enable = true;
rtkit.enable = true;

View File

@@ -1,10 +1,14 @@
elcafe:
traefik:
env: ENC[AES256_GCM,data:Mfm4Wt/7UWrpWGGa/rmC1wY6QtI2G/a6cbZiNjZz1gOTrREehFBZxH5JJ9ZgsxCMSuh/XCQa/75cPg==,iv:nrtTmtdFfTrCYzxFHDVMuaDdoa8SDi+pn4kghP4r9xE=,tag:gjlv8ohv1aDx2PB1rwx6fQ==,type:str]
dynamic: ENC[AES256_GCM,data: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,iv:Ooq6tK6nMGuRFJ1ElGCJhOMQVyMNtGBSguQVFSm71fA=,tag:iJviKci+i3tif+sH8UxRZg==,type:str]
extraHosts: ENC[AES256_GCM,data:YRHvHINgAQv4z+8awMzHY1uZS/K9qSaFsk8G5J2zF5P5YOt4x62eefXgmhWeKZzJI5AIi0312iMQl5qGv+lAkP+VC7j/h1rh7peBDEBU6LvcMgFU2XqxidM/CoKfMkJF8+/4bb+3r1LC/rEeXITTUQsOmoacdyCeKe5yxLaHyic/FaZIJq13wCg/QQSLfenc2Db0Pbxv5/cbRILhKT+ssElVipA40aZpgL7QmD542vObSEa6K4fZd0rawF/nOyibfpPN7Ak8DrYvfygNMw/QAGKY2XosxC86tjxhrIBHRakqmWpV+smoUO6XBFjU2sbwalafYVFdrvYL9BVAPtMZ25Sc5QMm87RCHqzqYdQHKs8C3JpVBHWnyL+0e5DNQrFrml0/FD5nFYsT6zDKVb/rN3YmxvTvKl7FpPKpv3Kke9WG+HnPs90hPy8Jpmg52vLMhaybx6dpJxzcF+ctBSI3J78hfweOCGvNGshCKpME1dujMPctH/kfYcm2j/ixKLjl0ZSbYeI9+l9oURBDwKzmKjAqhwnjuo3sL++ZsRU5Ue1zz9gsxS40R9eYevbq7JiQPX331pY2du1SRoKOxvPpXsDqe+CY5pW2RgPszjEIuDxyoveZolXg/zjlk0Ic/cOxrbflp7bTfQCQqEC7YJ5tRmtctk2lRGQkOFIg9Tn8ReifFxfhDrPFzc8X5vZgH73aqZSd/OkVybI3vEILV5uas0fPL7AHAKnBmeDV3mBNvF8aoZhD5CG8iRd1otta/3AQ660QV8IDoauq8fySC8Kee5B3kG75sqHvwF4Gu6CpSChXkjpiIqVmW0PntJueVHifuGJYkvhkX/CTHK7xm1HhtANnGrk6cr2APjWk1vpOaCmjFNqKTOV9d1HjaNWYTz4AZ+Uq2Za3UzN3oZCtZb96,iv:Z64+4oR/AfSgA7oZ/NPDLOtcmcXO5B4OQIGjOEK1Pf4=,tag:0I/1gXnBH7u6HTbQUz5Fpw==,type:str]
mopidy:
spotify: ENC[AES256_GCM,data:SaDT0iSWhsgVOi1s+Nzbr0Mur3t2Zd9z/KIUshGWtbPfkXXIoiJeJFtoZIz5NL/t5FooYsNfU1mGYgDeVYSD4BPibW8hiCYrX6L6OX+Q6ZEWXXx/1eBEs2/q0BrWGvy7frcurq/Px4R3ax0dXJe/YKbpAtU7+bQl,iv:F2zT+uMVBMnSEZqgcRmV8/fc3G/g2fKDuHuBzkyBRN0=,tag:CD8fuOQfe6QCrj4BUh0/xw==,type:str]
bandcamp: ENC[AES256_GCM,data:diEx2fbkOR1oUav81jU5bNt/KNmbOaVzLV+G3zBUVXE7nEQpZNqVom0rgNrEVDGzH3u/IaA5eqG5ce9lE0BomeY8Z4MWI1xujhX5KsXdv21aw4UwsNgyLPuWhkN2POUMfCJlvekc/TFfFvJHyysx8aKxeI4dsg==,iv:cxx0cVkjOPG+hMD8JctJHdcICJt7ozpfRBVSCDBo6Ro=,tag:JRjwwvieGaGZJ+k56HWFaw==,type:str]
emailPassword: ENC[AES256_GCM,data:LALAvyuNN9bfa8D6ZK1YiFXRfxLOBi9kXA0N0Kr7h18eAI4hWQ==,iv:WtidILFfWCMKylax52JP+X57GfZyYlxJtiwrC6SADik=,tag:NvOrsL3fbmxQZp06GZhUZA==,type:str]
ssh:
hosts: ENC[AES256_GCM,data:Z+ODSCeKqt2ipgR9ZMV13kHZSZrwr7pY+kXM2Ej2Mc7WrBXoN25T+OWPJ6uf70yBGMID1faaWtbMUCjsp6gjqIVR7UH59yVfuKGDQIw5FSy3bdyvADITjASJMFIfO1xsu8iY0h18PdUBqNNYnt27c+3Bxn5SP0r6OCUC48SkSeCVhxtFIIMR4ZiVHZwQ2pD1GwLjmdUPPSpEJg5vpjFhFKB6Ab8z+qN5GaYMov2NKivMNVTBQUHpgmf58D6MI/AnjUbVsLuOmp0V3lhy8/qX33tgogpVv/RA6gAITVlAf9rGwaF+axZ0iy0T/gF7VJEGX6RUHbVUJoX1j8szDq/P4oqczFubrZdmRIbutG4tEcnYXltMu2NELFP+bl/G4y1gIV2b+s0k+UQJXn4KaiyXbtQXvOJ91+s7iMyTDi4QQd07l7nFqGGgzoKTYVfQK0e5ilEofRQrXwAb+p6Pwkvth8ktONFgD0sQHL75a8lS//8Mzvqopy5Vp0FQJ+OSW89Eeu2wrw9yNP2yuMDX9tvgDuZV4hgvDa9tTxvfGoMDXWARhSBt/F/a4ZkrNV9unjgEXbkrewezn1Jk+XWtAlussbTEXkKG87v2Q0V8zBa8gsB/5g514dIP6+UJdc3GEJzMLkQNcHYn9r3Ou8n+YgXD8zu5OnZXtNZ/x+J6NxH7tudiO5O0XctRwJQibidS2ONUhdkQGBt1JrAysGbNTuXC8Sn391rc11lsH+wIGpZg4zR+rdP4FWs68v/o9WtCJDCejnlyQ1DQ+avLc0aT4xxJZh8uM2iSsfi/TzRr9w0wVe2y3xAxsQMCfvhFcl9agfmAgGZcfVPCU9nc4dIfdGW1kTN7s3Izvy4mYaqd9mv0xxYARf7roJDGWie0VNxXQVt2o1tIQCqAhZ/bbgPG5VDyD15LGDI8BZCFaAOKlXn+beVMt6E1JJPlHa0vOwnbMVVKcUS/d5jA9nnb20Pwz4F3b532/ERmSkVlcZmCKqQOxo0YADb7Cm1fFBj6Eum0+F+jspg9QQmMjPPsb+NbMqnFd5DNDY+e95hr7tUEy4/yxiXiM0cu1w==,iv:I4TtUJdQFOVik5L26XHukxix0FCm/JNi6nVZg5qRMqs=,tag:vnO6DlUW5XnougyiJzwNdg==,type:str]
hosts: ENC[AES256_GCM,data:j7+Ua5G8dePL5GO+Tf8+hnoJsSfKo2z4I0OcVfSyJ3dc6yyYZVho8iG9bqPAqVR5d7SJr391zCLMJp/jRDpDFLkzQB54udVKI8ob0C2w2xBznPZJsC7qZMptQ+n4IHO1ZROSi/vBadCUfEWKNO9e8gsroBYmliy/31M5IlA85Vx6q4Zx0qIFylfIhBDto3jD2DRcbjWP8NvjJcY7YLrN2sv8RR7QqX1q+0ZxpgFhg+W+a5Dz8JBVsPEdjNJqFAKAmUGKXf4bpEIS5lLUxxZweizEiWgo4nYJgA0kqVYEOiErOPgtpnBKiJlR+fLGuVwdGxVOUMvttZtyIgHc4CWgOJ0h67h4eVii+zeLn0GPJl3i2g5bjOArHKLfkKGduqii4n/1p9VvVTAOn5dj0/NtD2JNJF9kUDr1nMyMa1xA35gzv1vp/U55L6ZU/BRpBPzka6i8nGnCkDVdoUG0DKhN9ooXRpUS9L+W1iz480fzb6i/tfmlhx7Ms1T9VybYFkGLNkxnsrt5Oc24o0XD5/A1j8bJgNWo6aWSA748ZWtN0mXDzB5sH4TVtaZAGlyU9r/x5oCuWPN2qhZ8d2i7g5rceZW5ang/uyXNt8Le5cKvLw3Rhf4BTFhQ6+VJ4/SpdfnLZ17djjbwZO1DT5Nb0RUObcilcwbmUwqvmLbcrdmsfQMOcetRwFpIdoX6MjkRiC1WZ4cz8bMU7ArnK/n15dsIdaiiUfuOJAiBYut1PaJBoZDe8pXzOE6U1s57sejUf1T7NHp2epyevCAYuVG71dAFLn1oLM+FWXuBm6ogFLujoFh7XCVVqdf6j348/ekzBxDIemzS4G1+zflG3AteLWcslGVTNmx0rb3GlSHGNVNZoeHvYAHIIEyWpY4Yd01R8RhjrFXQo9comnpoQXSlFDvuUGTxuUpsariAof4wKLdpqj8Dc4ZaDvd1pAGVh7RBqR4rn4kClbWUVcSFy7QWs9T5Sw0fU/bLL76N6x9Y44P5NQLAJvZ0z8rhIPl0u8OwIhhEwkhWdFLSulk/N7+DVqrRpj7bB5hB8jZWspsl44IdiZWY3UPs7zs=,iv:3q4FYxDWPGyMqeKoSTRxSPvqZXzwg/NeHZh70d38HYM=,tag:jA8/5yi74/mOuu/b83WEeg==,type:str]
sops:
age:
- recipient: age1ajemtm502nn2n4q7v4j8meyd5mxtcqngkkedxq2pqzuwu78zp93qnw8q48
@@ -61,7 +65,7 @@ sops:
QmJKNDJUY0RSakhwNWlkOVpib0trc1kK0tQxD9I82pjfs54eruu+IjzVUmcVBCPw
9mp1xKiYRRMXt3YQn6MPiyuuX3l3UB5MH0RJMNtRq0D961rs+iiS5A==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2025-11-02T16:19:20Z"
mac: ENC[AES256_GCM,data:2UFvzqhsR9OecqRX/n2O5wJ1fcdhetNE37Vj56rL6tRxT42uU8SKy7hxROS0LcrwKs59Km7P1oO/mYW6eyuLAZ7R5MAm18R5UYIYpKV8oevNUYMl0bsJkMnzl+nxz2i0ceg38rsioS9frK9a29hbJiV6Vr9yubHNdtZF4YqRmH0=,iv:Cx2nN4Gm0L+aWi6jbLuSuzhhzD8W5PzCLmJajyb/oEo=,tag:6wM1m8LB+7Rd/F9h62C4gg==,type:str]
lastmodified: "2025-11-02T00:42:02Z"
mac: ENC[AES256_GCM,data:0rYURFETR06JRNY/vE89jEI+dovFNxsjSOalf1Id3H+yzl4UYdsHN1T3mD1EfssFwCloBxOo+188RkUe7JlNV7hC+tvO3nBrDNuqjzFBQu/IHEz+nTI3mwB7ZsywubvFMG65dohM8H9hB2bUXSSqtEUpFEiz7Ugn2BfGyex4BbI=,iv:vFJk6mz60d6CzSetd+bNvxTEWfGBPaBS4sYj/AiYbq4=,tag:2nHBGQ5P3mxLyzllvstBqg==,type:str]
unencrypted_suffix: _unencrypted
version: 3.11.0

View File

@@ -9,21 +9,23 @@ with lib; let
in {
options.mySystem.dev.docker = {
enable = mkEnableOption "Enable Docker";
extraDaemonSettings = mkOption {
type = types.nullOr (types.attrsOf types.str);
default = {};
example = {
data-root = "/custom/path";
};
};
podman.enable = mkEnableOption "Enable Podman rather than Docker";
nvidia.enable = mkEnableOption "Activate Nvidia support";
autoprune.enable = mkEnableOption "Enable autoprune";
};
config = mkIf cfg.enable {
environment.systemPackages = with pkgs;
[
dive # A tool for exploring each layer in a docker image
grype # Vulnerability scanner for container images and filesystems
]
++ lists.optionals cfg.podman.enable [
podman-compose
podman-desktop
];
config = {
environment.systemPackages = mkIf cfg.podman.enable [
pkgs.podman-desktop
pkgs.podman-compose
];
virtualisation = mkIf cfg.enable {
docker = mkIf (!cfg.podman.enable) {
enable = true;

View File

@@ -4,9 +4,9 @@
...
}:
with lib; let
cfg = config.mySystem.hardware.input.corne;
cfg = config.mySystem.hardware.corne;
in {
options.mySystem.hardware.input.corne.allowHidAccess = mkEnableOption "Enable HID access to the corne keyboard";
options.mySystem.hardware.corne.allowHidAccess = mkEnableOption "Enable HID access to the corne keyboard";
config.services.udev = mkIf cfg.allowHidAccess {
extraRules = ''
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"

View File

@@ -1,8 +1,12 @@
{lib, ...}:
{
imports = [
./amdgpu.nix
./bluetooth.nix
./corne.nix
./ibm-trackpoint.nix
./opentablet.nix
./sound.nix
./input
];
hardware.enableRedistributableFirmware = lib.mkDefault true;
}

View File

@@ -4,9 +4,9 @@
...
}:
with lib; let
cfg = config.mySystem.hardware.input.ibmTrackpoint;
cfg = config.mySystem.hardware.ibmTrackpoint;
in {
options.mySystem.hardware.input.ibmTrackpoint.disable = mkEnableOption "Disable IBMs trackpoint on ThinkPad";
options.mySystem.hardware.ibmTrackpoint.disable = mkEnableOption "Disable IBMs trackpoint on ThinkPad";
config.services.udev = mkIf cfg.disable {
extraRules = ''
ATTRS{name}=="*TPPS/2 IBM TrackPoint", ENV{ID_INPUT}="", ENV{ID_INPUT_MOUSE}="", ENV{ID_INPUT_POINTINGSTICK}=""

View File

@@ -1,8 +0,0 @@
{
imports = [
./corne.nix
./ibm-trackpoint.nix
./opentablet.nix
./trackball.nix
];
}

View File

@@ -1,3 +0,0 @@
{
services.libinput.mouse.middleEmulation = true;
}

View File

@@ -4,9 +4,9 @@
...
}:
with lib; let
cfg = config.mySystem.hardware.input.opentablet;
cfg = config.mySystem.hardware.opentablet;
in {
options.mySystem.hardware.input.opentablet.enable = mkEnableOption "Enables OpenTablet drivers";
options.mySystem.hardware.opentablet.enable = mkEnableOption "Enables OpenTablet drivers";
config.hardware.opentabletdriver = mkIf cfg.enable {
inherit (cfg) enable;
daemon.enable = true;

View File

@@ -9,5 +9,6 @@
./printing.nix
./ssh.nix
./sunshine.nix
./traefik.nix
];
}

View File

@@ -0,0 +1,65 @@
{
config,
lib,
...
}:
with lib; let
cfg = config.mySystem.services.traefik;
in {
options.mySystem.services.traefik = {
enable = mkEnableOption "Enable Traefikse";
email = mkOption {
type = types.str;
default = "lucien@phundrak.com";
example = "admin@example.com";
};
envFiles = mkOption {
type = types.listOf types.path;
example = ["/run/secrets/traefik.env"];
default = [];
};
dynConf = mkOption {
type = types.path;
example = "/var/traefik/dynamic.yaml";
};
};
config = mkIf cfg.enable {
networking.firewall.allowedTCPPorts = [80 443];
services.traefik = {
inherit (cfg) enable;
environmentFiles = cfg.envFiles;
dynamicConfigFile = cfg.dynConf;
staticConfigOptions = {
log = {
level = "WARN";
filePath = "/var/log/traefik/traefik.log";
};
accessLog.filePath = "/var/log/traefik/access.log";
api.dashboard = true;
entryPoints = {
web = {
address = ":80";
http.redirections.entryPoint = {
to = "websecure";
scheme = "https";
};
};
websecure.address = ":443";
};
certificatesResolvers.cloudflare.acme = {
inherit (cfg) email;
storage = "/var/lib/traefik/acme.json";
dnsChallenge = {
provider = "cloudflare";
resolvers = ["1.1.1.1:53" "1.0.0.1:53"];
propagation.delayBeforeChecks = 60;
};
};
providers.docker = {
endpoint = "unix:///var/run/docker.sock";
exposedByDefault = false;
};
};
};
};
}

View File

@@ -1,3 +1,3 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "askpass" ''
${pkgs.rofi}/bin/rofi -dmenu -password -no-fixed-num-lines -p $(printf \"$*\" | sed 's/://')''
${pkgs.wofi}/bin/wofi -d -P -L 1 -p "$(printf $1 | sed s/://)"''

View File

@@ -0,0 +1,18 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "rofi-emoji" ''
SELECTED_EMOJI=$(grep -v "#" ~/.config/emoji | ${pkgs.wofi}/bin/wofi --dmenu -p "Select emoji" -i | awk '{print $1}' | tr -d '\n')
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
printf "%s" "$SELECTED_EMOJI" | ${pkgs.wl-clipboard-rs}/bin/wl-copy
else
printf "%s" "$SELECTED_EMOJI" | ${pkgs.xclip}/bin/xclip -sel clip
fi
if [ "$XDG_SESSION_TYPE" = "wayland" ]
then EMOJI=$(${pkgs.wl-clipboard-rs}/bin/wl-paste)
else EMOJI=$(${pkgs.xclip}/bin/xclip -o)
fi
test -z "$EMOJI" && notify-send "No emoji copied" -u low && exit
EMOJI="$EMOJI copied to clipboard"
${pkgs.libnotify}/bin/notify-send -u low "$EMOJI"
''

View File

@@ -1,6 +1,6 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "ytplay" ''
URL=$(rofi -dmenu -i -p "Video URL")
URL=$(${pkgs.wofi}/bin/wofi --dmenu -i -p "Video URL")
if [ -z "$URL" ]; then
echo "You need to provide a URL"
exit 1
@@ -9,7 +9,7 @@ pkgs.writeShellScriptBin "ytplay" ''
grep -E "webm.*[0-9]+x[0-9]" | \
awk '{print $3 " " $1}' | \
sort -gu | \
rofi -dmenu -i -p "Resolution")
${pkgs.wofi}/bin/wofi --dmenu -i -p "Resolution")
mapfile -t RESOLUTION <<< "$RESOLUTION_CHOICE"
RESOLUTION_CODE=''${RESOLUTION[0]}
${pkgs.mpv}/bin/mpv --ytdl-format="''${RESOLUTION_CODE}+bestaudio/best" "$URL"

View File

@@ -7,17 +7,17 @@ with lib; let
cfg = config.home.desktop;
in {
imports = [
./emoji.nix
./eww.nix
./hyprland.nix
./kdeconnect.nix
./kitty.nix
./obs.nix
./qt.nix
./rofi
./swaync.nix
./waybar.nix
./wlr-which-key.nix
./wlsunset.nix
./wofi.nix
];
options.home.desktop.fullDesktop = mkEnableOption "Enable options for graphical environments";
@@ -28,7 +28,5 @@ in {
kitty.enable = mkDefault cfg.fullDesktop;
obs.enable = mkDefault cfg.fullDesktop;
qt.enable = mkDefault cfg.fullDesktop;
rofi.enable = mkDefault cfg.fullDesktop;
wlr-which-key.enable = mkDefault cfg.fullDesktop;
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -6,13 +6,13 @@
}:
with lib; let
cfg = config.home.desktop.hyprland;
rofi-emoji = import ../cli/scripts/rofi-emoji.nix {inherit pkgs;};
laptops = ["gampo"];
in {
imports = [
./swaync.nix
./waybar.nix
./wlsunset.nix
./hyprpaper.nix
];
options.home.desktop.hyprland = {
@@ -34,16 +34,14 @@ in {
config = mkIf cfg.enable {
home.desktop = {
hyprpaper.enable = true;
rofi.enable = mkDefault true;
swaync.enable = mkDefault true;
waybar = {
enable = mkDefault true;
battery = mkDefault (builtins.elem cfg.host laptops);
};
wlsunset.enable = mkDefault true;
wofi.enable = mkDefault true;
};
services.blueman-applet.enable = true;
wayland.windowManager.hyprland = {
enable = true;
xwayland.enable = true;
@@ -82,7 +80,7 @@ in {
new_status = "inherit";
};
workspace = [
"10, layoutopt:orientation:bottom"
"4, layoutopt:orientation:bottom"
"1, layoutopt:orientation:bottom"
];
decoration = {
@@ -114,11 +112,11 @@ in {
$right = r
$up = s
$down = t
$menu = rofi -combi-modi drun,calc -show combi
$menu = ${pkgs.wofi}/bin/wofi --show drun
bind = SUPER, Return, exec, ${pkgs.kitty}/bin/kitty ${pkgs.tmux}/bin/tmux
bind = SUPER, Space, exec, ${pkgs.wlr-which-key}/bin/wlr-which-key
bind = , Print, exec, ${pkgs.wlr-which-key}/bin/wlr-which-key -k s
bind = SUPER, Space, submap, leader
bind = , Print, submap, screenshot
submap = leader
bind = , l, exec, plock
@@ -147,13 +145,11 @@ in {
bind = , u, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = buffers
bind = , d, killactive,
bind = , d, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = resize
binde = , $left, resizeactive, -10 0
binde = , $right, resizeactive, 10 0
@@ -162,21 +158,15 @@ in {
bind = , q, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = rofi
bind = , b, exec, rofi-bluetooth
bind = , b, submap, reset
bind = , e, exec, rofi -show emoji
bind = , e, exec, ${rofi-emoji}/bin/rofi-emoji
bind = , e, submap, reset
bind = , r, exec, $menu
bind = , r, submap, reset
bind = , s, exec, rofi -show ssh
bind = , r, submap, reset
bind = , y, exec, ytplay
bind = , y, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = screenshot
bind = , Print, exec, screenshot
bind = , Print, submap, reset
@@ -192,7 +182,6 @@ in {
bind = Shift, s, submap, reset
bind = , escape, submap, reset
bind = CTRL, g, submap, reset
submap = windows
bind = , period, submap, resize
bind = , $left, movefocus, l
@@ -282,5 +271,17 @@ in {
bind = SUPER_SHIFT, asterisk, movetoworkspace, 10
'';
};
services = {
blueman-applet.enable = true;
hyprpaper = {
enable = true;
settings = {
ipc = "on";
splash = false;
preload = "/home/phundrak/Pictures/Wallpapers/nord/Nordic6.jpg";
wallpaper = ", /home/phundrak/Pictures/Wallpapers/nord/Nordic6.jpg";
};
};
};
};
}

View File

@@ -1,88 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.home.desktop.hyprpaper;
in {
options.home.desktop.hyprpaper = {
enable = mkEnableOption "Enables Hyprpaper";
default = mkOption {
type = types.str;
default = "/home/phundrak/Pictures/Wallpapers/nord/Nordic6.jpg";
example = "/home/user/image.jpg";
};
wallpapers-dir = mkOption {
type = types.str;
default = "/home/phundrak/Pictures/Wallpapers/nord/";
example = "/home/user/Pictures/";
};
rotation-interval = mkOption {
type = types.str;
default = "5m";
example = "10m";
description = "Interval between wallpaper rotations";
};
};
config = mkIf cfg.enable {
services.hyprpaper = {
inherit (cfg) enable;
settings = {
ipc = "on";
splash = false;
preload = cfg.default;
wallpaper = ", ${cfg.default}";
};
};
systemd.user = {
services.hyprpaper-rotation = {
Unit = {
Description = "Rotate Hyprpaper wallpaper";
After = "graphical-session.target";
};
Service = {
Type = "oneshot";
ExecCondition = "${pkgs.procps}/bin/pidof Hyprland";
ExecStart = "${config.home.homeDirectory}/.config/hypr/hyprpaper-rotate.sh";
};
};
timers.hyprpaper-rotation = {
Unit = {
Description = "Timer for rotating Hyprpaper wallpaper";
};
Timer = {
OnBootSec = cfg.rotation-interval;
OnUnitActiveSec = cfg.rotation-interval;
};
Install = {
WantedBy = ["timers.target"];
};
};
};
home.file.".config/hypr/hyprpaper-rotate.sh" = {
text = ''
#!/usr/bin/env bash
set -euo pipefail
WALLPAPER_DIR="${cfg.wallpapers-dir}"
# Find a random wallpaper
WP=$(find "$WALLPAPER_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n 1)
if [ -z "$WP" ]; then
echo "No wallpapers found in $WALLPAPER_DIR"
exit 1
fi
echo "Setting wallpaper to: $WP"
# Load and set the wallpaper
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$WP" && ${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$WP"
'';
executable = true;
};
};
}

View File

@@ -1,107 +0,0 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.home.desktop.rofi;
inherit (config.lib.formats.rasi) mkLiteral;
in {
options.home.desktop.rofi = {
enable = mkEnableOption "Enable Rofi";
};
config = mkIf cfg.enable {
home.packages = with pkgs; [rofi-bluetooth];
programs.rofi = {
enable = true;
plugins = with pkgs; [
rofi-calc
rofi-emoji
];
terminal = "${pkgs.kitty}/bin/kitty";
location = "center";
modes = ["drun" "emoji" "calc" "combi"];
extraConfig.show-icons = true;
theme = {
"*" = {
font = "Cascadia Code 14";
blur = true;
padding = mkLiteral "10px";
background-color = mkLiteral "transparent";
border-radius = mkLiteral "0px";
};
window = {
width = mkLiteral "1050px";
height = mkLiteral "625px";
location = mkLiteral "center";
blur = true;
border = mkLiteral "2px";
border-radius = mkLiteral "3px";
border-color = mkLiteral "#61afef";
background-color = mkLiteral "transparent";
padding = mkLiteral "0px";
margin = mkLiteral "30px 50px";
};
mainbox = {
orientation = mkLiteral "horizontal";
children = map mkLiteral ["borderbox"];
spacing = mkLiteral "0px";
padding = mkLiteral "0px";
};
borderbox = {
orientation = mkLiteral "horizontal";
children = map mkLiteral ["imagebox" "contentbox"];
padding = mkLiteral "0px";
spacing = mkLiteral "0px";
border-radius = mkLiteral "3px";
};
contentbox = {
orientation = mkLiteral "vertical";
children = map mkLiteral ["entry" "listview"];
spacing = mkLiteral "0px";
padding = mkLiteral "0px";
expand = true;
};
imagebox = {
background-image = mkLiteral "url(\"${./image.jpg}\")";
background-repeat = false;
size = mkLiteral "200px 625px";
};
element = {
border-radius = mkLiteral "0px";
};
"element-text, element-icon" = {
padding = mkLiteral "6px 8px";
spacing = mkLiteral "2px";
text-color = mkLiteral "#fab387";
};
"element selected" = {
background-color = mkLiteral "#191919";
text-color = mkLiteral "#e5c07b";
border-radius = mkLiteral "3px";
};
prompt = {
enabled = false;
background-color = mkLiteral "transparent";
text-color = mkLiteral "#61afef";
padding = mkLiteral "5px 10px";
};
entry = {
padding = mkLiteral "8px";
expand = false;
font = "Cascadia Code 14";
text-color = mkLiteral "#fab387";
border-radius = mkLiteral "0px 3px 0px 0px";
background-color = mkLiteral "#292e36";
};
listview = {
lines = mkLiteral "1";
background-color = mkLiteral "rgba(46, 52, 64, 0.8)";
border-radius = mkLiteral "0px 0px 3px 0px";
padding = mkLiteral "5px";
};
};
};
};
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

View File

@@ -1,189 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
inherit
(lib)
literalExpression
mkIf
mkOption
mkEnableOption
types
;
cfg = config.home.desktop.wlr-which-key;
yamlFormat = pkgs.formats.yaml {};
# Convert kebab-case to snake_case
toSnakeCase = str: builtins.replaceStrings ["-"] ["_"] str;
# Recursively filter out null values and convert kebab-case keys to snake_case
filterNulls = value:
if lib.isAttrs value
then lib.mapAttrs' (n: v: lib.nameValuePair (toSnakeCase n) (filterNulls v)) (lib.filterAttrs (n: v: v != null) value)
else if lib.isList value
then map filterNulls value
else value;
menuEntryType = types.submodule {
freeformType = yamlFormat.type;
options = with types; {
key = mkOption {
type = str;
example = "p";
};
desc = mkOption {
type = str;
example = "Power";
};
cmd = mkOption {
type = nullOr str;
default = null;
example = "echo example";
};
keep-open = mkOption {
type = nullOr bool;
default = null;
example = true;
};
submenu = mkOption {
type = nullOr (listOf menuEntryType);
default = null;
example = literalExpression ''
[
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
]
'';
};
};
};
settingsType = types.submodule {
freeformType = yamlFormat.type;
options = with types; {
background = mkOption {
type = nullOr str;
default = null;
example = "#282828FF";
};
color = mkOption {
type = nullOr str;
default = null;
example = "#FBF1C7FF";
};
border = mkOption {
type = nullOr str;
default = null;
example = "#8EC07CFF";
};
anchor = mkOption {
type = nullOr (enum ["center" "top" "bottom" "left" "right" "top-left" "top-right" "bottom-left" "bottom-right"]);
default = null;
example = "top-left";
};
margin-top = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-right = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-bottom = mkOption {
type = nullOr int;
default = null;
example = "0";
};
margin-left = mkOption {
type = nullOr int;
default = null;
example = "0";
};
font = mkOption {
type = nullOr str;
default = null;
example = "monospace 10";
};
separator = mkOption {
type = nullOr str;
default = null;
example = " ";
};
border-width = mkOption {
type = nullOr (either float int);
default = null;
example = 4.0;
};
corder-r = mkOption {
type = nullOr (either float int);
default = null;
example = 20.0;
};
padding = mkOption {
type = nullOr (either float int);
default = null;
example = 15.0;
};
rows-per-column = mkOption {
type = nullOr int;
default = null;
example = 5;
};
column-padding = mkOption {
type = nullOr (either float int);
default = null;
example = 25.0;
};
inhibit-compositor-keyboard-shortcuts = mkOption {
type = bool;
default = true;
example = false;
};
auto_kbd_layout = mkOption {
type = bool;
default = true;
example = false;
};
namespace = mkOption {
type = nullOr str;
default = null;
example = "wlr_which_key";
};
menu = mkOption {
type = listOf menuEntryType;
default = [];
example = literalExpression ''
[
{
key = "p";
desc = "Power";
submenu = [
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
];
}
]
'';
};
};
};
in {
options.home.desktop.wlr-which-key = {
enable = mkEnableOption "Enables wlr-which-key";
package = lib.mkPackageOption pkgs "wlr-which-key" {};
settings = mkOption {
type = settingsType;
default = {};
description = "Configuration written to {file}`$XDG_CONFIG_HOME/wlr-which-key/config.yaml`.";
};
};
config = mkIf cfg.enable {
xdg.configFile = {
"wlr-which-key/config.yaml".source = yamlFormat.generate "wlr-which-key-config.yml" (filterNulls cfg.settings);
};
};
}

View File

@@ -0,0 +1,76 @@
{
lib,
config,
...
}:
with lib; let
cfg = config.home.desktop.wofi;
in {
options.home.desktop.wofi.enable = mkEnableOption "Enable wofi support";
config.programs.wofi = mkIf cfg.enable {
inherit (cfg) enable;
settings = {
modi = "ssh,drun,combi";
sidebar-mode = false;
width = 50;
line-margin = 10;
lines = 6;
columns = 2;
display-ssh = "";
display-run = "";
display-drun = "";
display-window = "";
display-combi = "";
show-icons = true;
};
# from https://github.com/alxndr13/wofi-nord-theme
style = ''
* {
font-family: "Hack", monospace;
}
window {
background-color: #3B4252;
}
#input {
margin: 5px;
border-radius: 0px;
border: none;
background-color: #3B4252;
color: white;
}
#inner-box {
background-color: #383C4A;
}
#outer-box {
margin: 2px;
padding: 10px;
background-color: #383C4A;
}
#scroll {
margin: 5px;
}
#text {
padding: 4px;
color: white;
}
#entry:nth-child(even){
background-color: #404552;
}
#entry:selected {
background-color: #4C566A;
}
#text:selected {
background: transparent;
}
'';
};
}

View File

@@ -6,11 +6,10 @@
}:
with lib; let
emacsDefaultPackage = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
epkgs:
with epkgs; [
mu4e
pdf-tools
]
epkgs: [
epkgs.mu4e
epkgs.pdf-tools
]
));
cfg = config.home.dev.editors.emacs;
in {
@@ -26,10 +25,7 @@ in {
};
config = {
home.packages = with pkgs; [
emacs-all-the-icons-fonts
emacs-lsp-booster
];
home.packages = [pkgs.emacs-all-the-icons-fonts];
programs.emacs = mkIf cfg.enable {
enable = true;
inherit (cfg) package;

View File

@@ -29,8 +29,8 @@ in {
sshKey = mkOption {
type = with types; nullOr (either path str);
example = "~/.ssh/id_ed25519.pub";
default = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
description = "Path to the private SSH key for signing.";
default = "~/.ssh/id_ed25519.pub";
description = "Path to the public SSH key or its content.";
};
};
};
@@ -54,8 +54,8 @@ in {
behavior = "own";
backend = "ssh";
key = cfg.signing.sshKey;
backends.ssh.allowed-signers = "${config.home.homeDirectory}/.ssh/allowed_signers";
backends.ssh.program = "${pkgs.openssh}/bin/ssh-keygen";
backends."ssh.allowed-signers" = "~/.ssh/allowed_signers";
backends."ssh.program" = "${pkgs.openssh}/bin/ssh-keygen";
};
aliases = {
blame = ["file" "annotate"];

View File

@@ -40,16 +40,6 @@ with lib; let
dcud = "docker compose up -d";
dcudp = "docker compose up -d --pull=always";
dcr = "docker compose restart";
pc = "podman compose";
pcd = "podman compose down";
pcl = "podman compose logs";
pclf = "podman compose logs -f";
pcp = "podman compose pull";
pcu = "podman compose up";
pcud = "podman compose up -d";
pcudp = "podman compose up -d --pull=always";
pcr = "podman compose restart";
enw = "emacsclient -nw";
e = "emacsclient -n -c";

View File

@@ -6,8 +6,8 @@
Sent from GNU/Emacs
@@@ Sauvez un arbre, mangez un castor @@@
@@@ Save a tree, eat a beaver @@@
*** Sauvez un arbre, mangez un castor ***
*** Save a tree, eat a beaver ***
'';
in {
home.file.".signature" = {

View File

@@ -1,49 +1,21 @@
{
pkgs,
config,
lib,
...
}: {
imports = [
./light-home.nix
./packages.nix
./email.nix
./wlr-which-key
../modules
];
config = let
emacsPackage = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
epkgs:
with epkgs; [
mu4e
pdf-tools
tree-sitter
tree-sitter-langs
(treesit-grammars.with-grammars (grammar:
with grammar; [
tree-sitter-bash
tree-sitter-c
tree-sitter-cpp
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-http
tree-sitter-javascript
tree-sitter-jsdoc
tree-sitter-json
tree-sitter-just
tree-sitter-markdown
tree-sitter-markdown-inline
tree-sitter-nix
tree-sitter-rust
tree-sitter-sql
tree-sitter-toml
tree-sitter-typescript
tree-sitter-typst
tree-sitter-vue
tree-sitter-yaml
]))
]
emacsPkg = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
epkgs: [
epkgs.mu4e
epkgs.pdf-tools
]
));
askpass = import ../modules/cli/scripts/askpass.nix {inherit pkgs;};
launchWithEmacsclient = import ../modules/cli/scripts/launch-with-emacsclient.nix {
@@ -58,34 +30,18 @@
home = {
sessionVariables = {
EDITOR = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -a ${config.home.dev.editors.emacs.package}/bin/emacs";
EDITOR = "${emacsPkg}/bin/emacsclient -c -a ${emacsPkg}/bin/emacs";
LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient";
SUDO_ASKPASS = "${askpass}/bin/askpass";
LSP_USE_PLISTS = "true";
};
desktop.waybar.style = ./config/waybar/style.css;
dev = {
ai.claude.enable = true;
editors.emacs.package = emacsPackage;
vcs.jj.signing.enable = true;
};
dev.ai.claude.enable = true;
fullDesktop = true;
file."${config.home.homeDirectory}/.ssh/allowed_signers" = {
enable = true;
text = lib.strings.join "\n" (
map (file: let
content = lib.strings.trim (builtins.readFile file);
parts = lib.strings.splitString " " content;
email = lib.lists.last parts;
in "${email} namespaces=\"git\" ${content}")
(lib.filesystem.listFilesRecursive ../../keys)
);
};
shell.fish.enable = true;
};
manual = {
html.enable = true;
manpages.enable = true;
};
manual.html.enable = true;
};
}

View File

@@ -68,22 +68,18 @@ with lib; {
gimpPlugins.gmic
# Dev
dbeaver-bin
devenv
nodejs
sqlite
dive # A tool for exploring each layer in a docker image
grype # Vulnerability scanner for container images and filesystems
tectonic # better LaTeX engine
wakatime-cli
zeal
## LSP servers
bash-language-server
docker-language-server
kdePackages.qtdeclarative # For QML LSP
nixd
marksman
nil # Nix
python3 # for Emacs and LSP
vscode-json-languageserver
yaml-language-server # Yaml (Docker, GitHub Actions, ...)
];
}

View File

@@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "center-window" ''
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch centerwindow
''

View File

@@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "close-window" ''
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch killactive
''

View File

@@ -1,226 +0,0 @@
{
config,
pkgs,
...
}: {
config.home.desktop.wlr-which-key.settings = {
font = "Cascadia Code 12";
background = "#3b4252d0";
color = "#eceff4";
border = "#2e3440";
border_width = 2;
corner_r = 10;
rows_per_column = 5;
column_padding = 25;
inhibit_compositor_keyboard_shortcuts = true;
auto_kbd_layout = true;
menu = let
left = "c";
down = "t";
up = "s";
right = "r";
center-window = import ./center-window.nix {inherit pkgs;};
close-window = import ./close-window.nix {inherit pkgs;};
float-window = import ./float-window.nix {inherit pkgs;};
focus-urgent = import ./focus-urgent.nix {inherit pkgs;};
fullscreen = import ./fullscreen.nix {inherit pkgs;};
ytplay = import ../../modules/cli/scripts/ytplay.nix {inherit pkgs;};
in [
{
key = "a";
desc = "Apps";
submenu = [
{
key = "b";
desc = "Browser";
cmd = "zen";
}
{
key = "B";
desc = "Qutebrowser";
cmd = "${pkgs.qutebrowser}/bin/qutebrowser";
}
{
key = "d";
desc = "Discord";
cmd = "${pkgs.vesktop}/bin/vesktop";
}
{
key = "e";
desc = "Emacs";
cmd = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -n";
}
{
key = "g";
desc = "Gimp";
cmd = "${pkgs.gimp}/bin/gimp";
}
{
key = "n";
desc = "Nemo";
cmd = "${pkgs.nemo}/bin/nemo";
}
{
key = "N";
desc = "Nextcloud";
cmd = "${pkgs.nextcloud-client}/bin/nextcloud";
}
{
key = "r";
desc = "Rofi";
submenu = [
{
key = "b";
desc = "Bluetooth";
cmd = "${pkgs.rofi-bluetooth}/bin/rofi-bluetooth";
}
{
key = "c";
desc = "calc";
cmd = "rofi -show calc";
}
{
key = "e";
desc = "Emoji";
cmd = "rofi -show emoji";
}
{
key = "r";
desc = "App Menu";
cmd = "rofi -show drun";
}
{
key = "s";
desc = "SSH";
cmd = "rofi -show ssh";
}
{
key = "y";
desc = "YouTube";
cmd = "${ytplay}/bin/ytplay";
}
];
}
];
}
{
key = "b";
desc = "Buffers";
submenu = [
{
key = "c";
desc = "Center";
cmd = "${center-window}/bin/center-window";
}
{
key = "d";
desc = "Close";
cmd = "${close-window}/bin/close-window";
}
{
key = "f";
desc = "Fullscreen";
cmd = "${fullscreen}/bin/fullscreen";
}
{
key = "F";
desc = "Float";
cmd = "${float-window}/bin/float-window";
}
{
key = "u";
desc = "Urgent";
cmd = "${focus-urgent}/bin/focus-urgent";
}
{
key = ".";
desc = "Resize";
submenu = [
{
key = left;
desc = "Decrease Width";
cmd = "echo decrease width";
keep-open = true;
}
{
key = down;
desc = "Increase Height";
cmd = "echo decrease height";
keep-open = true;
}
{
key = up;
desc = "Decrease Height";
cmd = "echo decrease height";
keep-open = true;
}
{
key = right;
desc = "Increase Width";
cmd = "echo increase width";
keep-open = true;
}
];
}
];
}
{
key = "p";
desc = "Power";
submenu = [
{
key = "s";
desc = "Suspend";
cmd = "systemctl suspend";
}
{
key = "r";
desc = "Reboot";
cmd = "systemctl reboot";
}
{
key = "o";
desc = "Poweroff";
cmd = "systemctl poweroff";
}
];
}
{
key = "s";
desc = "Screenshots";
submenu = [
{
key = "Print";
desc = "Screenshot";
cmd = "screenshot";
}
{
key = "d";
desc = "Delayed";
cmd = "screenshot -d 3";
}
{
key = "D";
desc = "Select, Delay, Edit, and Copy";
cmd = "screenshot -secd 3";
}
{
key = "e";
desc = "Select, Edit, and Copy";
cmd = "screenshot -sec";
}
{
key = "g";
desc = "Select, Gimp, and Copy";
cmd = "screenshot -sgc";
}
{
key = "s";
desc = "Select and Copy";
cmd = "screenshot -sc";
}
];
}
];
};
}

View File

@@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "float" ''
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch togglefloating
''

View File

@@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "focus-urgent" ''
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch focusurgentorlast
''

View File

@@ -1,4 +0,0 @@
{pkgs, ...}:
pkgs.writeShellScriptBin "fullscreen" ''
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch fullscreen
''