Compare commits
22 Commits
d989792774
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| b4ca7cc870 | |||
| 2376a12f54 | |||
| ea0f3eb82c | |||
| 020bec1aa0 | |||
| 64073f18c0 | |||
| 9584a00673 | |||
| c9f2d4eccf | |||
| 434f14707c | |||
| f94f6e63b1 | |||
| ca285c92f7 | |||
| bcf0c17c51 | |||
| 5b9b48fede | |||
| fe2730b673 | |||
| 31b70d4221 | |||
| b9c0ab5f85 | |||
| 09f39d1537 | |||
| b696672f11 | |||
| 1ed32e29b0 | |||
| f04a72f19d | |||
| 3cf1f4f11f | |||
| dbf7c1cd2e | |||
| 134fc441a5 |
60
flake.lock
generated
60
flake.lock
generated
@ -45,6 +45,28 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"awww": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat_2",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"rust-overlay": "rust-overlay_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1779666993,
|
||||||
|
"narHash": "sha256-W0yA7Y37oj5BBzl4ojO8dtv9MuOvdrIZDxtRjs7kpdg=",
|
||||||
|
"ref": "refs/heads/main",
|
||||||
|
"rev": "9b7f47f7f394dce0a17a7b161e0d2fe391ce72b3",
|
||||||
|
"revCount": 1366,
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://codeberg.org/LGFae/awww"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://codeberg.org/LGFae/awww"
|
||||||
|
}
|
||||||
|
},
|
||||||
"base16": {
|
"base16": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"fromYaml": "fromYaml"
|
"fromYaml": "fromYaml"
|
||||||
@ -187,6 +209,22 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1761588595,
|
||||||
|
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"flake-parts": {
|
"flake-parts": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs-lib": [
|
"nixpkgs-lib": [
|
||||||
@ -618,6 +656,7 @@
|
|||||||
"inputs": {
|
"inputs": {
|
||||||
"aagl": "aagl",
|
"aagl": "aagl",
|
||||||
"alejandra": "alejandra",
|
"alejandra": "alejandra",
|
||||||
|
"awww": "awww",
|
||||||
"cookiez-assets": "cookiez-assets",
|
"cookiez-assets": "cookiez-assets",
|
||||||
"grub2-themes": "grub2-themes",
|
"grub2-themes": "grub2-themes",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
@ -671,6 +710,27 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rust-overlay_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"awww",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1764038373,
|
||||||
|
"narHash": "sha256-M6w2wNBRelcavoDAyFL2iO4NeWknD40ASkH1S3C0YGM=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "ab3536fe850211a96673c6ffb2cb88aab8071cc9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"stylix": {
|
"stylix": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"base16": "base16",
|
"base16": "base16",
|
||||||
|
|||||||
15
flake.nix
15
flake.nix
@ -4,6 +4,9 @@
|
|||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
|
pinned-kernel.url = "github:NixOS/nixpkgs/3b5ec87c520b3f3f890c439da30b9fc3f7e173d3";
|
||||||
|
#To pin Kernel versin 7.0.10 because others have bluetooth issues
|
||||||
|
|
||||||
nix-index-database = {
|
nix-index-database = {
|
||||||
url = "github:nix-community/nix-index-database";
|
url = "github:nix-community/nix-index-database";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@ -27,13 +30,18 @@
|
|||||||
inputs.home-manager.follows = "home-manager";
|
inputs.home-manager.follows = "home-manager";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mangowm = {
|
||||||
|
url = "github:mangowm/mango";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
stylix = {
|
stylix = {
|
||||||
url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently
|
url = "github:nix-community/stylix/master"; #Had to use branch or it would not build corrently
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
quickshell = {
|
noctalia = {
|
||||||
url = "github:outfoxxed/quickshell";
|
url = "github:noctalia-dev/noctalia-shell/v5";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -71,9 +79,12 @@
|
|||||||
nixpkgs,
|
nixpkgs,
|
||||||
alejandra,
|
alejandra,
|
||||||
pam-fprint-grosshack,
|
pam-fprint-grosshack,
|
||||||
|
pinned-kernel,
|
||||||
cookiez-assets,
|
cookiez-assets,
|
||||||
home-manager,
|
home-manager,
|
||||||
plasma-manager,
|
plasma-manager,
|
||||||
|
noctalia,
|
||||||
|
mangowm,
|
||||||
nixos-hardware,
|
nixos-hardware,
|
||||||
aagl,
|
aagl,
|
||||||
stylix,
|
stylix,
|
||||||
|
|||||||
20
mango/default.nix
Normal file
20
mango/default.nix
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
imports = [
|
||||||
|
inputs.mangowm.nixosModules.mango
|
||||||
|
../modules/hyprlock
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
libnotify #Needed to send notifications myself (Like when reloading the config)
|
||||||
|
];
|
||||||
|
|
||||||
|
home-manager.sharedModules = [
|
||||||
|
./home.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.mango.enable = true;
|
||||||
|
}
|
||||||
208
mango/home.nix
Normal file
208
mango/home.nix
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
# ── External scripts ──
|
||||||
|
resizeScript = pkgs.writeShellScriptBin "resize.sh" (builtins.readFile ./scripts/resize.sh);
|
||||||
|
layoutCmdScript = pkgs.writeShellScriptBin "layout-cmd.sh" (builtins.readFile ./scripts/layout-cmd.sh);
|
||||||
|
|
||||||
|
# Helper to get the bin path
|
||||||
|
resizePath = "${resizeScript}/bin/resize.sh";
|
||||||
|
layoutCmdPath = "${layoutCmdScript}/bin/layout-cmd.sh";
|
||||||
|
|
||||||
|
tagBinds = lib.concatLists (
|
||||||
|
builtins.genList (i: let
|
||||||
|
n = toString (i + 1);
|
||||||
|
in [
|
||||||
|
"SUPER,${n},view,${n}"
|
||||||
|
"SUPER+CTRL,${n},tag,${n}"
|
||||||
|
])
|
||||||
|
9
|
||||||
|
);
|
||||||
|
|
||||||
|
# All key bindings
|
||||||
|
defaultBinds =
|
||||||
|
# --- Common/Session ---
|
||||||
|
[
|
||||||
|
"SUPER+SHIFT,E,quit"
|
||||||
|
#"SUPER+CTRL,R,reload_config"
|
||||||
|
"SUPER+CTRL,R,spawn_shell,mmsg dispatch reload_config && notify-send -u low -t 500 \"MangoWM\" \"Reloaded ✓\""
|
||||||
|
]
|
||||||
|
# --- Screenshot ---
|
||||||
|
++ [
|
||||||
|
"SUPER+SHIFT,S,spawn,noctalia msg screenshot-region"
|
||||||
|
]
|
||||||
|
# --- Launchers ---
|
||||||
|
++ [
|
||||||
|
"SUPER,T,spawn,kitty" # Mod+T → terminal
|
||||||
|
"SUPER,D,spawn,noctalia msg panel-toggle launcher" # Mod+D → launcher
|
||||||
|
#"SUPER+SHIFT,L,spawn,noctalia msg session lock" # Super+L → lock
|
||||||
|
"SUPER+SHIFT,L,spawn,hyprlock"
|
||||||
|
]
|
||||||
|
# --- Media keys ---
|
||||||
|
++ [
|
||||||
|
"NONE,XF86AudioRaiseVolume,spawn,noctalia msg volume-up"
|
||||||
|
"NONE,XF86AudioLowerVolume,spawn,noctalia msg volume-down"
|
||||||
|
"NONE,XF86AudioMute,spawn,noctalia msg volume-mute"
|
||||||
|
"NONE,XF86AudioMicMute,spawn,noctalia msg mic-mute"
|
||||||
|
"NONE,XF86AudioPlay,spawn,playerctl play-pause"
|
||||||
|
"NONE,XF86AudioStop,spawn,playerctl stop"
|
||||||
|
"NONE,XF86AudioPrev,spawn,playerctl previous"
|
||||||
|
"NONE,XF86AudioNext,spawn,playerctl next"
|
||||||
|
]
|
||||||
|
# --- Brightness ---
|
||||||
|
++ [
|
||||||
|
"NONE,XF86MonBrightnessUp,spawn,noctalia msg brightness-up"
|
||||||
|
"NONE,XF86MonBrightnessDown,spawn,noctalia msg brightness-down"
|
||||||
|
]
|
||||||
|
# --- Focus (directional) ---
|
||||||
|
++ [
|
||||||
|
"SUPER,Left,focusdir,left"
|
||||||
|
"SUPER,Down,focusdir,down"
|
||||||
|
"SUPER,Up,focusdir,up"
|
||||||
|
"SUPER,Right,focusdir,right"
|
||||||
|
# vim bindings
|
||||||
|
"SUPER,H,focusdir,left"
|
||||||
|
"SUPER,J,focusdir,down"
|
||||||
|
"SUPER,K,focusdir,up"
|
||||||
|
"SUPER,L,focusdir,right"
|
||||||
|
]
|
||||||
|
# --- Move windows (swap with neighbor) ---
|
||||||
|
++ [
|
||||||
|
"SUPER+CTRL,Left,exchange_client,left"
|
||||||
|
"SUPER+CTRL,Down,exchange_client,down"
|
||||||
|
"SUPER+CTRL,Up,exchange_client,up"
|
||||||
|
"SUPER+CTRL,Right,exchange_client,right"
|
||||||
|
# vim bindings
|
||||||
|
"SUPER+CTRL,H,exchange_client,left"
|
||||||
|
"SUPER+CTRL,J,exchange_client,down"
|
||||||
|
"SUPER+CTRL,K,exchange_client,up"
|
||||||
|
"SUPER+CTRL,L,exchange_client,right"
|
||||||
|
]
|
||||||
|
# --- Tags (workspaces) 1-9 ---
|
||||||
|
++ tagBinds # Generated list of binds for tags 1-9
|
||||||
|
++ [
|
||||||
|
"SUPER,U,viewtoleft_have_client"
|
||||||
|
"SUPER,I,viewtoright_have_client"
|
||||||
|
"SUPER+SHIFT,U,tagtoleft"
|
||||||
|
"SUPER+SHIFT,I,tagtoright"
|
||||||
|
]
|
||||||
|
# --- Close window ---
|
||||||
|
++ [
|
||||||
|
"SUPER,Q,killclient"
|
||||||
|
]
|
||||||
|
# --- Layout / sizing ---
|
||||||
|
++ [
|
||||||
|
"SUPER+SHIFT,R,switch_layout" # Cycle layouts
|
||||||
|
"SUPER,F,spawn_shell,${layoutCmdPath} 'S:${resizePath} fullscreen' 'mmsg dispatch togglemaximizescreen'"
|
||||||
|
"SUPER+SHIFT,F,togglefullscreen"
|
||||||
|
"SUPER,C,centerwin" # Center floating window
|
||||||
|
|
||||||
|
# For Scroller
|
||||||
|
"SUPER,ssharp,spawn_shell,${layoutCmdPath} 'S:${resizePath} down' 'notify-send \"Title\" \"Down\"'"
|
||||||
|
#"SUPER,ssharp,spawn_shell,${resizePath} down"
|
||||||
|
"SUPER,dead_acute,spawn_shell,${layoutCmdPath} 'S:${resizePath} up' 'notify-send \"Title\" \"Up\"'"
|
||||||
|
#"SUPER,dead_acute,spawn_shell,${resizePath} up"
|
||||||
|
]
|
||||||
|
# --- Floating ---
|
||||||
|
++ [
|
||||||
|
"SUPER,V,togglefloating"
|
||||||
|
]
|
||||||
|
# --- Power off monitors ---
|
||||||
|
++ [
|
||||||
|
"SUPER+SHIFT,P,spawn,mmsg dispatch toggle_monitor,eDP-1"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Extra config for settings that don't have structured Nix attrs
|
||||||
|
extraConf = ''
|
||||||
|
# ── Input ──
|
||||||
|
xkb_rules_layout=de
|
||||||
|
numlockon=1
|
||||||
|
mouse_accel_profile=1
|
||||||
|
mouse_accel_speed=-0.4
|
||||||
|
|
||||||
|
# ── Appearance / Theming ──
|
||||||
|
focuscolor=0xffc87faa
|
||||||
|
bordercolor=0x505050ff
|
||||||
|
urgentcolor=0x9b0000ff
|
||||||
|
borderpx=2
|
||||||
|
|
||||||
|
# ── Blur ──
|
||||||
|
blur=1
|
||||||
|
|
||||||
|
blur_params_num_passes=2
|
||||||
|
blur_params_radius=5
|
||||||
|
blur_params_noise=0.02
|
||||||
|
blur_params_brightness=1
|
||||||
|
blur_params_contrast=1
|
||||||
|
blur_params_saturation=1
|
||||||
|
|
||||||
|
# window-rule geometry-corner-radius 12
|
||||||
|
border_radius=12
|
||||||
|
|
||||||
|
# Opacity
|
||||||
|
focused_opacity=1.0
|
||||||
|
unfocused_opacity=0.95
|
||||||
|
|
||||||
|
# ── Layout ──
|
||||||
|
gappih=10
|
||||||
|
gappiv=10
|
||||||
|
gappoh=10
|
||||||
|
gappov=10
|
||||||
|
|
||||||
|
# Master-stack settings (tile layout)
|
||||||
|
default_mfact=0.5
|
||||||
|
default_nmaster=1
|
||||||
|
new_is_master=1
|
||||||
|
|
||||||
|
# Scroller
|
||||||
|
scroller_default_proportion=0.5
|
||||||
|
scroller_focus_center=0
|
||||||
|
scroller_default_proportion_single=1.0
|
||||||
|
|
||||||
|
# Layout cycling order (Mod+R)
|
||||||
|
circle_layout=scroller,tile,center_tile,grid
|
||||||
|
|
||||||
|
# ── Monitor ──
|
||||||
|
monitorrule=name:^eDP-1$,width:2880,height:1920,refresh:120,x:0,y:0,scale:2
|
||||||
|
|
||||||
|
# ── Autostart ──
|
||||||
|
exec-once=noctalia
|
||||||
|
exec-once=lxpolkit
|
||||||
|
exec-once = ${pkgs.kdePackages.kwallet-pam}/libexec/pam_kwallet_init
|
||||||
|
|
||||||
|
exec-once="rm -rf ''${XDG_RUNTIME_DIR:-/tmp}/mango-resize"
|
||||||
|
|
||||||
|
tagrule=id:1,layout_name:scroller
|
||||||
|
tagrule=id:2,layout_name:scroller
|
||||||
|
tagrule=id:3,layout_name:scroller
|
||||||
|
tagrule=id:4,layout_name:scroller
|
||||||
|
tagrule=id:5,layout_name:scroller
|
||||||
|
tagrule=id:6,layout_name:scroller
|
||||||
|
tagrule=id:7,layout_name:scroller
|
||||||
|
tagrule=id:8,layout_name:scroller
|
||||||
|
tagrule=id:9,layout_name:scroller
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
inputs.mangowm.hmModules.mango
|
||||||
|
../modules/noctalia/home.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
wayland.windowManager.mango = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
# Additional autostart (most handled in extraConfig exec-once)
|
||||||
|
autostart_sh = "";
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
# Key bindings (flat list; keymode for submaps below if needed)
|
||||||
|
bind = defaultBinds;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Raw config lines for options without structured Nix attrs
|
||||||
|
extraConfig = extraConf;
|
||||||
|
};
|
||||||
|
}
|
||||||
21
mango/scripts/layout-cmd.sh
Normal file
21
mango/scripts/layout-cmd.sh
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
tag_json=$(mmsg get all-tags)
|
||||||
|
symbol=$(printf '%s' "$tag_json" | jq -r '
|
||||||
|
.all_tags[0].tags[] | select(.is_active == true) | .layout
|
||||||
|
' | head -1)
|
||||||
|
|
||||||
|
arg1="$1"
|
||||||
|
target_layout="${arg1%%:*}"
|
||||||
|
|
||||||
|
for arg in "${@:1:$#-1}"; do
|
||||||
|
layout="${arg%%:*}"
|
||||||
|
cmd="${arg#*:}"
|
||||||
|
if [ "$symbol" = "$layout" ]; then
|
||||||
|
eval "$cmd"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
eval "${@: -1}"
|
||||||
130
mango/scripts/resize.sh
Normal file
130
mango/scripts/resize.sh
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# 1️⃣ Presets
|
||||||
|
PRESETS=" 0.15 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00"
|
||||||
|
|
||||||
|
# Per-window saved-proportion directory
|
||||||
|
PROPORTION_DIR="${XDG_RUNTIME_DIR:-/tmp}/mango-resize"
|
||||||
|
|
||||||
|
# 2️⃣ Helper: abort with a clear message if a required binary is missing
|
||||||
|
need_cmd() {
|
||||||
|
command -v "$1" >/dev/null 2>&1 || {
|
||||||
|
printf "❌ Required command '%s' not found in PATH. Install it first.\n" "$1" >&2
|
||||||
|
exit 127
|
||||||
|
}
|
||||||
|
}
|
||||||
|
need_cmd mmsg
|
||||||
|
need_cmd jq
|
||||||
|
need_cmd awk
|
||||||
|
need_cmd wc
|
||||||
|
need_cmd sed
|
||||||
|
|
||||||
|
# 3️⃣ Get the *currently focused* client.
|
||||||
|
client_json=$(mmsg get focusing-client || true)
|
||||||
|
|
||||||
|
# 3a️⃣ Extract the window's unique id (used as the per-window state key)
|
||||||
|
win_id=$(printf '%s' "$client_json" | jq -r '.id // empty' || true)
|
||||||
|
if [ -z "$win_id" ]; then
|
||||||
|
printf "⚠️ Could not determine window id – aborting.\n" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Per-window state file
|
||||||
|
PROPORTION_FILE="$PROPORTION_DIR/$win_id"
|
||||||
|
|
||||||
|
# 3b️⃣ Extract current client width
|
||||||
|
current=$(printf '%s' "$client_json" | jq -r '.width // empty' || true)
|
||||||
|
|
||||||
|
if [ -z "$current" ]; then
|
||||||
|
printf "⚠️ No focusing client reported – using monitor width as current size.\n"
|
||||||
|
current=$(mmsg get all-monitors | jq -r '
|
||||||
|
if type == "array" then
|
||||||
|
(map(select(.active == true))[0].width)
|
||||||
|
else
|
||||||
|
(.monitors | map(select(.active == true))[0].width)
|
||||||
|
end
|
||||||
|
' || true)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4️⃣ Get the *usable* work‑area width
|
||||||
|
usable_width=$(mmsg get workarea 2>/dev/null || true)
|
||||||
|
if [ -n "$usable_width" ]; then
|
||||||
|
usable_width=$(printf '%s' "$usable_width" | jq -r '.width // empty')
|
||||||
|
fi
|
||||||
|
if [ -z "$usable_width" ]; then
|
||||||
|
usable_width=$(mmsg get all-monitors | jq -r '
|
||||||
|
if type == "array" then
|
||||||
|
(map(select(.active == true))[0].width)
|
||||||
|
else
|
||||||
|
(.monitors | map(select(.active == true))[0].width)
|
||||||
|
end
|
||||||
|
')
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5️⃣ Compute the proportion
|
||||||
|
approx=$(awk -v cw="$current" -v uw="$usable_width" '
|
||||||
|
BEGIN {
|
||||||
|
if (uw <= 0) { print "0.50"; exit }
|
||||||
|
printf "%.4f\n", cw / uw
|
||||||
|
}')
|
||||||
|
|
||||||
|
# 6️⃣ Find the nearest preset index
|
||||||
|
nearest_index=$(awk -v target="$approx" '
|
||||||
|
BEGIN {
|
||||||
|
split("'"$PRESETS"'", a, " ");
|
||||||
|
best_i = 1;
|
||||||
|
best_d = 999;
|
||||||
|
for (i = 1; i <= length(a); i++) {
|
||||||
|
d = a[i] - target;
|
||||||
|
if (d < 0) d = -d;
|
||||||
|
if (d < best_d) {
|
||||||
|
best_d = d;
|
||||||
|
best_i = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print best_i;
|
||||||
|
}')
|
||||||
|
|
||||||
|
# 7️⃣ Apply the direction argument
|
||||||
|
case "${1:-}" in
|
||||||
|
up) new_index=$((nearest_index + 1)) ;;
|
||||||
|
down) new_index=$((nearest_index - 1)) ;;
|
||||||
|
fullscreen)
|
||||||
|
# Check if currently fullscreen (approx >= 0.95 → treat as fullscreen)
|
||||||
|
is_fullscreen=$(awk -v a="$approx" 'BEGIN { print (a >= 0.95) ? "1" : "0" }')
|
||||||
|
if [ "$is_fullscreen" = "1" ]; then
|
||||||
|
# Currently fullscreen → restore this window's saved proportion
|
||||||
|
if [ -f "$PROPORTION_FILE" ]; then
|
||||||
|
saved=$(cat "$PROPORTION_FILE")
|
||||||
|
mmsg dispatch "set_proportion,$saved"
|
||||||
|
printf "✅ [win %s] Restored proportion to %s (fullscreen toggle off)\n" "$win_id" "$saved"
|
||||||
|
rm -f "$PROPORTION_FILE"
|
||||||
|
else
|
||||||
|
printf "⚠️ [win %s] No saved proportion – defaulting to 0.50\n" "$win_id" >&2
|
||||||
|
mmsg dispatch "set_proportion,0.50"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Not fullscreen → save this window's proportion & go fullscreen
|
||||||
|
saved=$(printf '%s\n' $PRESETS | sed -n "${nearest_index}p")
|
||||||
|
mkdir -p "$PROPORTION_DIR"
|
||||||
|
printf '%s' "$saved" > "$PROPORTION_FILE"
|
||||||
|
mmsg dispatch "set_proportion,1.00"
|
||||||
|
printf "✅ [win %s] Saved proportion %s, set to 1.00 (fullscreen toggle on)\n" "$win_id" "$saved"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*) printf "❌ Usage: %s [up|down|fullscreen]\n" "$0" >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# 8️⃣ Clamp
|
||||||
|
count=$(printf '%s\n' $PRESETS | wc -l)
|
||||||
|
if [ "$new_index" -lt 1 ]; then new_index=1; fi
|
||||||
|
if [ "$new_index" -gt "$count" ]; then new_index=$count; fi
|
||||||
|
|
||||||
|
# 9️⃣ Resolve the new preset value
|
||||||
|
new_value=$(printf '%s\n' $PRESETS | sed -n "${new_index}p")
|
||||||
|
|
||||||
|
# 🔟 Dispatch
|
||||||
|
mmsg dispatch "set_proportion,$new_value"
|
||||||
|
printf "✅ Set proportion to %s (preset %s of %s)\n" "$new_value" "$new_index" "$count"
|
||||||
@ -15,7 +15,9 @@
|
|||||||
system,
|
system,
|
||||||
pam-fprint-grosshack-pkg,
|
pam-fprint-grosshack-pkg,
|
||||||
...
|
...
|
||||||
}: {
|
}: let
|
||||||
|
kernel-pinned = import inputs.pinned-kernel {inherit system;};
|
||||||
|
in {
|
||||||
#Assign Swap to the PC
|
#Assign Swap to the PC
|
||||||
swapDevices = [
|
swapDevices = [
|
||||||
{
|
{
|
||||||
@ -25,7 +27,15 @@
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
nix = {
|
nix = {
|
||||||
settings.nix-path = config.nix.nixPath;
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "--delete-older-than 14d";
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
auto-optimise-store = true;
|
||||||
|
nix-path = config.nix.nixPath;
|
||||||
|
};
|
||||||
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
|
nixPath = ["nixpkgs=${inputs.nixpkgs}"];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -46,7 +56,7 @@
|
|||||||
|
|
||||||
# Bootloader.
|
# Bootloader.
|
||||||
boot = {
|
boot = {
|
||||||
kernelPackages = pkgs.linuxPackages_latest;
|
kernelPackages = kernel-pinned.linuxPackages_latest;
|
||||||
kernelParams = ["quiet" "splash"];
|
kernelParams = ["quiet" "splash"];
|
||||||
initrd = {
|
initrd = {
|
||||||
systemd.enable = true; #For swap to automatically work
|
systemd.enable = true; #For swap to automatically work
|
||||||
@ -134,9 +144,11 @@
|
|||||||
|
|
||||||
# List services that you want to enable:
|
# List services that you want to enable:
|
||||||
services = {
|
services = {
|
||||||
fprintd.enable = true;
|
fprintd = {
|
||||||
fprintd.tod.enable = true;
|
enable = true;
|
||||||
fprintd.tod.driver = pkgs.libfprint-2-tod1-goodix;
|
tod.enable = true;
|
||||||
|
tod.driver = pkgs.libfprint-2-tod1-goodix;
|
||||||
|
};
|
||||||
|
|
||||||
fwupd.enable = true; #Allows BIOS updates
|
fwupd.enable = true; #Allows BIOS updates
|
||||||
|
|
||||||
@ -165,13 +177,15 @@
|
|||||||
pipewire.wireplumber = {
|
pipewire.wireplumber = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
"10-bluez-monitor.properties" = {
|
"10-disable-hfp" = {
|
||||||
"bluez5.msbc-support" = false;
|
"monitor.bluez.properties" = {
|
||||||
"bluez5.hfphsp-support" = false;
|
"bluez5.enable-msbc" = false;
|
||||||
"bluez5.hfphsp-backend" = "none"; # Key addition: no backend
|
"bluez5.roles" = ["a2dp_sink" "a2dp_source"];
|
||||||
"bluez5.roles" = ["a2dp_sink"];
|
"bluez5.enable-hw-volume" = true;
|
||||||
|
"bluez5.enable-sbc-xq" = true;
|
||||||
};
|
};
|
||||||
"11-bluetooth-policy" = {
|
};
|
||||||
|
"11-no-autoswitch" = {
|
||||||
"wireplumber.settings" = {
|
"wireplumber.settings" = {
|
||||||
"bluetooth.autoswitch-to-headset-profile" = false;
|
"bluetooth.autoswitch-to-headset-profile" = false;
|
||||||
};
|
};
|
||||||
@ -186,10 +200,15 @@
|
|||||||
openssh.enable = true;
|
openssh.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.services.fprintd = {
|
systemd = {
|
||||||
|
tmpfiles.rules = [
|
||||||
|
"L+ /var/lib/assets - - - - ${inputs.cookiez-assets}"
|
||||||
|
];
|
||||||
|
services.fprintd = {
|
||||||
wantedBy = ["multi-user.target"];
|
wantedBy = ["multi-user.target"];
|
||||||
serviceConfig.Type = "simple";
|
serviceConfig.Type = "simple";
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
fonts = {
|
fonts = {
|
||||||
fontDir.enable = true;
|
fontDir.enable = true;
|
||||||
@ -304,7 +323,7 @@
|
|||||||
users.users.${username} = {
|
users.users.${username} = {
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
description = "Cookiez";
|
description = "Cookiez";
|
||||||
extraGroups = ["networkmanager" "wheel" "docker" "gamemode"];
|
extraGroups = ["networkmanager" "wheel" "docker" "gamemode" "dialout" "tty"];
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
#User Packages Here
|
#User Packages Here
|
||||||
];
|
];
|
||||||
@ -342,28 +361,31 @@
|
|||||||
security = {
|
security = {
|
||||||
sudo.wheelNeedsPassword = false;
|
sudo.wheelNeedsPassword = false;
|
||||||
|
|
||||||
pam.services = {
|
pam.services = let
|
||||||
login.fprintAuth = false;
|
fprintPam = ''
|
||||||
sudo.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
|
|
||||||
kscreenlocker.fprintAuth = true;
|
|
||||||
polkit-1.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
|
|
||||||
kde.fprintAuth = false;
|
|
||||||
hyprlock = {};
|
|
||||||
|
|
||||||
sddm = {
|
|
||||||
fprintAuth = false; # prevent NixOS from adding its own pam_fprintd block
|
|
||||||
|
|
||||||
text = lib.mkForce ''
|
|
||||||
auth sufficient ${pam-fprint-grosshack-pkg}/lib/security/pam_fprintd_grosshack.so
|
auth sufficient ${pam-fprint-grosshack-pkg}/lib/security/pam_fprintd_grosshack.so
|
||||||
auth sufficient pam_unix.so try_first_pass nullok
|
auth sufficient pam_unix.so try_first_pass nullok
|
||||||
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so
|
auth sufficient ${pkgs.fprintd}/lib/security/pam_fprintd.so timeout=0
|
||||||
|
|
||||||
account required pam_unix.so
|
account required pam_unix.so
|
||||||
password required pam_deny.so
|
password required pam_deny.so
|
||||||
|
|
||||||
session required pam_unix.so
|
session required pam_unix.so
|
||||||
session optional ${pkgs.systemd}/lib/security/pam_systemd.so
|
session optional ${pkgs.systemd}/lib/security/pam_systemd.so
|
||||||
'';
|
'';
|
||||||
|
in {
|
||||||
|
login.fprintAuth = false;
|
||||||
|
sudo.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
|
||||||
|
kscreenlocker.fprintAuth = true;
|
||||||
|
polkit-1.fprintAuth = false; #Disabled because of security risk: https://nvd.nist.gov/vuln/detail/cve-2024-37408
|
||||||
|
kde.fprintAuth = false;
|
||||||
|
hyprlock = {
|
||||||
|
text = lib.mkForce fprintPam;
|
||||||
|
};
|
||||||
|
|
||||||
|
sddm = {
|
||||||
|
fprintAuth = false; # prevent NixOS from adding its own pam_fprintd block
|
||||||
|
|
||||||
|
text = lib.mkForce fprintPam;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -375,9 +397,8 @@
|
|||||||
max-substitution-jobs = 32;
|
max-substitution-jobs = 32;
|
||||||
http-connections = 50;
|
http-connections = 50;
|
||||||
|
|
||||||
#Both needed for sleepy-launcher to work
|
extra-substituters = ["https://ezkea.cachix.org" "https://noctalia.cachix.org" "https://nix-community.cachix.org"];
|
||||||
extra-substituters = ["https://ezkea.cachix.org" "https://nix-community.cachix.org"];
|
extra-trusted-public-keys = ["ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" "noctalia.cachix.org-1:pCOR47nnMEo5thcxNDtzWpOxNFQsBRglJzxWPp3dkU4=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
|
||||||
extra-trusted-public-keys = ["ezkea.cachix.org-1:ioBmUbJTZIKsHmWWXPe1FSFbeVe+afhfgqgTSNd34eI=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# Allow unfree packages
|
# Allow unfree packages
|
||||||
|
|||||||
@ -3,22 +3,23 @@
|
|||||||
./configuration.nix
|
./configuration.nix
|
||||||
|
|
||||||
#./hardware-configuration.nix
|
#./hardware-configuration.nix
|
||||||
|
../mango
|
||||||
../plasma
|
../plasma
|
||||||
../niri
|
#../niri
|
||||||
];
|
];
|
||||||
|
|
||||||
specialisation = {
|
#specialisation = {
|
||||||
"plasma" = {
|
# "plasma" = {
|
||||||
inheritParentConfig = false;
|
# inheritParentConfig = false;
|
||||||
configuration = {
|
# configuration = {
|
||||||
imports = [
|
# imports = [
|
||||||
../plasma
|
# ../plasma
|
||||||
./configuration.nix
|
# ./configuration.nix
|
||||||
];
|
# ];
|
||||||
|
#
|
||||||
environment.etc."nixos-tags".text = "plasma";
|
# environment.etc."nixos-tags".text = "plasma";
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
|
|
||||||
# "minimal" = {
|
# "minimal" = {
|
||||||
# inheritParentConfig = false;
|
# inheritParentConfig = false;
|
||||||
@ -31,16 +32,16 @@
|
|||||||
# };
|
# };
|
||||||
# };
|
# };
|
||||||
|
|
||||||
"niri" = {
|
# "niri" = {
|
||||||
inheritParentConfig = false;
|
# inheritParentConfig = false;
|
||||||
configuration = {
|
# configuration = {
|
||||||
imports = [
|
# imports = [
|
||||||
../niri
|
# ../niri
|
||||||
./configuration.nix
|
# ./configuration.nix
|
||||||
];
|
# ];
|
||||||
|
#
|
||||||
environment.etc."nixos-tags".text = "niri";
|
# environment.etc."nixos-tags".text = "niri";
|
||||||
};
|
# };
|
||||||
};
|
# };
|
||||||
};
|
#};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,6 +74,7 @@
|
|||||||
|
|
||||||
git = {
|
git = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
lfs.enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
user = {
|
user = {
|
||||||
name = "Cookiez";
|
name = "Cookiez";
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
inputs,
|
|
||||||
username,
|
|
||||||
project,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
];
|
|
||||||
|
|
||||||
services = {
|
|
||||||
hyprpaper = {
|
|
||||||
enable = false;
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
wallpaper = [
|
|
||||||
{
|
|
||||||
monitor = "eDP-1";
|
|
||||||
path = "${inputs.cookiez-assets}/wallpapers/pixel-desert.png";
|
|
||||||
fit_mode = "cover"; # optional, defaults to cover
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -18,7 +18,8 @@
|
|||||||
|
|
||||||
# --- Help text ---
|
# --- Help text ---
|
||||||
print_help = ''
|
print_help = ''
|
||||||
echo "NixOS CLI Utility -- version 2.1.3"
|
print_help() {
|
||||||
|
echo "NixOS CLI Utility"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Usage: ncli [command]"
|
echo "Usage: ncli [command]"
|
||||||
echo ""
|
echo ""
|
||||||
@ -45,6 +46,7 @@
|
|||||||
echo ""
|
echo ""
|
||||||
echo " help - Show this help message."
|
echo " help - Show this help message."
|
||||||
echo ""
|
echo ""
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
pkgs.writeShellScriptBin "ncli" ''
|
pkgs.writeShellScriptBin "ncli" ''
|
||||||
@ -70,6 +72,7 @@ in
|
|||||||
${lib.print_success}
|
${lib.print_success}
|
||||||
${lib.print_error}
|
${lib.print_error}
|
||||||
${lib.print_info}
|
${lib.print_info}
|
||||||
|
${print_help}
|
||||||
|
|
||||||
# --- Main Logic ---
|
# --- Main Logic ---
|
||||||
if [ "$#" -eq 0 ]; then
|
if [ "$#" -eq 0 ]; then
|
||||||
@ -122,7 +125,7 @@ in
|
|||||||
${dev.dev_case}
|
${dev.dev_case}
|
||||||
;;
|
;;
|
||||||
help)
|
help)
|
||||||
${print_help}
|
print_help
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Error: Invalid command '$1'" >&2
|
echo "Error: Invalid command '$1'" >&2
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
# ncli/commands/dev.nix — dev init / track / untrack
|
# ncli/commands/dev.nix — dev init / track / untrack
|
||||||
lib:
|
lib: {
|
||||||
|
|
||||||
{
|
|
||||||
dev_case = ''
|
dev_case = ''
|
||||||
# Only flake files need assume-unchanged (Nix requires them in the index).
|
# Only flake files need assume-unchanged (Nix requires them in the index).
|
||||||
# .envrc and .direnv are handled via .git/info/exclude instead.
|
# .envrc and .direnv are handled via .git/info/exclude instead.
|
||||||
@ -323,14 +321,14 @@ lib:
|
|||||||
|
|
||||||
if [[ "$GIT_CHOICE" =~ ^[Yy]$ ]]; then
|
if [[ "$GIT_CHOICE" =~ ^[Yy]$ ]]; then
|
||||||
cat > "$TARGET_ABS/flake.lock" << 'FLAKE_LOCK_EOF'
|
cat > "$TARGET_ABS/flake.lock" << 'FLAKE_LOCK_EOF'
|
||||||
{
|
{
|
||||||
"nodes": {
|
"nodes": {
|
||||||
"root": {}
|
"root": {}
|
||||||
},
|
},
|
||||||
"root": "root",
|
"root": "root",
|
||||||
"version": 7
|
"version": 7
|
||||||
}
|
}
|
||||||
FLAKE_LOCK_EOF
|
FLAKE_LOCK_EOF
|
||||||
print_success "flake.lock ready (Nix will populate it on first run if empty)"
|
print_success "flake.lock ready (Nix will populate it on first run if empty)"
|
||||||
|
|
||||||
git -C "$TARGET_ABS" add --intent-to-add flake.nix flake.lock
|
git -C "$TARGET_ABS" add --intent-to-add flake.nix flake.lock
|
||||||
@ -362,6 +360,5 @@ FLAKE_LOCK_EOF
|
|||||||
;;
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,7 @@
|
|||||||
# ncli/commands/git.nix — commit, push, pull, status, format
|
# ncli/commands/git.nix — commit, push, pull, status, format
|
||||||
lib:
|
lib: let
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) project;
|
inherit (lib) project;
|
||||||
in
|
in {
|
||||||
{
|
|
||||||
commit_case = ''
|
commit_case = ''
|
||||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||||
if [ "$#" -lt 2 ]; then
|
if [ "$#" -lt 2 ]; then
|
||||||
@ -20,29 +17,24 @@ in
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
git add -A && git commit -m "$commit_msg"
|
git add -A && git commit -m "$commit_msg"
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
push_case = ''
|
push_case = ''
|
||||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||||
git push origin $(git branch --show-current)
|
git push origin $(git branch --show-current)
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
pull_case = ''
|
pull_case = ''
|
||||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||||
git pull origin $(git branch --show-current)
|
git pull origin $(git branch --show-current)
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
status_case = ''
|
status_case = ''
|
||||||
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
cd "$HOME/${project}" || { echo "Error: Could not change to $HOME/${project}"; exit 1; }
|
||||||
git status
|
git status
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
format_case = ''
|
format_case = ''
|
||||||
nix fmt .
|
nix fmt .
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,7 @@
|
|||||||
# ncli/commands/maintenance.nix — cleanup, diag, list-gens, trim, home-backups
|
# ncli/commands/maintenance.nix — cleanup, diag, list-gens, trim, home-backups
|
||||||
lib:
|
lib: let
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) project;
|
inherit (lib) project;
|
||||||
in
|
in {
|
||||||
{
|
|
||||||
cleanup_case = ''
|
cleanup_case = ''
|
||||||
echo "Warning! This will remove old generations of your system."
|
echo "Warning! This will remove old generations of your system."
|
||||||
read -p "How many generations to keep (default: all)? " keep_count
|
read -p "How many generations to keep (default: all)? " keep_count
|
||||||
@ -33,7 +30,6 @@ in
|
|||||||
echo "Cleaning up old log files..." >> "$LOG_FILE"
|
echo "Cleaning up old log files..." >> "$LOG_FILE"
|
||||||
find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
|
find "$LOG_DIR" -type f -mtime +3 -name "*.log" -delete >> "$LOG_FILE" 2>&1
|
||||||
echo "Cleanup process logged to $LOG_FILE"
|
echo "Cleanup process logged to $LOG_FILE"
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
diag_case = ''
|
diag_case = ''
|
||||||
@ -50,7 +46,6 @@ in
|
|||||||
echo ""
|
echo ""
|
||||||
} > "$HOME/diag.txt"
|
} > "$HOME/diag.txt"
|
||||||
echo "Diagnostic report saved to $HOME/diag.txt"
|
echo "Diagnostic report saved to $HOME/diag.txt"
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
list_gens_case = ''
|
list_gens_case = ''
|
||||||
@ -59,7 +54,6 @@ in
|
|||||||
echo ""
|
echo ""
|
||||||
echo "--- System Generations ---"
|
echo "--- System Generations ---"
|
||||||
nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations."
|
nix profile history --profile /nix/var/nix/profiles/system | cat || echo "Could not list system generations."
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
trim_case = ''
|
trim_case = ''
|
||||||
@ -73,11 +67,9 @@ in
|
|||||||
else
|
else
|
||||||
echo "Trim operation cancelled."
|
echo "Trim operation cancelled."
|
||||||
fi
|
fi
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
home_backups_case = ''
|
home_backups_case = ''
|
||||||
ls -a ~ | grep backup
|
ls -a ~ | grep backup
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,7 @@
|
|||||||
# ncli/commands/rebuild.nix — Rebuild + Update logic
|
# ncli/commands/rebuild.nix — Rebuild + Update logic
|
||||||
lib:
|
lib: let
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib) host project handle_backups handle_build_error;
|
inherit (lib) host project handle_backups handle_build_error;
|
||||||
in
|
in rec {
|
||||||
{
|
|
||||||
# Shared rebuild snippet used by both `rebuild` and `update`
|
# Shared rebuild snippet used by both `rebuild` and `update`
|
||||||
rebuild_logic = ''
|
rebuild_logic = ''
|
||||||
handle_backups
|
handle_backups
|
||||||
@ -21,12 +18,21 @@ in
|
|||||||
${rebuild_logic}
|
${rebuild_logic}
|
||||||
echo -e "Starting NixOS rebuild for current host: ${host} on generation: $YELLOW$geno$NOCOLOR"
|
echo -e "Starting NixOS rebuild for current host: ${host} on generation: $YELLOW$geno$NOCOLOR"
|
||||||
|
|
||||||
sudo nixos-rebuild switch --flake . ; _rebuild_exit=$?
|
# Step 1: Build the configuration and safely update the bootloader first
|
||||||
|
set +e
|
||||||
|
sudo nixos-rebuild boot --flake .
|
||||||
|
_rebuild_exit=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
if [ "$_rebuild_exit" -eq 0 ]; then
|
if [ "$_rebuild_exit" -eq 0 ]; then
|
||||||
echo "✓ Rebuild finished successfully for ${host}"
|
echo "✓ Rebuild and bootloader update finished successfully for ${host}"
|
||||||
|
|
||||||
|
# Step 2: Now that boot entries are safe, activate the system live
|
||||||
|
echo "Activating new configuration..."
|
||||||
|
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
|
||||||
|
|
||||||
if [ -n "$current" ]; then
|
if [ -n "$current" ]; then
|
||||||
sudo /run/current-system/specialisation/"$current"/bin/switch-to-configuration test
|
sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
|
||||||
else
|
else
|
||||||
echo "No specialization tag found, staying on default system."
|
echo "No specialization tag found, staying on default system."
|
||||||
fi
|
fi
|
||||||
@ -38,7 +44,6 @@ in
|
|||||||
echo "✗ Rebuild failed for ${host}" >&2
|
echo "✗ Rebuild failed for ${host}" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
update_case = ''
|
update_case = ''
|
||||||
@ -110,12 +115,21 @@ in
|
|||||||
echo "Rebuilding system... Staying on current specialization"
|
echo "Rebuilding system... Staying on current specialization"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sudo nixos-rebuild switch --flake . ; _rebuild_exit=$?
|
# Step 1: Build the configuration and safely update the bootloader first
|
||||||
|
set +e
|
||||||
|
sudo nixos-rebuild boot --flake .
|
||||||
|
_rebuild_exit=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
if [ "$_rebuild_exit" -eq 0 ]; then
|
if [ "$_rebuild_exit" -eq 0 ]; then
|
||||||
echo "✓ Update and rebuild finished successfully for ${host}"
|
echo "✓ Update, rebuild and bootloader update finished successfully for ${host}"
|
||||||
|
|
||||||
|
# Step 2: Now that boot entries are safe, activate the system live
|
||||||
|
echo "Activating new configuration..."
|
||||||
|
sudo /nix/var/nix/profiles/system/bin/switch-to-configuration switch
|
||||||
|
|
||||||
if [ -n "$current" ]; then
|
if [ -n "$current" ]; then
|
||||||
sudo /run/current-system/specialisation/"$current"/bin/switch-to-configuration test
|
sudo /nix/var/nix/profiles/system/specialisation/"$current"/bin/switch-to-configuration test
|
||||||
else
|
else
|
||||||
echo "No specialization tag found, staying on default system."
|
echo "No specialization tag found, staying on default system."
|
||||||
fi
|
fi
|
||||||
@ -127,6 +141,5 @@ in
|
|||||||
echo "✗ Update and rebuild failed for ${host}" >&2
|
echo "✗ Update and rebuild failed for ${host}" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,5 @@
|
|||||||
# ncli/commands/switch.nix — Specialization switching
|
# ncli/commands/switch.nix — Specialization switching
|
||||||
lib:
|
lib: {
|
||||||
|
|
||||||
{}:
|
|
||||||
|
|
||||||
{
|
|
||||||
switch_case = ''
|
switch_case = ''
|
||||||
current=""
|
current=""
|
||||||
if [ -f /etc/nixos-tags ]; then
|
if [ -f /etc/nixos-tags ]; then
|
||||||
@ -35,6 +31,5 @@ lib:
|
|||||||
echo "To switch to a specialization, run: 'ncli switch <tag>'"
|
echo "To switch to a specialization, run: 'ncli switch <tag>'"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,3 @@
|
|||||||
# ncli/default.nix — Entry point
|
|
||||||
# Usage in your flake:
|
|
||||||
# ncli = import ./ncli { inherit pkgs host project; };
|
|
||||||
# environment.systemPackages = [ ncli ];
|
|
||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
host,
|
host,
|
||||||
|
|||||||
@ -13,23 +13,26 @@ in
|
|||||||
|
|
||||||
# --- Backup helper ---
|
# --- Backup helper ---
|
||||||
handle_backups = ''
|
handle_backups = ''
|
||||||
if [ ''${#BACKUP_FILES[@]} -eq 0 ]; then
|
handle_backups() {
|
||||||
echo "No backup files configured to check."
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Checking for backup files to remove..."
|
echo "Checking for backup files to remove..."
|
||||||
|
found=0
|
||||||
for file_path in "''${BACKUP_FILES[@]}"; do
|
for file_path in "''${BACKUP_FILES[@]}"; do
|
||||||
full_path="$HOME/$file_path"
|
full_path="$HOME/$file_path"
|
||||||
if [ -f "$full_path" ]; then
|
if [ -f "$full_path" ]; then
|
||||||
echo "Removing stale backup file: $full_path"
|
echo "Removing stale backup file: $full_path"
|
||||||
rm "$full_path"
|
rm "$full_path"
|
||||||
|
found=1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
if [ "$found" -eq 0 ]; then
|
||||||
|
echo "No stale backup files found."
|
||||||
|
fi
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# --- OOM / build error handler ---
|
# --- OOM / build error handler ---
|
||||||
handle_build_error = ''
|
handle_build_error = ''
|
||||||
|
handle_build_error() {
|
||||||
local exit_code=$?
|
local exit_code=$?
|
||||||
if [ "$exit_code" -eq 137 ]; then
|
if [ "$exit_code" -eq 137 ]; then
|
||||||
echo ""
|
echo ""
|
||||||
@ -51,26 +54,35 @@ in
|
|||||||
echo " journalctl -k --since '5 minutes ago' | grep -i oom"
|
echo " journalctl -k --since '5 minutes ago' | grep -i oom"
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# --- Print helpers (used by dev init) ---
|
# --- Print helpers (used by dev init) ---
|
||||||
print_header = ''
|
print_header = ''
|
||||||
|
print_header() {
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
||||||
echo -e "''${BLUE} Nix Flake Development Environment Initializer''${NOCOLOR}"
|
echo -e "''${BLUE} Nix Flake Development Environment Initializer''${NOCOLOR}"
|
||||||
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
echo -e "''${BLUE}==============================================''${NOCOLOR}"
|
||||||
echo ""
|
echo ""
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
print_success = ''
|
print_success = ''
|
||||||
|
print_success() {
|
||||||
echo -e "''${GREEN}[OK]''${NOCOLOR} $1"
|
echo -e "''${GREEN}[OK]''${NOCOLOR} $1"
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
print_error = ''
|
print_error = ''
|
||||||
|
print_error() {
|
||||||
echo -e "''${RED}[ERR]''${NOCOLOR} $1"
|
echo -e "''${RED}[ERR]''${NOCOLOR} $1"
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
print_info = ''
|
print_info = ''
|
||||||
|
print_info() {
|
||||||
echo -e "''${YELLOW}[->]''${NOCOLOR} $1"
|
echo -e "''${YELLOW}[->]''${NOCOLOR} $1"
|
||||||
|
}
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
{
|
{
|
||||||
config,
|
|
||||||
inputs,
|
inputs,
|
||||||
pkgs,
|
pkgs,
|
||||||
...
|
...
|
||||||
@ -7,11 +6,7 @@
|
|||||||
imports = [
|
imports = [
|
||||||
];
|
];
|
||||||
|
|
||||||
home-manager.sharedModules = [
|
|
||||||
./home.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
hyprpaper
|
inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
9
modules/noctalia/home.nix
Normal file
9
modules/noctalia/home.nix
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{inputs, ...}: {
|
||||||
|
imports = [
|
||||||
|
inputs.noctalia.homeModules.default
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.noctalia = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -11,9 +11,7 @@
|
|||||||
#Essentials (CLI Only)
|
#Essentials (CLI Only)
|
||||||
wget #A tool for quickly downloading things from the Web
|
wget #A tool for quickly downloading things from the Web
|
||||||
#javaPackages.compiler.openjdk25 #Java Development Kit 25
|
#javaPackages.compiler.openjdk25 #Java Development Kit 25
|
||||||
#python314 #Python
|
python3 #Python
|
||||||
#python314Packages.pip #Pip for Python 3.12
|
|
||||||
#python314Packages.cmake #The CMake tool to manage project build configurations
|
|
||||||
fastfetch #A utility to see information about your machine
|
fastfetch #A utility to see information about your machine
|
||||||
btop #A replacement for htop to see your machines resources
|
btop #A replacement for htop to see your machines resources
|
||||||
git #Git ... no need to explain
|
git #Git ... no need to explain
|
||||||
|
|||||||
@ -15,9 +15,15 @@
|
|||||||
stylix = {
|
stylix = {
|
||||||
enable = true;
|
enable = true;
|
||||||
autoEnable = false; #So I can choose my programs it targets myself!
|
autoEnable = false; #So I can choose my programs it targets myself!
|
||||||
#image = ../../other/wallpaper2.png;
|
#image = "${inputs.cookiez-assets}/wallpapers/beach-forest.png";
|
||||||
#autoEnable = true; #Auto generate theme based on wallpaper
|
#polarity = "dark"; # "dark" or "light"
|
||||||
base16Scheme = "${pkgs.base16-schemes}/share/themes/dracula.yaml";
|
base16Scheme = "${pkgs.base16-schemes}/share/themes/dracula.yaml";
|
||||||
|
#override = {
|
||||||
|
# base05 = "e0e0e0"; # default text — light grey (no # prefix!)
|
||||||
|
# base04 = "b0b0b0"; # secondary/muted text
|
||||||
|
# base06 = "f5f5f5"; # lighter text variant
|
||||||
|
#};
|
||||||
|
|
||||||
opacity = {
|
opacity = {
|
||||||
desktop = 0.5;
|
desktop = 0.5;
|
||||||
terminal = 0.9;
|
terminal = 0.9;
|
||||||
@ -43,7 +49,8 @@
|
|||||||
plymouth.logoAnimated = true;
|
plymouth.logoAnimated = true;
|
||||||
console.enable = true; #Default console without desktop environment! (NOT KITTY!)
|
console.enable = true; #Default console without desktop environment! (NOT KITTY!)
|
||||||
grub.enable = false;
|
grub.enable = false;
|
||||||
#qt.enable = false;
|
qt.enable = true;
|
||||||
|
gtk.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
|
#inputs.niri.homeModules.stylix
|
||||||
];
|
];
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
@ -16,10 +17,9 @@
|
|||||||
#firefox = {
|
#firefox = {
|
||||||
# enable = true;
|
# enable = true;
|
||||||
# colorTheme.enable = true;
|
# colorTheme.enable = true;
|
||||||
# profileNames = [ "${username}" ];
|
# profileNames = ["${username}"];
|
||||||
#};
|
#};
|
||||||
qt.enable = false;
|
#niri.enable = true;
|
||||||
qt.platform = "kde";
|
|
||||||
#kde.enable = false;
|
#kde.enable = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,153 +0,0 @@
|
|||||||
{
|
|
||||||
"layer": "top",
|
|
||||||
"position": "top",
|
|
||||||
"modules-left": [
|
|
||||||
"custom/launcher",
|
|
||||||
"hyprland/workspaces",
|
|
||||||
"cpu",
|
|
||||||
"memory"
|
|
||||||
|
|
||||||
],
|
|
||||||
"modules-center": [
|
|
||||||
"hyprland/window"
|
|
||||||
],
|
|
||||||
"spacing": 4,
|
|
||||||
"modules-right": [
|
|
||||||
"tray",
|
|
||||||
"wireplumber",
|
|
||||||
"network",
|
|
||||||
"backlight",
|
|
||||||
"clock",
|
|
||||||
"battery",
|
|
||||||
"custom/power"
|
|
||||||
],
|
|
||||||
"backlight": {
|
|
||||||
"device": "intel_backlight",
|
|
||||||
"format": "{percent}% {icon}",
|
|
||||||
"format-icons": ["", ""]
|
|
||||||
},
|
|
||||||
"hyprland/workspaces": {
|
|
||||||
"format": "{name}",
|
|
||||||
"persistent-workspaces": {
|
|
||||||
"1": [],
|
|
||||||
"2": [],
|
|
||||||
"3": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"hyprland/window": {
|
|
||||||
"icon": false,
|
|
||||||
"separate-outputs": true,
|
|
||||||
"format": "{}"
|
|
||||||
},
|
|
||||||
"tray": {
|
|
||||||
"icon-size": 15,
|
|
||||||
"spacing": 7
|
|
||||||
},
|
|
||||||
"clock": {
|
|
||||||
"format": "{:%H:%M} ",
|
|
||||||
"format-alt": "{:%A, %B %d, %Y (%R)}",
|
|
||||||
"tooltip-format": "<tt><small>{calendar}</small></tt>",
|
|
||||||
"calendar": {
|
|
||||||
"mode": "year",
|
|
||||||
"mode-mon-col": 3,
|
|
||||||
"weeks-pos": "right",
|
|
||||||
"on-scroll": 1,
|
|
||||||
"on-click-right": "mode",
|
|
||||||
"format": {
|
|
||||||
"months": "<span color='#f5e0dc'><b>{}</b></span>",
|
|
||||||
"days": "<span color='#cdd6f4'><b>{}</b></span>",
|
|
||||||
"weeks": "<span color='#fab387'><b>W{}</b></span>",
|
|
||||||
"weekdays": "<span color='#f5c2e7'><b>{}</b></span>",
|
|
||||||
"today": "<span color='#cba6f7'><b><u>{}</u></b></span>"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"actions": {
|
|
||||||
"on-click-right": "mode",
|
|
||||||
"on-click-forward": "tz_up",
|
|
||||||
"on-click-backward": "tz_down",
|
|
||||||
"on-scroll-up": "shift_up",
|
|
||||||
"on-scroll-down": "shift_down"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"cpu": {
|
|
||||||
"interval": 1,
|
|
||||||
"format": "CPU {usage:>2}% {icon0}{icon1}{icon2}{icon3}",
|
|
||||||
"format-icons": [
|
|
||||||
"▁",
|
|
||||||
"▂",
|
|
||||||
"▃",
|
|
||||||
"▄",
|
|
||||||
"▅",
|
|
||||||
"▆",
|
|
||||||
"▇",
|
|
||||||
"█"
|
|
||||||
],
|
|
||||||
"on-click": "kitty -e btop"
|
|
||||||
},
|
|
||||||
"memory": {
|
|
||||||
"interval": 30,
|
|
||||||
"format": "MEM {used:0.1f}G/{total:0.1f}G"
|
|
||||||
},
|
|
||||||
"network": {
|
|
||||||
"format": " Disabled",
|
|
||||||
"format-wifi": " ",
|
|
||||||
"format-ethernet": " ",
|
|
||||||
"format-disconnected": "⚠",
|
|
||||||
"tooltip": true,
|
|
||||||
"tooltip-format": "{ifname}\n{ipaddr}",
|
|
||||||
"tooltip-format-wifi": "{essid} {ifname}\n{ipaddr}\nstrength: {signalStrength}%",
|
|
||||||
"on-click": "networkmanager_dmenu"
|
|
||||||
},
|
|
||||||
"custom/launcher": {
|
|
||||||
"format": " ",
|
|
||||||
"tooltip": false,
|
|
||||||
"on-click": "wofi -c ~/.config/wofi/config -I"
|
|
||||||
},
|
|
||||||
"custom/power": {
|
|
||||||
"format": " ",
|
|
||||||
"on-click": "~/.config/wofi/scripts/power.sh",
|
|
||||||
"tooltip": false
|
|
||||||
},
|
|
||||||
"wireplumber": {
|
|
||||||
"scroll-step": 10,
|
|
||||||
"format": "{volume}% {icon} ",
|
|
||||||
"format-bluetooth": "{icon} {volume}%",
|
|
||||||
"format-muted": "muted ",
|
|
||||||
"on-click": "pavucontrol",
|
|
||||||
"format-icons": {
|
|
||||||
"headphones": "",
|
|
||||||
"handsfree": "",
|
|
||||||
"headset": "",
|
|
||||||
"phone": "",
|
|
||||||
"portable": "",
|
|
||||||
"car": "",
|
|
||||||
"default": [
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"battery": {
|
|
||||||
"states": {
|
|
||||||
"warning": 30,
|
|
||||||
"critical": 15
|
|
||||||
},
|
|
||||||
"format": "{capacity}% {icon}",
|
|
||||||
"format-charging": " {capacity}%",
|
|
||||||
"format-pluged": " {capacity}%",
|
|
||||||
"format-full": " {capacity}%",
|
|
||||||
"format-icons": [
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
"",
|
|
||||||
""
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
{...}: {
|
|
||||||
# xdg.configFile."waybar/config.jsonc".source = ./config.jsonc;
|
|
||||||
# xdg.configFile."waybar/style.css".source = ./style.css;
|
|
||||||
}
|
|
||||||
@ -1,167 +0,0 @@
|
|||||||
* {
|
|
||||||
font-family: "JetBrainsMono Nerd Font", sans-serif;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
window > box {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-left: 10px;
|
|
||||||
margin-right: 10px;
|
|
||||||
padding-left: 4px;
|
|
||||||
padding-right: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#window {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 12px 8px 8px;
|
|
||||||
margin: 0px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
window#waybar.empty #window {
|
|
||||||
background: rgba(12, 12, 12, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-left {
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-right {
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modules-center {
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
min-height: 0;
|
|
||||||
padding: 0 7px;
|
|
||||||
margin-right: 2px;
|
|
||||||
color: #f5e0dc;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.urgent {
|
|
||||||
color: #f5e0dc;
|
|
||||||
animation-name: blink;
|
|
||||||
animation-duration: 0.5s;
|
|
||||||
animation-timing-function: linear;
|
|
||||||
animation-iteration-count: infinite;
|
|
||||||
animation-direction: alternate;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.empty {
|
|
||||||
color: #cdd6f4;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.visible {
|
|
||||||
color: #89dceb;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button.active {
|
|
||||||
color: #fab387;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes blink {
|
|
||||||
to {
|
|
||||||
color: #202020;
|
|
||||||
background-color: #dcf5f3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-launcher {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 8px 8px 4px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #89dceb;
|
|
||||||
}
|
|
||||||
|
|
||||||
#custom-power {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 12px 8px 8px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#cpu {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 8px 8px 20px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #f2cdcd;
|
|
||||||
}
|
|
||||||
|
|
||||||
#memory {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 8px 8px 20px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #fab387;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 8px 8px 20px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #f9e2af;
|
|
||||||
}
|
|
||||||
|
|
||||||
#wireplumber.muted {
|
|
||||||
color: #f38ba8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#clock {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 10px 10px 10px;
|
|
||||||
margin: 4px 0;
|
|
||||||
color: #94e2d5;
|
|
||||||
}
|
|
||||||
|
|
||||||
#network {
|
|
||||||
background-color: #202020;
|
|
||||||
color: #cdd6f4;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#network.disabled {
|
|
||||||
color: #f38ba8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tray {
|
|
||||||
background-color: #202020;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px 12px 8px 12px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#battery {
|
|
||||||
background-color: #202020;
|
|
||||||
color: #cdd6f4;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#backlight {
|
|
||||||
background-color: #202020;
|
|
||||||
color: #cdd6f4;
|
|
||||||
border-radius: 20px;
|
|
||||||
padding: 8px;
|
|
||||||
margin: 4px 0;
|
|
||||||
}
|
|
||||||
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
config,
|
config,
|
||||||
|
inputs,
|
||||||
pkgs,
|
pkgs,
|
||||||
username,
|
username,
|
||||||
project,
|
project,
|
||||||
@ -7,31 +8,8 @@
|
|||||||
}: {
|
}: {
|
||||||
#To show logs of services run:
|
#To show logs of services run:
|
||||||
#journalctl --user-unit={service-name} --user
|
#journalctl --user-unit={service-name} --user
|
||||||
systemd.user.services.niri-waybar = {
|
|
||||||
description = "Waybar status bar for Niri";
|
|
||||||
|
|
||||||
# "wantedBy" replaces the [Install] section
|
# The Niri Session Cleanup Service
|
||||||
wantedBy = ["graphical-session.target"];
|
|
||||||
|
|
||||||
# "partOf" and "after" replace the [Unit] section dependencies
|
|
||||||
partOf = ["graphical-session.target"];
|
|
||||||
after = ["graphical-session.target"];
|
|
||||||
|
|
||||||
# [Unit] configuration goes here
|
|
||||||
unitConfig = {
|
|
||||||
# This checks the environment variable to ensure we are in Niri
|
|
||||||
ConditionEnvironment = "XDG_CURRENT_DESKTOP=niri";
|
|
||||||
};
|
|
||||||
|
|
||||||
# [Service] configuration goes here
|
|
||||||
serviceConfig = {
|
|
||||||
ExecStart = "${pkgs.waybar}/bin/waybar";
|
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = "1s";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# 2. The Niri Session Cleanup Service
|
|
||||||
# This service starts when the graphical session starts, and when it stops,
|
# This service starts when the graphical session starts, and when it stops,
|
||||||
# it forcibly stops the graphical-session.target to ensure a clean state for the next login.
|
# it forcibly stops the graphical-session.target to ensure a clean state for the next login.
|
||||||
systemd.user.services.niri-session-manager = {
|
systemd.user.services.niri-session-manager = {
|
||||||
|
|||||||
@ -2,12 +2,12 @@
|
|||||||
config,
|
config,
|
||||||
inputs,
|
inputs,
|
||||||
pkgs,
|
pkgs,
|
||||||
|
system,
|
||||||
...
|
...
|
||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
./autostart.nix
|
./autostart.nix
|
||||||
../modules/hyprlock
|
../modules/hyprlock
|
||||||
../modules/hyprpaper
|
|
||||||
../modules/stylix
|
../modules/stylix
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -16,10 +16,8 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
#mako
|
|
||||||
fuzzel
|
|
||||||
waybar
|
|
||||||
xwayland-satellite
|
xwayland-satellite
|
||||||
|
lxsession #Needed for things like gparted
|
||||||
];
|
];
|
||||||
|
|
||||||
programs = {
|
programs = {
|
||||||
@ -33,7 +31,6 @@
|
|||||||
#services.xserver.displayManager.sddm.enable = true;
|
#services.xserver.displayManager.sddm.enable = true;
|
||||||
|
|
||||||
xdg.portal = {
|
xdg.portal = {
|
||||||
#Needed for waybar
|
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr];
|
extraPortals = [pkgs.xdg-desktop-portal-gtk pkgs.xdg-desktop-portal-wlr];
|
||||||
config.common.default = "*";
|
config.common.default = "*";
|
||||||
|
|||||||
@ -5,31 +5,13 @@
|
|||||||
}: {
|
}: {
|
||||||
imports = [
|
imports = [
|
||||||
inputs.niri.homeModules.niri
|
inputs.niri.homeModules.niri
|
||||||
../modules/waybar/home.nix
|
../modules/noctalia/home.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
xdg.configFile."mako/config".text = ''
|
|
||||||
default-timeout=5000
|
|
||||||
ignore-timeout=1
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.niri = {
|
programs.niri = {
|
||||||
package = pkgs.niri;
|
package = pkgs.niri;
|
||||||
enable = true;
|
enable = true;
|
||||||
#xwayland.enable = true;
|
|
||||||
# config = ''
|
|
||||||
# binds {
|
|
||||||
# Super+Return { spawn "kitty"; }
|
|
||||||
# Super+Space { spawn "fuzzel"; }
|
|
||||||
# Super+Q { close-window; }
|
|
||||||
# Super+Left { focus-column-left; }
|
|
||||||
# Super+Right { focus-column-right; }
|
|
||||||
# Super+Up { focus-workspace-up; }
|
|
||||||
# Super+Down { focus-workspace-down; }
|
|
||||||
# Super+L { spawn "hyprlock"; }
|
|
||||||
# Super+Shift+E { "quit"; }
|
|
||||||
# }
|
|
||||||
# '';
|
|
||||||
config = ''
|
config = ''
|
||||||
input {
|
input {
|
||||||
keyboard {
|
keyboard {
|
||||||
@ -38,6 +20,10 @@
|
|||||||
}
|
}
|
||||||
numlock
|
numlock
|
||||||
}
|
}
|
||||||
|
mouse {
|
||||||
|
accel-profile "flat"
|
||||||
|
accel-speed -0.4
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
prefer-no-csd
|
prefer-no-csd
|
||||||
@ -83,11 +69,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// spawn-at-startup "waybar"
|
spawn-at-startup "noctalia"
|
||||||
spawn-at-startup "hyprpaper"
|
spawn-at-startup "lxpolkit"
|
||||||
spawn-at-startup "${pkgs.mako}/bin/mako"
|
|
||||||
|
|
||||||
// spawn-sh-at-startup "qs -c ~/source/qs/MyAwesomeShell"
|
|
||||||
|
|
||||||
hotkey-overlay {
|
hotkey-overlay {
|
||||||
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
|
// Uncomment this line to disable the "Important Hotkeys" pop-up at startup.
|
||||||
@ -102,6 +85,11 @@
|
|||||||
draw-border-with-background false
|
draw-border-with-background false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// layer-rule {
|
||||||
|
// match namespace="^awww-daemonbackdrop$"
|
||||||
|
// place-within-backdrop true
|
||||||
|
// }
|
||||||
|
|
||||||
output "eDP-1" {
|
output "eDP-1" {
|
||||||
mode "2880x1920@120.000"
|
mode "2880x1920@120.000"
|
||||||
scale 2
|
scale 2
|
||||||
@ -111,24 +99,26 @@
|
|||||||
binds {
|
binds {
|
||||||
Mod+Shift+Minus { show-hotkey-overlay; }
|
Mod+Shift+Minus { show-hotkey-overlay; }
|
||||||
|
|
||||||
|
Mod+Shift+S hotkey-overlay-title="Make a screenshot selection" { spawn-sh "noctalia msg screenshot-region";}
|
||||||
|
|
||||||
Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
|
Mod+T hotkey-overlay-title="Open a Terminal: kitty" { spawn "kitty"; }
|
||||||
Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
|
Mod+D hotkey-overlay-title="Run an Application" { spawn-sh "noctalia msg panel-toggle launcher"; }
|
||||||
Super+L hotkey-overlay-title="Lock the Screen: hyprlock" { spawn "hyprlock"; }
|
Super+L hotkey-overlay-title="Lock the Screen" { spawn-sh "noctalia msg session lock"; }
|
||||||
|
|
||||||
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
|
Super+Alt+S allow-when-locked=true hotkey-overlay-title=null { spawn-sh "pkill orca || exec orca"; }
|
||||||
|
|
||||||
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1+ -l 1.0"; }
|
XF86AudioRaiseVolume allow-when-locked=true { spawn-sh "noctalia msg volume-up"; }
|
||||||
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "wpctl set-volume @DEFAULT_AUDIO_SINK@ 0.1-"; }
|
XF86AudioLowerVolume allow-when-locked=true { spawn-sh "noctalia msg volume-down"; }
|
||||||
XF86AudioMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; }
|
XF86AudioMute allow-when-locked=true { spawn-sh "noctalia msg volume-mute"; }
|
||||||
XF86AudioMicMute allow-when-locked=true { spawn-sh "wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; }
|
XF86AudioMicMute allow-when-locked=true { spawn-sh "noctalia msg mic-mute"; }
|
||||||
|
|
||||||
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
|
XF86AudioPlay allow-when-locked=true { spawn-sh "playerctl play-pause"; }
|
||||||
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
|
XF86AudioStop allow-when-locked=true { spawn-sh "playerctl stop"; }
|
||||||
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
|
XF86AudioPrev allow-when-locked=true { spawn-sh "playerctl previous"; }
|
||||||
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
|
XF86AudioNext allow-when-locked=true { spawn-sh "playerctl next"; }
|
||||||
|
|
||||||
XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "+10%"; }
|
XF86MonBrightnessUp allow-when-locked=true { spawn-sh "noctalia msg brightness-up"; }
|
||||||
XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "--class=backlight" "set" "10%-"; }
|
XF86MonBrightnessDown allow-when-locked=true { spawn-sh "noctalia msg brightness-down"; }
|
||||||
|
|
||||||
Mod+O repeat=false { toggle-overview; }
|
Mod+O repeat=false { toggle-overview; }
|
||||||
|
|
||||||
|
|||||||
@ -12,6 +12,11 @@
|
|||||||
description = "Automatically start Yakuake";
|
description = "Automatically start Yakuake";
|
||||||
after = ["graphical-session.target"];
|
after = ["graphical-session.target"];
|
||||||
wantedBy = ["graphical-session.target"];
|
wantedBy = ["graphical-session.target"];
|
||||||
|
|
||||||
|
unitConfig = {
|
||||||
|
ConditionEnvironment = "XDG_CURRENT_DESKTOP=KDE";
|
||||||
|
};
|
||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = ["${pkgs.kdePackages.yakuake}/bin/yakuake"];
|
ExecStart = ["${pkgs.kdePackages.yakuake}/bin/yakuake"];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user