summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-06-26 08:29:49 -0700
committerFuwn <[email protected]>2024-06-26 08:29:49 -0700
commit804df1d72b97aa638d84b663ea00ff26bab5d969 (patch)
tree1eb68c65dac7e9ce3787b562f52879f8f917041a /home
parenthi (diff)
downloadhome-manager-config-804df1d72b97aa638d84b663ea00ff26bab5d969.tar.xz
home-manager-config-804df1d72b97aa638d84b663ea00ff26bab5d969.zip
flake
Diffstat (limited to 'home')
-rw-r--r--home/fuwn/cli/ani-cli/default.nix5
-rw-r--r--home/fuwn/cli/asciinema/default.nix5
-rw-r--r--home/fuwn/cli/bat/default.nix6
-rw-r--r--home/fuwn/cli/default.nix21
-rw-r--r--home/fuwn/cli/dog/default.nix5
-rw-r--r--home/fuwn/cli/eza/default.nix7
-rw-r--r--home/fuwn/cli/fd/default.nix5
-rw-r--r--home/fuwn/cli/meta/ai/default.nix6
-rw-r--r--home/fuwn/cli/meta/default.nix10
-rw-r--r--home/fuwn/cli/meta/git/default.nix7
-rw-r--r--home/fuwn/cli/meta/irc/default.nix6
-rw-r--r--home/fuwn/cli/meta/scripting/charmbracelet/default.nix6
-rw-r--r--home/fuwn/cli/meta/scripting/default.nix11
-rw-r--r--home/fuwn/cli/meta/scripting/ripgrep/default.nix7
-rw-r--r--home/fuwn/cli/meta/shell/default.nix5
-rw-r--r--home/fuwn/cli/meta/smolnet/bollux/default.nix67
-rw-r--r--home/fuwn/cli/meta/smolnet/bollux/fix_lesskey_nag.patch13
-rw-r--r--home/fuwn/cli/meta/smolnet/default.nix11
-rw-r--r--home/fuwn/cli/navi/default.nix5
-rw-r--r--home/fuwn/cli/ncdu/default.nix5
-rw-r--r--home/fuwn/cli/nethogs/default.nix5
-rw-r--r--home/fuwn/cli/nnn/default.nix3
-rw-r--r--home/fuwn/cli/nvtop/default.nix5
-rw-r--r--home/fuwn/cli/rm-improved/default.nix5
-rw-r--r--home/fuwn/cli/sloc/default.nix5
-rw-r--r--home/fuwn/cli/starship/default.nix305
-rw-r--r--home/fuwn/cli/tealdeer/default.nix5
-rw-r--r--home/fuwn/cli/todo/default.nix5
-rw-r--r--home/fuwn/gui/ahoviewer/default.nix5
-rw-r--r--home/fuwn/gui/anki/default.nix5
-rw-r--r--home/fuwn/gui/cool-retro-term/default.nix5
-rw-r--r--home/fuwn/gui/default.nix11
-rw-r--r--home/fuwn/gui/foot/default.nix3
-rw-r--r--home/fuwn/gui/kitty/default.nix3
-rw-r--r--home/fuwn/gui/meta/default.nix5
-rw-r--r--home/fuwn/gui/meta/gemini/default.nix5
-rw-r--r--home/fuwn/gui/warp/default.nix5
-rw-r--r--home/fuwn/home.nix99
-rw-r--r--home/fuwn/meta/audio/default.nix6
-rw-r--r--home/fuwn/meta/bitwarden/default.nix7
-rw-r--r--home/fuwn/meta/calculator/default.nix7
-rw-r--r--home/fuwn/meta/default.nix14
-rw-r--r--home/fuwn/meta/desktop/default.nix1
-rw-r--r--home/fuwn/meta/desktop/wayland/default.nix7
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/default.nix21
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hypridle/default.nix34
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/animations.nix86
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/binds.nix209
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/decoration.nix43
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/default.nix43
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/environment.nix80
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/executions.nix55
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/general.nix119
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/plugins.nix69
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/rules.nix78
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh146
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status18
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion10
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk19
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar19
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal13
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor9
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor16
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace12
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace5
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps13
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout22
-rw-r--r--home/fuwn/meta/desktop/wayland/hyprland/hyprland/workspaces.nix38
-rw-r--r--home/fuwn/meta/desktop/wayland/meta/default.nix5
-rw-r--r--home/fuwn/meta/desktop/wayland/meta/screenshot/default.nix6
-rw-r--r--home/fuwn/meta/desktop/wayland/waybar/default.nix92
-rw-r--r--home/fuwn/meta/desktop/wayland/waybar/waybar/default-modules.nix214
-rwxr-xr-xhome/fuwn/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py152
-rw-r--r--home/fuwn/meta/desktop/wayland/waybar/waybar/style.css134
-rw-r--r--home/fuwn/meta/imagery/default.nix8
-rw-r--r--home/fuwn/meta/language/codespell/default.nix5
-rw-r--r--home/fuwn/meta/language/default.nix5
-rw-r--r--home/fuwn/meta/rice/bottom/default.nix195
-rw-r--r--home/fuwn/meta/rice/btop/default.nix3
-rw-r--r--home/fuwn/meta/rice/cpufetch/default.nix5
-rw-r--r--home/fuwn/meta/rice/default.nix9
-rw-r--r--home/fuwn/meta/rice/fastfetch/default.nix34
-rw-r--r--home/fuwn/meta/rice/iotop/default.nix5
-rw-r--r--home/fuwn/meta/spotify/default.nix9
-rw-r--r--home/fuwn/meta/steam/default.nix7
-rw-r--r--home/fuwn/meta/tools/default.nix9
-rw-r--r--home/fuwn/meta/tools/http/default.nix6
-rw-r--r--home/fuwn/meta/tools/infrastructure/default.nix6
-rw-r--r--home/fuwn/meta/tools/infrastructure/docker/default.nix5
-rw-r--r--home/fuwn/meta/tools/infrastructure/fly/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/agnostic/default.nix7
-rw-r--r--home/fuwn/meta/tools/languages/assembly/default.nix7
-rw-r--r--home/fuwn/meta/tools/languages/cobol/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/default.nix19
-rw-r--r--home/fuwn/meta/tools/languages/gleam/default.nix7
-rw-r--r--home/fuwn/meta/tools/languages/go/default.nix3
-rw-r--r--home/fuwn/meta/tools/languages/hare/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/javascript/default.nix9
-rw-r--r--home/fuwn/meta/tools/languages/jvm/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/protobuf/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/python/default.nix8
-rw-r--r--home/fuwn/meta/tools/languages/rust/default.nix10
-rw-r--r--home/fuwn/meta/tools/languages/shell/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/vlang/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/yaml/default.nix5
-rw-r--r--home/fuwn/meta/tools/languages/zig/default.nix6
-rw-r--r--home/fuwn/meta/tools/nix/default.nix10
-rw-r--r--home/fuwn/meta/tools/tcp/default.nix6
-rw-r--r--home/fuwn/wallpaper.pngbin0 -> 3744245 bytes
109 files changed, 2962 insertions, 0 deletions
diff --git a/home/fuwn/cli/ani-cli/default.nix b/home/fuwn/cli/ani-cli/default.nix
new file mode 100644
index 0000000..723bfb9
--- /dev/null
+++ b/home/fuwn/cli/ani-cli/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ ani-cli
+ ];
+}
diff --git a/home/fuwn/cli/asciinema/default.nix b/home/fuwn/cli/asciinema/default.nix
new file mode 100644
index 0000000..750c52d
--- /dev/null
+++ b/home/fuwn/cli/asciinema/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ asciinema
+ ];
+}
diff --git a/home/fuwn/cli/bat/default.nix b/home/fuwn/cli/bat/default.nix
new file mode 100644
index 0000000..c1dad3f
--- /dev/null
+++ b/home/fuwn/cli/bat/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ programs.bat = {
+ enable = true;
+ config.pager = "less -FR";
+ };
+}
diff --git a/home/fuwn/cli/default.nix b/home/fuwn/cli/default.nix
new file mode 100644
index 0000000..4d14257
--- /dev/null
+++ b/home/fuwn/cli/default.nix
@@ -0,0 +1,21 @@
+_: {
+ imports = [
+ ./ani-cli
+ ./asciinema
+ ./bat
+ ./dog
+ ./eza
+ ./fd
+ ./meta
+ ./navi
+ ./ncdu
+ ./nethogs
+ ./nnn
+ # ./nvtop
+ ./rm-improved
+ ./sloc
+ ./starship
+ ./tealdeer
+ ./todo
+ ];
+}
diff --git a/home/fuwn/cli/dog/default.nix b/home/fuwn/cli/dog/default.nix
new file mode 100644
index 0000000..437a1a0
--- /dev/null
+++ b/home/fuwn/cli/dog/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ dogdns
+ ];
+}
diff --git a/home/fuwn/cli/eza/default.nix b/home/fuwn/cli/eza/default.nix
new file mode 100644
index 0000000..a8d2f57
--- /dev/null
+++ b/home/fuwn/cli/eza/default.nix
@@ -0,0 +1,7 @@
+_: {
+ programs.eza = {
+ enable = true;
+ icons = true;
+ enableFishIntegration = true;
+ };
+}
diff --git a/home/fuwn/cli/fd/default.nix b/home/fuwn/cli/fd/default.nix
new file mode 100644
index 0000000..92e0e28
--- /dev/null
+++ b/home/fuwn/cli/fd/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ fd
+ ];
+}
diff --git a/home/fuwn/cli/meta/ai/default.nix b/home/fuwn/cli/meta/ai/default.nix
new file mode 100644
index 0000000..fe42707
--- /dev/null
+++ b/home/fuwn/cli/meta/ai/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ ollama-cuda
+ shell-gpt
+ ];
+}
diff --git a/home/fuwn/cli/meta/default.nix b/home/fuwn/cli/meta/default.nix
new file mode 100644
index 0000000..073fc94
--- /dev/null
+++ b/home/fuwn/cli/meta/default.nix
@@ -0,0 +1,10 @@
+_: {
+ imports = [
+ ./ai
+ ./git
+ ./irc
+ ./scripting
+ ./shell
+ ./smolnet
+ ];
+}
diff --git a/home/fuwn/cli/meta/git/default.nix b/home/fuwn/cli/meta/git/default.nix
new file mode 100644
index 0000000..630285c
--- /dev/null
+++ b/home/fuwn/cli/meta/git/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gh
+ onefetch
+ gitoxide
+ ];
+}
diff --git a/home/fuwn/cli/meta/irc/default.nix b/home/fuwn/cli/meta/irc/default.nix
new file mode 100644
index 0000000..adde57d
--- /dev/null
+++ b/home/fuwn/cli/meta/irc/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ catgirl
+ pounce
+ ];
+}
diff --git a/home/fuwn/cli/meta/scripting/charmbracelet/default.nix b/home/fuwn/cli/meta/scripting/charmbracelet/default.nix
new file mode 100644
index 0000000..e3b78df
--- /dev/null
+++ b/home/fuwn/cli/meta/scripting/charmbracelet/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gum
+ mods
+ ];
+}
diff --git a/home/fuwn/cli/meta/scripting/default.nix b/home/fuwn/cli/meta/scripting/default.nix
new file mode 100644
index 0000000..fb6e062
--- /dev/null
+++ b/home/fuwn/cli/meta/scripting/default.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }: {
+ imports = [
+ ./charmbracelet
+ ./ripgrep
+ ];
+
+ home.packages = with pkgs; [
+ moreutils
+ pup
+ ];
+}
diff --git a/home/fuwn/cli/meta/scripting/ripgrep/default.nix b/home/fuwn/cli/meta/scripting/ripgrep/default.nix
new file mode 100644
index 0000000..00de07f
--- /dev/null
+++ b/home/fuwn/cli/meta/scripting/ripgrep/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ programs.ripgrep.enable = true;
+
+ home.packages = with pkgs; [
+ ripgrep-all
+ ];
+}
diff --git a/home/fuwn/cli/meta/shell/default.nix b/home/fuwn/cli/meta/shell/default.nix
new file mode 100644
index 0000000..0d60ba0
--- /dev/null
+++ b/home/fuwn/cli/meta/shell/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ shellclear
+ ];
+}
diff --git a/home/fuwn/cli/meta/smolnet/bollux/default.nix b/home/fuwn/cli/meta/smolnet/bollux/default.nix
new file mode 100644
index 0000000..2079052
--- /dev/null
+++ b/home/fuwn/cli/meta/smolnet/bollux/default.nix
@@ -0,0 +1,67 @@
+{ pkgs, lib, ... }:
+let
+ bollux =
+ pkgs.stdenvNoCC.mkDerivation rec {
+ pname = "bollux";
+ version = "0.4.1";
+
+ nativeBuildInputs = [
+ pkgs.makeWrapper
+ ];
+
+ buildInputs = [
+ pkgs.bashInteractive
+ ];
+
+ dontBuild = true;
+
+ makeFlags = [
+ "PREFIX=$(out)"
+ ];
+
+ src = pkgs.fetchFromGitea {
+ domain = "tildegit.org";
+ owner = "acdw";
+ repo = "bollux";
+ rev = "f472e60f1164f0dc025d06db2a13ff4e8ebee1a2";
+ hash = "sha256-mo2qWCPfW+dUaYcJLsos/vR5nJ8n1eABy8Zy8OZsfVg=";
+ };
+
+ runtimeDependencies = [
+ pkgs.bashInteractive
+ pkgs.iconv
+ pkgs.openssl
+ pkgs.less
+ pkgs.coreutils
+ ];
+
+ patches = [
+ # https://tildegit.org/acdw/bollux/issues/13#issuecomment-9786
+ ./fix_lesskey_nag.patch
+ ];
+
+ postInstall = ''
+ wrapProgram $out/bin/bollux --prefix PATH : ${lib.makeBinPath runtimeDependencies}
+ '';
+
+ meta = with lib; {
+ description = "a Gemini browser in like, idk, 96% pure Bash";
+ homepage = "https://tildegit.org/acdw/bollux";
+ license = licenses.mit;
+ platforms = platforms.all;
+ mainProgram = "bollux";
+ };
+ };
+in
+{
+ home.packages = [
+ # I'll update this later and move the above derivation to its own package
+ # once I push my entire NixOS system configuration.
+ # (pkgs.callPackage /path/to/pkgs/bollux.nix {
+ # src = bollux;
+ # })
+ bollux
+ ];
+
+ xdg.configFile."bollux/bollux.conf".text = '''';
+}
diff --git a/home/fuwn/cli/meta/smolnet/bollux/fix_lesskey_nag.patch b/home/fuwn/cli/meta/smolnet/bollux/fix_lesskey_nag.patch
new file mode 100644
index 0000000..329b886
--- /dev/null
+++ b/home/fuwn/cli/meta/smolnet/bollux/fix_lesskey_nag.patch
@@ -0,0 +1,13 @@
+diff --git i/bollux w/bollux
+index 267418e..090217e 100755
+--- i/bollux
++++ w/bollux
+@@ -1130,7 +1130,7 @@ display() { # display METADATA [TITLE]
+ # text, and pre-formatted text shouldn't wrap.
+ less_cmd+=(-S)
+ # Load the keybindings (see `lesskey').
+- mklesskey && less_cmd+=(-k "$BOLLUX_LESSKEY")
++ mklesskey && less_cmd+=(--lesskey-src="$BOLLUX_LESSKEY")
+ local helpline="${KEY_OPEN}:open, "
+ helpline+="${KEY_GOTO}/"
+ helpline+="${KEY_GOTO_FROM}:goto, "
diff --git a/home/fuwn/cli/meta/smolnet/default.nix b/home/fuwn/cli/meta/smolnet/default.nix
new file mode 100644
index 0000000..8cb44a6
--- /dev/null
+++ b/home/fuwn/cli/meta/smolnet/default.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }: {
+ imports = [
+ ./bollux
+ ];
+
+ home.packages = with pkgs; [
+ amfora
+ gmni
+ phetch
+ ];
+}
diff --git a/home/fuwn/cli/navi/default.nix b/home/fuwn/cli/navi/default.nix
new file mode 100644
index 0000000..5b462b5
--- /dev/null
+++ b/home/fuwn/cli/navi/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ navi
+ ];
+}
diff --git a/home/fuwn/cli/ncdu/default.nix b/home/fuwn/cli/ncdu/default.nix
new file mode 100644
index 0000000..1c0bfca
--- /dev/null
+++ b/home/fuwn/cli/ncdu/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ ncdu
+ ];
+}
diff --git a/home/fuwn/cli/nethogs/default.nix b/home/fuwn/cli/nethogs/default.nix
new file mode 100644
index 0000000..7934eb8
--- /dev/null
+++ b/home/fuwn/cli/nethogs/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nethogs
+ ];
+}
diff --git a/home/fuwn/cli/nnn/default.nix b/home/fuwn/cli/nnn/default.nix
new file mode 100644
index 0000000..06fa7c9
--- /dev/null
+++ b/home/fuwn/cli/nnn/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.nnn.enable = true;
+}
diff --git a/home/fuwn/cli/nvtop/default.nix b/home/fuwn/cli/nvtop/default.nix
new file mode 100644
index 0000000..929f5e5
--- /dev/null
+++ b/home/fuwn/cli/nvtop/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nvtopPackages.nvidia
+ ];
+}
diff --git a/home/fuwn/cli/rm-improved/default.nix b/home/fuwn/cli/rm-improved/default.nix
new file mode 100644
index 0000000..d4a5fc1
--- /dev/null
+++ b/home/fuwn/cli/rm-improved/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ rm-improved
+ ];
+}
diff --git a/home/fuwn/cli/sloc/default.nix b/home/fuwn/cli/sloc/default.nix
new file mode 100644
index 0000000..6249b05
--- /dev/null
+++ b/home/fuwn/cli/sloc/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ sloc
+ ];
+}
diff --git a/home/fuwn/cli/starship/default.nix b/home/fuwn/cli/starship/default.nix
new file mode 100644
index 0000000..0088038
--- /dev/null
+++ b/home/fuwn/cli/starship/default.nix
@@ -0,0 +1,305 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ starship
+ ];
+
+ programs.starship = {
+ enable = true;
+ enableFishIntegration = true;
+
+ # I CBA to update the formatting to match the rest of the expressions, since
+ # this is a one-off that I tend to import over directly from starship.
+ settings = {
+ format = "[term%](bold green) ";
+ right_format = "$character$all";
+ add_newline = false;
+
+ line_break = {
+ disabled = true;
+ };
+
+ character = {
+ success_symbol = "[i](bold green)";
+ error_symbol = "[x](bold red)";
+ vimcmd_symbol = "[n](bold green)";
+ vimcmd_visual_symbol = "[v](bold green)";
+ vimcmd_replace_symbol = "[R](bold green)";
+ vimcmd_replace_one_symbol = "[r](bold green)";
+ };
+
+ git_commit = {
+ tag_symbol = " tag ";
+ };
+
+ git_status = {
+ ahead = ">";
+ behind = "<";
+ diverged = "<>";
+ renamed = "r";
+ deleted = "x";
+ };
+
+ aws = {
+ symbol = "aws ";
+ };
+
+ azure = {
+ symbol = "az ";
+ };
+
+ bun = {
+ symbol = "bun ";
+ };
+
+ c = {
+ symbol = "C ";
+ };
+
+ cobol = {
+ symbol = "cobol ";
+ };
+
+ conda = {
+ symbol = "conda ";
+ };
+
+ crystal = {
+ symbol = "cr ";
+ };
+
+ cmake = {
+ symbol = "cmake ";
+ };
+
+ daml = {
+ symbol = "daml ";
+ };
+
+ dart = {
+ symbol = "dart ";
+ };
+
+ deno = {
+ symbol = "deno ";
+ };
+
+ dotnet = {
+ symbol = ".NET ";
+ };
+
+ directory = {
+ read_only = " ro";
+ };
+
+ docker_context = {
+ symbol = "docker ";
+ };
+
+ elixir = {
+ symbol = "exs ";
+ };
+
+ elm = {
+ symbol = "elm ";
+ };
+
+ fennel = {
+ symbol = "fnl ";
+ };
+
+ fossil_branch = {
+ symbol = "fossil ";
+ };
+
+ gcloud = {
+ symbol = "gcp ";
+ };
+
+ git_branch = {
+ symbol = "git ";
+ };
+
+ golang = {
+ symbol = "go ";
+ };
+
+ gradle = {
+ symbol = "gradle ";
+ };
+
+ guix_shell = {
+ symbol = "guix ";
+ };
+
+ hg_branch = {
+ symbol = "hg ";
+ };
+
+ java = {
+ symbol = "java ";
+ };
+
+ julia = {
+ symbol = "jl ";
+ };
+
+ kotlin = {
+ symbol = "kt ";
+ };
+
+ lua = {
+ symbol = "lua ";
+ };
+
+ nodejs = {
+ symbol = "nodejs ";
+ };
+
+ memory_usage = {
+ symbol = "memory ";
+ };
+
+ meson = {
+ symbol = "meson ";
+ };
+
+ nim = {
+ symbol = "nim ";
+ };
+
+ nix_shell = {
+ symbol = "nix ";
+ };
+
+ ocaml = {
+ symbol = "ml ";
+ };
+
+ opa = {
+ symbol = "opa ";
+ };
+
+ os = {
+ symbols = {
+ Alpaquita = "alq ";
+ Alpine = "alp ";
+ Amazon = "amz ";
+ Android = "andr ";
+ Arch = "rch ";
+ Artix = "atx ";
+ CentOS = "cent ";
+ Debian = "deb ";
+ DragonFly = "dfbsd ";
+ Emscripten = "emsc ";
+ EndeavourOS = "ndev ";
+ Fedora = "fed ";
+ FreeBSD = "fbsd ";
+ Garuda = "garu ";
+ Gentoo = "gent ";
+ HardenedBSD = "hbsd ";
+ Illumos = "lum ";
+ Linux = "lnx ";
+ Mabox = "mbox ";
+ Macos = "mac ";
+ Manjaro = "mjo ";
+ Mariner = "mrn ";
+ MidnightBSD = "mid ";
+ Mint = "mint ";
+ NetBSD = "nbsd ";
+ NixOS = "nix ";
+ OpenBSD = "obsd ";
+ OpenCloudOS = "ocos ";
+ openEuler = "oeul ";
+ openSUSE = "osuse ";
+ OracleLinux = "orac ";
+ Pop = "pop ";
+ Raspbian = "rasp ";
+ Redhat = "rhl ";
+ RedHatEnterprise = "rhel ";
+ Redox = "redox ";
+ Solus = "sol ";
+ SUSE = "suse ";
+ Ubuntu = "ubnt ";
+ Unknown = "unk ";
+ Windows = "win ";
+ };
+ };
+
+ package = {
+ symbol = "pkg ";
+ };
+
+ perl = {
+ symbol = "pl ";
+ };
+
+ php = {
+ symbol = "php ";
+ };
+
+ pijul_channel = {
+ symbol = "pijul ";
+ };
+
+ pulumi = {
+ symbol = "pulumi ";
+ };
+
+ purescript = {
+ symbol = "purs ";
+ };
+
+ python = {
+ symbol = "py ";
+ };
+
+ raku = {
+ symbol = "raku ";
+ };
+
+ ruby = {
+ symbol = "rb ";
+ };
+
+ rust = {
+ symbol = "rs ";
+ };
+
+ scala = {
+ symbol = "scala ";
+ };
+
+ spack = {
+ symbol = "spack ";
+ };
+
+ solidity = {
+ symbol = "solidity ";
+ };
+
+ status = {
+ symbol = "[x](bold red) ";
+ };
+
+ sudo = {
+ symbol = "sudo ";
+ };
+
+ swift = {
+ symbol = "swift ";
+ };
+
+ typst = {
+ symbol = "typst ";
+ };
+
+ terraform = {
+ symbol = "terraform ";
+ };
+
+ zig = {
+ symbol = "zig ";
+ };
+ };
+ };
+}
diff --git a/home/fuwn/cli/tealdeer/default.nix b/home/fuwn/cli/tealdeer/default.nix
new file mode 100644
index 0000000..7ee39f1
--- /dev/null
+++ b/home/fuwn/cli/tealdeer/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ tealdeer
+ ];
+}
diff --git a/home/fuwn/cli/todo/default.nix b/home/fuwn/cli/todo/default.nix
new file mode 100644
index 0000000..f1c841d
--- /dev/null
+++ b/home/fuwn/cli/todo/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ todo
+ ];
+}
diff --git a/home/fuwn/gui/ahoviewer/default.nix b/home/fuwn/gui/ahoviewer/default.nix
new file mode 100644
index 0000000..c6907e1
--- /dev/null
+++ b/home/fuwn/gui/ahoviewer/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ ahoviewer
+ ];
+}
diff --git a/home/fuwn/gui/anki/default.nix b/home/fuwn/gui/anki/default.nix
new file mode 100644
index 0000000..8e5655c
--- /dev/null
+++ b/home/fuwn/gui/anki/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ anki-bin
+ ];
+}
diff --git a/home/fuwn/gui/cool-retro-term/default.nix b/home/fuwn/gui/cool-retro-term/default.nix
new file mode 100644
index 0000000..e53937b
--- /dev/null
+++ b/home/fuwn/gui/cool-retro-term/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cool-retro-term
+ ];
+}
diff --git a/home/fuwn/gui/default.nix b/home/fuwn/gui/default.nix
new file mode 100644
index 0000000..a3ec2d2
--- /dev/null
+++ b/home/fuwn/gui/default.nix
@@ -0,0 +1,11 @@
+_: {
+ imports = [
+ ./ahoviewer
+ ./anki
+ ./cool-retro-term
+ # ./foot
+ # ./kitty
+ ./meta
+ # ./warp
+ ];
+}
diff --git a/home/fuwn/gui/foot/default.nix b/home/fuwn/gui/foot/default.nix
new file mode 100644
index 0000000..8945d61
--- /dev/null
+++ b/home/fuwn/gui/foot/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.foot.enable = true;
+}
diff --git a/home/fuwn/gui/kitty/default.nix b/home/fuwn/gui/kitty/default.nix
new file mode 100644
index 0000000..ed2d7e7
--- /dev/null
+++ b/home/fuwn/gui/kitty/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.kitty.enable = true;
+}
diff --git a/home/fuwn/gui/meta/default.nix b/home/fuwn/gui/meta/default.nix
new file mode 100644
index 0000000..7959d11
--- /dev/null
+++ b/home/fuwn/gui/meta/default.nix
@@ -0,0 +1,5 @@
+_: {
+ imports = [
+ ./gemini
+ ];
+}
diff --git a/home/fuwn/gui/meta/gemini/default.nix b/home/fuwn/gui/meta/gemini/default.nix
new file mode 100644
index 0000000..a9b32ac
--- /dev/null
+++ b/home/fuwn/gui/meta/gemini/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ geopard
+ ];
+}
diff --git a/home/fuwn/gui/warp/default.nix b/home/fuwn/gui/warp/default.nix
new file mode 100644
index 0000000..de37c40
--- /dev/null
+++ b/home/fuwn/gui/warp/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ warp-terminal
+ ];
+}
diff --git a/home/fuwn/home.nix b/home/fuwn/home.nix
new file mode 100644
index 0000000..aec2421
--- /dev/null
+++ b/home/fuwn/home.nix
@@ -0,0 +1,99 @@
+{ config, pkgs, stylix, ... }:
+{
+ home = {
+ # Home Manager needs a bit of information about you and the paths it should
+ # manage.
+ username = "fuwn";
+ homeDirectory = "/home/fuwn";
+
+ # This value determines the Home Manager release that your configuration is
+ # compatible with. This helps avoid breakage when a new Home Manager release
+ # introduces backwards incompatible changes.
+ #
+ # You should not change this value, even if you update Home Manager. If you do
+ # want to update the value, then make sure to first check the Home Manager
+ # release notes.
+ stateVersion = "24.05"; # Please read the comment before changing.
+
+ # The home.packages option allows you to install Nix packages into your
+ # environment.
+ packages = [
+ # # Adds the 'hello' command to your environment. It prints a friendly
+ # # "Hello, world!" when run.
+ # pkgs.hello
+
+ # # It is sometimes useful to fine-tune packages, for example, by applying
+ # # overrides. You can do that directly here, just don't forget the
+ # # parentheses. Maybe you want to install Nerd Fonts with a limited number of
+ # # fonts?
+ # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
+
+ # # You can also create simple shell scripts directly inside your
+ # # configuration. For example, this adds a command 'my-hello' to your
+ # # environment:
+ # (pkgs.writeShellScriptBin "my-hello" ''
+ # echo "Hello, \${config.home.username}!"
+ # '')
+ ];
+
+ # Home Manager is pretty good at managing dotfiles. The primary way to manage
+ # plain files is through 'home.file'.
+ file = {
+ # # Building this configuration will create a copy of 'dotfiles/screenrc' in
+ # # the Nix store. Activating the configuration will then make '~/.screenrc' a
+ # # symlink to the Nix store copy.
+ # ".screenrc".source = dotfiles/screenrc;
+
+ # # You can also set the file content immediately.
+ # ".gradle/gradle.properties".text = ''
+ # org.gradle.console=verbose
+ # org.gradle.daemon.idletimeout=3600000
+ # '';
+ };
+
+ # Home Manager can also manage your environment variables through
+ # 'home.sessionVariables'. These will be explicitly sourced when using a
+ # shell provided by Home Manager. If you don't want to manage your shell
+ # through Home Manager then you have to manually source 'hm-session-vars.sh'
+ # located at either
+ #
+ # ~/.nix-profile/etc/profile.d/hm-session-vars.sh
+ #
+ # or
+ #
+ # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
+ #
+ # or
+ #
+ # /etc/profiles/per-user/$USER/etc/profile.d/hm-session-vars.sh
+ #
+ sessionVariables = {
+ # EDITOR = "emacs";
+ };
+
+ # sessionPath = [
+ # "$HOME/.local/bin"
+ # ];
+ };
+
+ # Let Home Manager install and manage itself.
+ programs.home-manager.enable = true;
+
+ imports = [
+ ./cli
+ ./gui
+ ./meta
+ ];
+
+ nixpkgs = {
+ config = {
+ allowUnfree = true;
+ # allowBroken = true;
+ };
+ };
+
+ stylix = {
+ enable = false;
+ image = ./wallpaper.png;
+ };
+}
diff --git a/home/fuwn/meta/audio/default.nix b/home/fuwn/meta/audio/default.nix
new file mode 100644
index 0000000..8768f34
--- /dev/null
+++ b/home/fuwn/meta/audio/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ blueberry
+ pavucontrol
+ ];
+}
diff --git a/home/fuwn/meta/bitwarden/default.nix b/home/fuwn/meta/bitwarden/default.nix
new file mode 100644
index 0000000..2ac188f
--- /dev/null
+++ b/home/fuwn/meta/bitwarden/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ bitwarden-desktop
+ # bitwarden-cli
+ # bitwarden-menu
+ ];
+}
diff --git a/home/fuwn/meta/calculator/default.nix b/home/fuwn/meta/calculator/default.nix
new file mode 100644
index 0000000..a8bcc7f
--- /dev/null
+++ b/home/fuwn/meta/calculator/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gavin-bc
+ qalculate-gtk
+ programmer-calculator
+ ];
+}
diff --git a/home/fuwn/meta/default.nix b/home/fuwn/meta/default.nix
new file mode 100644
index 0000000..6d6bf65
--- /dev/null
+++ b/home/fuwn/meta/default.nix
@@ -0,0 +1,14 @@
+_: {
+ imports = [
+ ./audio
+ ./bitwarden
+ ./calculator
+ ./desktop
+ ./imagery
+ ./language
+ ./rice
+ ./spotify
+ ./steam
+ ./tools
+ ];
+}
diff --git a/home/fuwn/meta/desktop/default.nix b/home/fuwn/meta/desktop/default.nix
new file mode 100644
index 0000000..36de93a
--- /dev/null
+++ b/home/fuwn/meta/desktop/default.nix
@@ -0,0 +1 @@
+_: { imports = [ ./wayland ]; }
diff --git a/home/fuwn/meta/desktop/wayland/default.nix b/home/fuwn/meta/desktop/wayland/default.nix
new file mode 100644
index 0000000..89f1bf0
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/default.nix
@@ -0,0 +1,7 @@
+_: {
+ imports = [
+ ./hyprland
+ ./meta
+ ./waybar
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/default.nix b/home/fuwn/meta/desktop/wayland/hyprland/default.nix
new file mode 100644
index 0000000..d371cb0
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/default.nix
@@ -0,0 +1,21 @@
+{ pkgs, ... }: {
+ imports = [
+ ./hypridle
+ ./hyprland
+ ];
+
+ wayland.windowManager.hyprland = {
+ enable = true;
+ package = pkgs.hyprland;
+
+ xwayland = {
+ enable = true;
+ };
+
+ systemd = {
+ enable = true;
+
+ variables = [ "--all" ];
+ };
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hypridle/default.nix b/home/fuwn/meta/desktop/wayland/hyprland/hypridle/default.nix
new file mode 100644
index 0000000..03d670c
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hypridle/default.nix
@@ -0,0 +1,34 @@
+{ pkgs, ... }: {
+ services.hypridle = {
+ enable = true;
+
+ settings = {
+ "$lock_command" = "pidof hyprlock || hyprlock";
+ # $suspend_command = pidof steam || systemctl suspend || loginctl suspend
+
+ general = {
+ lock_cmd = "$lock_command";
+ # before_sleep_cmd = $suspend_command
+ before_sleep_cmd = "playerctl pause";
+ ignore_dbus_inhibit = false;
+ ignore_systemd_inhibit = false;
+ };
+
+ listener = [
+ {
+ timeout = 180; # 3 minutes
+ on-timeout = "$lock_command";
+ }
+ {
+ timeout = 240; # 4 minutes
+ on-timeout = "hyprctl dispatch dpms off";
+ on-resume = "hyprctl dispatch dpms on";
+ }
+ # {
+ # timeout = 540; # 9 minutes
+ # on-timeout = "$suspend_cmd";
+ # }
+ ];
+ };
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/animations.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/animations.nix
new file mode 100644
index 0000000..c47c164
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/animations.nix
@@ -0,0 +1,86 @@
+_: {
+ wayland.windowManager.hyprland = {
+ extraConfig = ''
+ # animations {
+ # enabled = yes
+
+ # # bezier = myBezier, 0.05, 0.9, 0.1, 1.05
+
+ # # animation = windows, 1, 5, myBezier
+ # # animation = windowsOut, 1, 7, default, popin
+ # # animation = border, 1, 10, default
+ # # animation = fade, 1, 7, default
+ # # animation = workspaces, 1, 6, default, slidevert
+
+ # # bezier = overshot,0.5,0.1,0.4,1.2
+
+ # # animation = global, 1, 3, default
+ # # animation = workspaces, 1, 4, default
+ # # animation = windowsMove, 1, 2, default
+ # # animation = fade, 1, 2, default
+
+ # bezier = overshot, 0.05, 0.5, 0.1, 1.05
+ # bezier = smoothOut, 0.36, 0, 0.66, -0.56
+ # bezier = smoothIn, 0.25, 0.8, 0.5, 1
+
+ # animation = windows, 1, 5, overshot, slide
+ # animation = windowsOut, 1, 4, smoothOut, slide
+ # animation = windowsMove, 1, 4, default
+ # animation = border, 1, 10, default
+ # animation = fade, 1, 10, smoothIn
+ # animation = fadeDim, 1, 10, smoothIn
+ # animation = workspaces, 1, 6, default
+ # }
+
+ bezier = smoothIn, 0.25, 1, 0.5, 1
+ bezier = wind, 0.05, 0.9, 0.1, 1.06
+ bezier = winIn, 0.1, 1.1, 0.1, 1.05
+ bezier = linear, 1, 1, 1, 1
+
+ animations {
+ enabled = yes
+
+ # buttery_smoooooooth... (slide)
+ # animation = windows, 1, 5, default, slide
+ # animation = windowsOut, 1, 8, smoothIn, slide
+ # animation = windowsMove, 1, 7, default
+ # animation = fade, 1, 5, smoothIn
+ # animation = fadeOut, 1, 4, smoothIn
+ # animation = fadeDim, 1, 3, smoothIn
+ # animation = workspaces, 1, 5, default, slidefadevert
+ # animation = specialWorkspace, 1, 5, default, fade
+
+ # buttery_smoooooooth... (Popin...)
+ # animation = windows, 1, 3, default, popin 70%
+ # animation = windowsOut, 1, 20, default, popin 85%
+ # animation = windowsMove, 1, 7, default
+ # animation = fade, 1, 6, smoothIn
+ # animation = fadeOut, 1, 3, smoothIn
+ # animation = fadeDim, 1, 3, smoothIn
+ # animation = workspaces, 1, 5, wind, slidefadevert 40%
+
+ # fasssstt popin
+ animation = windows, 1, 2, default, popin 80%
+ animation = windowsOut, 1, 5, default, popin 90%
+ animation = windowsMove, 1, 5, default
+ animation = layers, 1, 3, default, popin 90%
+ animation = fade, 1, 4, smoothIn
+ animation = fadeOut, 1, 2, smoothIn
+ animation = fadeDim, 1, 3, smoothIn
+ animation = workspaces, 1, 3, default, slidefadevert 15%
+ animation = specialWorkspace, 1, 3, default, slidefadevert 15%
+
+ # Random...
+ # animation = windows, 1, 5, wind, slide
+ # animation = windowsIn, 1, 4, winIn, slide
+ # animation = windowsOut, 1 , 7, smoothIn, slide
+ # animation = windowsMove, 1, 6, default
+ # animation = fade, 1, 5, smoothIn
+ # animation = fadeOut, 1, 3, smoothIn
+ # animation = fadeDim, 1, 3, smoothIn
+ # animation = workspaces, 1, 4, wind, slidefadevert 15%
+ # animation = specialWorkspace, 1, 3, default, slidefadevert 15%
+ }
+ '';
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/binds.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/binds.nix
new file mode 100644
index 0000000..5312b93
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/binds.nix
@@ -0,0 +1,209 @@
+_: {
+ wayland.windowManager.hyprland = {
+ settings = {
+ "$mod" = "SUPER";
+ "$mail" = "mailspring --password-store=\"gnome-libsecret\" --enable-features=UseOzonePlatform --ozone-platform=wayland";
+ "$script_path" = "$HOME/.config/hypr/hyprland/scripts";
+ "$term" = "kitty";
+
+ bind = (
+ builtins.concatLists
+ (builtins.genList
+ (
+ x:
+ let
+ ws =
+ let
+ c = (x + 1) / 10;
+ in
+ builtins.toString (x + 1 - (c * 10));
+ in
+ [
+ # Switch pseudo-tag (workspaces)
+ "$mod, ${ws}, exec, $script_path/switch_workspace ${toString (x + 1)}"
+ # "$mod, ${ws}, split-workspace, ${toString (x + 1)}"
+
+ # Move window to pseudo-tag (workspace)
+ "$mod SHIFT, ${ws}, exec, $script_path/move_window_to_workspace ${toString (x + 1)}"
+ # "$mod SHIFT, ${ws}, split-movetoworkspacesilent, ${toString (x + 1)}"
+ ]
+ )
+ 10)
+ ++
+ [
+ # Scratchpads
+ "$mod, apostrophe, exec, hyprctl dispatch togglespecialworkspace simple_calculator"
+ "$mod SHIFT, RETURN, exec, hyprctl dispatch togglespecialworkspace simple_terminal"
+ "$mod SHIFT, c, exec, hyprctl dispatch togglespecialworkspace chatgpt"
+ "$mod SHIFT, s, exec, hyprctl dispatch togglespecialworkspace spotify"
+ "$mod SHIFT, apostrophe, exec, hyprctl dispatch togglespecialworkspace calculator"
+
+ # Focus
+ "$mod, k, movefocus, u"
+ "$mod, j, movefocus, d"
+ "$mod, l, movefocus, r"
+ "$mod, h, movefocus, l"
+
+ # "$mod, j, layoutmsg, cyclenext"
+ # "$mod, j, layoutmsg, cycleprev"
+
+ "$mod, tab, hycov:toggleoverview"
+ "$mod SHIFT, tab, overview:toggle"
+
+ # Emoji picker
+ "$mod, GRAVE, exec, rofi -modi emoji -show emoji"
+
+ # Volume control
+ "$mod, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
+ "$mod SHIFT, MINUS, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%-"
+ "$mod, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
+ "$mod SHIFT, EQUAL, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 15%+"
+
+ # Session control
+ "$mod SHIFT, Q, exec, wlogout"
+ "$mod SHIFT, R, exec, hyprctl reload"
+
+ # Window control
+ "$mod, F, fullscreen"
+ # "$mod SHIFT, F, fullscreen, 2"
+ "$mod SHIFT, F, exec, hyprctl dispatch fakefullscreen && $script_path/fake_fullscreen_status"
+ "$mod, G, togglefloating"
+ "$mod, P, pseudo"
+ "$mod SHIFT, P, pin"
+ "$mod, T, togglesplit"
+ "$mod, U, focusurgentorlast"
+ "$mod, Q, killactive"
+ "$mod, S, exec, hyprctl keyword window:sticky 1"
+ "$mod, b, exec, pkill -SIGUSR1 waybar"
+ "$mod, SPACE, layoutmsg, swapwithmaster"
+ "$mod, V, exec, $script_path/toggle_layout"
+
+ # Application binds
+ "$mod, W, exec, $BROWSER"
+ "$mod SHIFT, W, exec, $term -e sudo nmtui"
+ "$mod, E, exec, $mail"
+ "$mod SHIFT, R, exec, $term -e htop"
+ "$mod, R, exec, rofi -show run"
+ "$mod SHIFT, D, exec, bitwarden-desktop"
+ "$mod, RETURN, exec, $term"
+ "$mod SHIFT, N, exec, $BROWSER https://sumi.news"
+ "$mod, M, exec, spotify"
+ "$mod SHIFT, M, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+ "$mod ALT, A, exec, hyprpicker -a"
+
+ # Launchers
+ "$mod, D, exec, rofi -show combi"
+ "$mod, C, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy"
+
+ # Spotify control
+ "$mod, P, exec, spt pb --toggle"
+ "$mod SHIFT, P, exec, mpc pause; pauseallmpv"
+ "$mod, BRACKETLEFT, exec, spt pb --seek -10"
+ "$mod SHIFT, BRACKETLEFT, exec, spt pb --seek -60"
+ "$mod, BRACKETRIGHT, exec, spt pb --seek +10"
+ "$mod SHIFT, BRACKETRIGHT, exec, spt pb --seek +60"
+ "$mod, COMMA, exec, spt pb --pp"
+ "$mod, PERIOD, exec, spt pb --next"
+ "$mod SHIFT, PERIOD, exec, spt pb --previous"
+
+ # Gaps control
+ "$mod, a, exec, $script_path/toggle_gaps"
+ "$mod SHIFT, a, exec, bash -c 'hyprctl keyword general:gaps_in 5; hyprctl keyword general:gaps_out 10'"
+
+ # Increment gaps
+ "$mod, mouse_up, exec, hyprctl keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') + 3`"
+ "$mod, mouse_up, exec, hyprctl keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') + 2`"
+
+ # Decrement gaps
+ "$mod, mouse_down, exec, hyprctl keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') - 3`"
+ "$mod, mouse_down, exec, hyprctl keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') - 2`"
+
+ # Move focus to monitor
+ "$mod, LEFT, exec, $script_path/move_focus_to_monitor left"
+ "$mod, RIGHT, exec, $script_path/move_focus_to_monitor right"
+
+ # Move window to monitor
+ "$mod SHIFT, h, exec, $script_path/move_window_to_monitor left"
+ "$mod SHIFT, l, exec, $script_path/move_window_to_monitor right"
+
+ # Screenshot
+ ", Print, exec, screenshot --area"
+ "$mod SHIFT, Print, exec, screenshot --window"
+ "$mod CTRL, Print, exec, screenshot --monitor"
+ "$mod, Print, exec, screenshot --now"
+ "$mod SHIFT, v, exec, screenshot --now --clipboard && pypr toggle spgpt && ydotool key 42:1 1:1 1:0 42:0 29:1 47:1 29:0 47:0"
+
+ # Media keys
+ # ...
+ ]
+ );
+
+ binde = (
+ [
+ # Increment gaps
+ "$mod, Z, exec, hyprctl --batch \"keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') + 3`; keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') + 2`\""
+
+ # Decrement gaps
+ "$mod, X, exec, hyprctl --batch \"keyword general:gaps_out `expr $(hyprctl getoption general:gaps_out | awk '{ print $3 }') - 3`; keyword general:gaps_in `expr $(hyprctl getoption general:gaps_in | awk '{ print $3 }') - 2`\""
+
+ # Resize active window
+ "$mod SHIFT, UP, resizeactive, 0 -50"
+ "$mod SHIFT, DOWN, resizeactive, 0 50"
+ "$mod SHIFT, RIGHT, resizeactive, 50 0"
+ "$mod SHIFT, LEFT, resizeactive, -50 0"
+
+ # Move active window
+ "$mod ALT, k, moveactive, 0 -100"
+ "$mod ALT, j, moveactive, 0 100"
+ "$mod ALT, l, moveactive, 100 0"
+ "$mod ALT, h, moveactive, -100 0"
+ ]
+ );
+
+ bindm = (
+ [
+ # Move window with mouse
+ "$mod, mouse:272, movewindow"
+ "$mod, mouse:273, resizewindow"
+ "$mod SHIFT, mouse:273, resizewindow 1"
+ ]
+ );
+ };
+
+ extraConfig = ''
+ # Media keys
+ bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle
+ bind = , XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0%- && wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+
+ bind = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 0%+ && wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
+ bind = , XF86AudioPrev, exec, playerctl previous
+ bind = , XF86AudioNext, exec, playerctl next
+ bind = , XF86AudioPause, exec, playerctl play-pause
+ bind = , XF86AudioPlay, exec, playerctl play-pause
+ bind = , XF86AudioStop, exec, playerctl stop
+ bind = , XF86AudioRewind, exec, playerctl position -10
+ bind = , XF86AudioForward, exec, playerctl position +10
+ bind = , XF86AudioMedia, exec, spotify
+ bind = , XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle
+
+ # Other media keys
+ bind = , XF86Calculator, exec, $term -e bc -l
+ bind = , XF86Sleep, exec, sudo -A zzz
+ bind = , XF86WWW, exec, $BROWSER
+ bind = , XF86DOS, exec, $term
+ bind = , XF86ScreenSaver, exec, pidof hyprlock || hyprlock && hyprctl dispatch dpms off
+ bind = , XF86TaskPane, exec, $term -e htop
+ bind = , XF86Mail, exec, $mail
+ bind = , XF86MyComputer, exec, $term -e ranger
+ bind = , XF86Launch1, exec, hyprctl dispatch dpms off
+
+ # Touchpad control
+ bind = , XF86TouchpadToggle, exec, (synclient | grep 'TouchpadOff.*1' && synclient TouchpadOff=0) || synclient TouchpadOff=1
+ bind = , XF86TouchpadOff, exec, synclient TouchpadOff=1
+ bind = , XF86TouchpadOn, exec, synclient TouchpadOff=0
+
+ # Brightness control
+ bind = , XF86MonBrightnessUp, exec, xbacklight -inc 15
+ bind = , XF86MonBrightnessDown, exec, xbacklight -dec 15
+ '';
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/decoration.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/decoration.nix
new file mode 100644
index 0000000..feb9145
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/decoration.nix
@@ -0,0 +1,43 @@
+_: {
+ wayland.windowManager.hyprland.settings.decoration = {
+ rounding = 10;
+ drop_shadow = true;
+ shadow_ignore_window = true;
+ shadow_range = 8;
+ shadow_render_power = 10;
+ shadow_offset = "2 2";
+ "col.shadow" = "rgba(00000055)"; # 2A
+
+ blurls = [
+ "gtk-layer-shell"
+ "lockscreen"
+ ];
+
+ # active_opacity = 0.9
+ # inactive_opacity = 0.7
+ # fullscreen_opacity = 1.0
+ active_opacity = 1.0;
+ inactive_opacity = 0.95;
+
+ blur = {
+ enabled = true;
+ xray = true;
+ special = false;
+ # size = 1;
+ passes = 2;
+ ignore_opacity = true;
+ new_optimizations = true;
+ # vibrancy = 0.1696;
+ # noise = 0.01;
+ brightness = 1;
+ contrast = 1;
+
+ popups = true;
+ popups_ignorealpha = 0.6;
+ };
+
+ dim_special = 0.35;
+ dim_inactive = false;
+ dim_strength = 0.1;
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/default.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/default.nix
new file mode 100644
index 0000000..e2538fd
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/default.nix
@@ -0,0 +1,43 @@
+_: {
+ imports = [
+ ./animations.nix
+ ./binds.nix
+ ./decoration.nix
+ ./environment.nix
+ ./executions.nix
+ ./general.nix
+ ./plugins.nix
+ ./rules.nix
+ ./workspaces.nix
+ ];
+
+ xdg.configFile = (
+ let
+ scripts = [
+ "common.sh"
+ "fake_fullscreen_status"
+ "hycov_easymotion"
+ "initialise_gtk"
+ "initialise_waybar"
+ "initialise_xdg_portal"
+ "move_focus_to_monitor"
+ "move_window_to_monitor"
+ "move_window_to_workspace"
+ "switch_workspace"
+ "toggle_gaps"
+ "toggle_layout"
+ ];
+ in
+ (
+ builtins.listToAttrs (map
+ (script: {
+ name = "hypr/hyprland/scripts/${script}";
+
+ value = {
+ source = ./scripts/${script};
+ };
+ })
+ scripts)
+ )
+ );
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/environment.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/environment.nix
new file mode 100644
index 0000000..81046ff
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/environment.nix
@@ -0,0 +1,80 @@
+_:
+let cursorSize = "18"; in
+{
+ wayland.windowManager.hyprland.settings.env = [
+ # Proton
+ "PROTON_ENABLE_NGX_UPDATER, 1"
+
+ # Cursor
+ "XCURSOR_SIZE, ${cursorSize}"
+ "HYPRCURSOR_SIZE, ${cursorSize}"
+ "HYPERCURSOR_THEME, Bibata-Modern-Ice" # WhiteSur-cursors
+ "XCURSOR_THEME, Bibata-Modern-Ice"
+
+ # Wayland & Xwayland
+ "GDK_BACKEND, wayland,x11,*"
+ "SDL_VIDEODRIVER, wayland"
+ "CLUTTER_BACKEND, wayland"
+ "XWAYLAND_NO_GLAMOR, 1" # Gamescope
+
+ # Nvidia
+ "LIBVA_DRIVER_NAME, nvidia"
+ "GBM_BACKEND, nvidia-drm"
+ "__GLX_VENDOR_LIBRARY_NAME, nvidia"
+ "__VK_LAYER_NV_optimus, NVIDIA_only"
+ "__NV_PRIME_RENDER_OFFLOAD, 1"
+ "NVD_BACKEND, direct"
+
+ # OpenGL
+ "__GL_GSYNC_ALLOWED, 1"
+ "__GL_VRR_ALLOWED, 1"
+ "__GL_MaxFramesAllowed, 1"
+
+ # Electron
+ # "ELECTRON_OZONE_PLATFORM_HINT, auto"
+ "OZONE_PLATFORM, wayland"
+
+ # Qt
+ "QT_AUTO_SCREEN_SCALE_FACTOR, 1"
+ "QT_QPA_PLATFORM, wayland;xcb"
+ "QT_WAYLAND_DISABLE_WINDOWDECORATION, 1"
+ "QT_QPA_PLATFORMTHEME, qt5ct"
+ # "QT_STYLE_OVERRIDE, kvantum"
+
+ # wlroots
+ "WLR_NO_HARDWARE_CURSORS, 1"
+ "WLR_DRM_NO_ATOMIC, 1"
+ "WLR_USE_LIBINPUT, 1"
+ "WLR_RENDERER_ALLOW_SOFTWARE, 1"
+ "WLR_DRM_DEVICES, /dev/dri/card0"
+ # "WLR_EGL_NO_MODIFIERS, 1"
+
+ # XDG
+ "XDG_SESSION_TYPE, wayland"
+ "XDG_CURRENT_DESKTOP, Hyprland"
+ "XDG_SESSION_DESKTOP, Hyprland"
+
+ # Mozilla
+ "MOZ_ENABLE_WAYLAND, 1"
+ "MOZ_DISABLE_RDD_SANDBOX, 1"
+
+ # Fcitx
+ # https://fcitx-im.org/wiki/Using_Fcitx_5_on_Wayland
+ "QT_IM_MODULE, fcitx"
+ "XMODIFIERS, @im=fcitx"
+ # "GTK_IM_MODULE, wayland"
+ # "GTK_IM_MODULE, fcitx"
+ "SDL_IM_MODULE, fcitx"
+ "GLFW_IM_MODULE, ibus"
+ "INPUT_METHOD, fcitx"
+
+ # GTK
+ "GTK_USE_PORTAL, 1"
+
+ # Java
+ "_JAVA_AWT_WM_NONREPARENTING, 1"
+
+ # SSH
+ # "SSH_AUTH_SOCK, $XDG_RUNTIME_DIR/ssh-agent.socket"
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/executions.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/executions.nix
new file mode 100644
index 0000000..2ff364f
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/executions.nix
@@ -0,0 +1,55 @@
+{ pkgs, ... }: {
+ wayland.windowManager.hyprland.settings = {
+ exec-once = ([
+ # One-shots
+ "hyprctl dispatch workspace 1"
+ "swww-daemon"
+ "gammastep -l 45.540750:-122.385330 >/dev/null"
+ "${pkgs.pyprland}/bin/pypr"
+ "hyprpm reload"
+ "swaddle"
+ # "${pkgs.waybar}/bin/waybar"
+ "waybar"
+ "hyprctl setcursor Bibata-Modern-Ice 18"
+
+ # Fcitx5
+ "fcitx5-remote -r"
+ "fcitx5 -d --replace"
+ "fcitx5-remote -r"
+
+ # GTK
+ "$script_path/initialise_gtk"
+
+ # KWallet
+ # "pam_kwallet_init"
+ # "kwalletd6"
+
+ # GNOME/Keyring
+ "gnome-keyring-daemon --replace --components=pkcs11,secrets,ssh,gpg"
+ "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 || /usr/libexec/polkit-gnome-authentication-agent-1"
+
+ # XDG, XDPH, & Qt
+ "dbus-update-activation-environment --systemd --all"
+ "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
+ "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
+ "systemctl --user import-environment QT_QPA_PLATFORMTHEME"
+ "$script_path/initialise_xdg_portal"
+
+ # Clipboard
+ "wl-paste --type text --watch cliphist store"
+ "wl-paste --type image --watch cliphist store"
+
+ # JamesDSP & Solaar
+ "jamesdsp -t"
+ # "solaar -w hide"
+
+ # SSH
+ # "killall -q ssh-agent"
+ # "eval $(ssh-agent -c)"
+ # "set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK"
+ # "set -Ux SSH_AGENT_PID $SSH_AGENT_PID"
+ # "set -Ux SSH_AUTH_SOCK $SSH_AUTH_SOCK"
+ # "export SSH_AUTH_SOCK=\"$XDG_RUNTIME_DIR/ssh-agent.socket\""
+ ]);
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/general.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/general.nix
new file mode 100644
index 0000000..e0821d5
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/general.nix
@@ -0,0 +1,119 @@
+_: {
+ wayland.windowManager.hyprland = {
+ settings = {
+ monitor = [
+ "HDMI-A-2, [email protected], 0x0, 1"
+ "DP-2, [email protected], 1920x0, 1"
+ "DP-1, [email protected], 3840x0, 1"
+ ];
+
+ source = "/home/fuwn/.cache/wal/colors-hyprland";
+
+ general = {
+ gaps_in = 5;
+ gaps_out = 10;
+ border_size = 0;
+ layout = "master";
+ allow_tearing = true;
+ resize_on_border = true;
+ no_focus_fallback = true;
+ };
+
+ input = {
+ kb_layout = "us";
+ # kb_variant =
+ # kb_model =
+ # kb_options =
+ # kb_rules =
+ repeat_rate = 35; # 50
+ repeat_delay = 250; # 200
+ follow_mouse = 1;
+ special_fallthrough = true;
+
+ touchpad = {
+ natural_scroll = true;
+ disable_while_typing = true;
+ clickfinger_behavior = true;
+ scroll_factor = 0.15;
+ tap-to-click = true;
+ middle_button_emulation = true;
+ };
+
+ sensitivity = -0.5;
+ accel_profile = "flat";
+ scroll_factor = 1.0;
+ # natural_scroll = false;
+ };
+
+ binds = {
+ allow_workspace_cycles = true;
+ scroll_event_delay = 0;
+ workspace_back_and_forth = true;
+ };
+
+ dwindle = {
+ pseudotile = true;
+ preserve_split = true;
+ force_split = 2;
+ smart_split = false;
+ smart_resizing = false;
+ no_gaps_when_only = 0;
+ special_scale_factor = 0.98;
+ };
+
+ master = {
+ allow_small_split = true;
+ new_is_master = false;
+ mfact = 0.55;
+ # no_gaps_when_only = yes;
+ orientation = "left";
+ inherit_fullscreen = false;
+ };
+
+ gestures = {
+ workspace_swipe = true;
+ workspace_swipe_distance = 700;
+ workspace_swipe_fingers = 4;
+ workspace_swipe_cancel_ratio = 0.2;
+ workspace_swipe_min_speed_to_force = 5;
+ workspace_swipe_direction_lock = true;
+ workspace_swipe_direction_lock_threshold = 10;
+ workspace_swipe_create_new = true;
+ };
+
+ misc = {
+ vrr = false;
+ vfr = false;
+ enable_swallow = true;
+ swallow_regex = "^(kitty|footclient|foot|Alacritty|wezterm)$";
+ disable_hyprland_logo = true;
+ disable_splash_rendering = true;
+ force_default_wallpaper = 0;
+ mouse_move_enables_dpms = true;
+ # key_press_enables_dpms = true;
+ # focus_on_activate = true;
+ animate_manual_resizes = true;
+ # animate_mouse_windowdragging = false;
+ mouse_move_focuses_monitor = true;
+ # new_window_takes_over_fullscreen = 2;
+ allow_session_lock_restore = true;
+ initial_workspace_tracking = false;
+ };
+
+ cursor = {
+ hide_on_key_press = true;
+ enable_hyprcursor = true;
+ };
+
+ xwayland = {
+ force_zero_scaling = true;
+ };
+
+ debug = {
+ watchdog_timeout = 0;
+ disable_logs = false;
+ damage_blink = false;
+ };
+ };
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/plugins.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/plugins.nix
new file mode 100644
index 0000000..61d73e3
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/plugins.nix
@@ -0,0 +1,69 @@
+_: {
+ wayland.windowManager.hyprland.settings.plugin = {
+ # split-monitor-workspaces = {
+ # count = 10;
+ # keep_focused = 0;
+ # enable_notifications = 0;
+ # };
+
+ hyprtrails = {
+ color = "rgba(cfddf619)";
+ };
+
+ hyprfocus = {
+ enabled = true;
+ animate_floating = true;
+ animate_workspacechange = true;
+ focus_animation = "flash";
+
+ bezier = [
+ "bezIn, 0.5, 0.0, 1.0, 0.5"
+ "bezOut, 0.0, 0.5, 0.5, 1.0"
+ "overshot, 0.05, 0.9, 0.1, 1.05"
+ "smoothOut, 0.36, 0, 0.66, -0.56"
+ "smoothIn, 0.25, 1, 0.5, 1"
+ "realsmooth, 0.28, 0.29, .69, 1.08"
+ ];
+
+ flash = {
+ flash_opacity = 0.85;
+ in_bezier = "realsmooth";
+ in_speed = 0.5;
+ out_bezier = "realsmooth";
+ out_speed = 3;
+ };
+
+ shrink = {
+ shrink_percentage = 0.99;
+ in_bezier = "realsmooth";
+ in_speed = 1;
+ out_bezier = "realsmooth";
+ out_speed = 2;
+ };
+ };
+
+ hycov = {
+ overview_gappo = 10; # gaps width from screen edge
+ overview_gappi = 10; # gaps width from clients
+ enable_hotarea = 0; # enable mouse cursor hotarea, when cursor enter hotarea, it will toggle overview
+ enable_click_action = 1; # enable mouse left button jump and right button kill in overview mode
+ hotarea_monitor = "all"; # monitor name which hotarea is in, default is all
+ hotarea_pos = 1; # position of hotarea (1: bottom left, 2: bottom right, 3: top left, 4: top right)
+ hotarea_size = 10; # hotarea size, 10x10
+ swipe_fingers = 4; # finger number of gesture,move any directory
+ move_focus_distance = 100; # distance for movefocus,only can use 3 finger to move
+ enable_gesture = 0; # enable gesture
+ auto_exit = 1; # enable auto exit when no client in overview
+ auto_fullscreen = 0; # auto make active window maximize after exit overview
+ only_active_workspace = 0; # only overview the active workspace
+ only_active_monitor = 0; # only overview the active monitor
+ enable_alt_release_exit = 1; # alt swith mode arg,see readme for detail
+ alt_replace_key = "Super_L"; # alt swith mode arg,see readme for detail
+ alt_toggle_auto_next = 0; # auto focus next window when toggle overview in alt swith mode
+ click_in_cursor = 1; # when click to jump,the target windwo is find by cursor, not the current foucus window.
+ height_of_titlebar = 0; # height deviation of title bar height
+ show_special = 0; # show windwos in special workspace in overview.
+ raise_float_to_top = 1; # raise the window that is floating before to top after leave overview mode
+ };
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/rules.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/rules.nix
new file mode 100644
index 0000000..862d8f1
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/rules.nix
@@ -0,0 +1,78 @@
+_: {
+ wayland.windowManager.hyprland = {
+ settings = {
+ # Layer Rules
+ layerrule = [
+ "animation slide, notifications"
+ "noanim, selection"
+ "noanim, picker"
+ ];
+
+ windowrulev2 = [
+ # Dialog Rules
+ "float, class:file_progress"
+ "float, class:confirm"
+ "float, class:dialog"
+ "float, class:download"
+ "float, class:notification"
+ "float, class:error"
+ "float, class:splash"
+ "float, class:confirmreset"
+ "float, title:Open File"
+ "float, title:branchdialog"
+ "float, title:^(Open File)(.*)$"
+ "float, title:^(Select a File)(.*)$"
+ "float, title:^(Choose wallpaper)(.*)$"
+ "float, title:^(Open Folder)(.*)$"
+ "float, title:^(Save As)(.*)$"
+ "float, title:^(Library)(.*)$"
+ "float, initialClass:^(xdg-desktop-portal-.*)$"
+
+ # Control Application Rules
+ "float, class:^(Network)$"
+ "float, class:^(pavucontrol)$"
+ "float, class:^(Color Picker)$"
+ "float, class:^(File Picker)$"
+ "float, class:^(nm-connection-editor)$"
+ "float, class:pavucontrol-qt"
+ "float, class:pavucontrol"
+ "float, title:^(Media viewer)$"
+ "float, title:^(Volume Control)$"
+ "float, title:^(Picture-in-Picture)$"
+ "float, class:^(blueberry.py)$"
+ "float, class:Lxappearance"
+ "pseudo, class:fcitx"
+ "size 50% 50%, title:^(Volume Control)$"
+
+ # Application Rules
+ "float, class:^(transmission-gtk)$"
+ "float, class:viewnior"
+ "float, class:feh"
+ "float, class:^(steam)$"
+ "float, class:file-roller"
+ "center, class:feh"
+ "workspace 9, initialTitle:^(Spotify Premium)$"
+ "tile, initialTitle:^(Photopea)$"
+ "tile, initialTitle:^(WorldsPlayer by Worlds Inc)$"
+ # "size 75% 75%, class:feh"
+
+ # XWayland Video Bridge
+ "noblur, class:^(xwaylandvideobridge)$"
+ "noanim, class:^(xwaylandvideobridge)$"
+ "noinitialfocus, class:^(xwaylandvideobridge)$"
+ "opacity 0.0 override, class:^(xwaylandvideobridge)$"
+ "maxsize 1 1, class:^(xwaylandvideobridge)$"
+
+ # Tearing
+ "immediate, class:.*\.exe"
+ "immediate, class:(steam_app)"
+
+ # Idle Inhibit
+ # "idleinhibit fullscreen, class:^(*)$"
+ # "idleinhibit fullscreen, title:^(*)$"
+ "idleinhibit fullscreen, fullscreen:1"
+ "idleinhibit focus, class:mpv"
+ ];
+ };
+ };
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh
new file mode 100644
index 0000000..25be5b6
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh
@@ -0,0 +1,146 @@
+#!/usr/bin/env bash
+
+# . "$(dirname "$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || echo "${0}")" || true)/common.sh"
+# or
+# . "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+get_hyprctl_monitors() {
+ hyprctl monitors -j || true
+}
+
+get_hyprctl_workspaces() {
+ hyprctl workspaces -j || true
+}
+
+get_focused_monitor() {
+ (get_hyprctl_monitors || true) |
+ jq -r '.[] | select(.focused) | .name'
+}
+
+get_active_monitor() {
+ get_focused_monitor
+}
+
+get_active_workspaces() {
+ local monitor=$1
+
+ (get_hyprctl_workspaces || true) |
+ (jq -r ".[] | select(.monitor == \"${monitor}\") | .id" || true) |
+ grep -v '-'
+}
+
+get_active_workspace() {
+ local monitor=$1
+
+ (get_hyprctl_monitors || true) |
+ jq -r ".[] | select(.name == \"${monitor}\") | .activeWorkspace.id"
+}
+
+get_current_workspace() {
+ (hyprctl activeworkspace -j || true) |
+ jq -r ".id"
+}
+
+get_empty_workspace() {
+ local monitor=$1
+
+ (hyprctl workspaces -j || true) |
+ (jq -r ".[] | select(.monitor == \"${monitor}\" and .windows == 0) | .id" || true) |
+ (grep -v '-' || true) |
+ head -n 1
+}
+
+get_workspace_client_count() {
+ local workspace=$1
+
+ (hyprctl workspaces -j || true) | jq -r ".[] | select(.id == ${workspace}) | .windows"
+}
+
+get_relative_target_workspace() {
+ target_workspace=$1
+ workspace=0
+
+ case "$(get_focused_monitor)" in
+ "HDMI-A-2")
+ workspace=$((target_workspace + 10))
+ ;;
+ "DP-2")
+ workspace=${target_workspace}
+ ;;
+ "DP-1")
+ workspace=$((target_workspace + 20))
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+
+ echo "${workspace}"
+}
+
+is_monitor_fullscreen() {
+ monitor=$1
+
+ (hyprctl workspaces -j || true) |
+ jq -r ".[] | select(.monitor == \"${monitor}\") | select(.id == $(get_active_workspace "${monitor}" || true)) | .hasfullscreen"
+}
+
+get_relative_target_monitor() {
+ direction=$1
+ ignore_fullscreen=${2:-0}
+
+ case $(get_focused_monitor) in
+ "HDMI-A-2")
+ if [[ "${direction}" == "right" ]]; then
+ target_monitor="DP-2"
+ else
+ target_monitor="DP-1"
+ fi
+ ;;
+ "DP-2")
+ if [[ "${direction}" == "right" ]]; then
+ target_monitor="DP-1"
+ else
+ target_monitor="HDMI-A-2"
+ fi
+ ;;
+ "DP-1")
+ if [[ "${direction}" == "left" ]]; then
+ target_monitor="DP-2"
+ else
+ target_monitor="HDMI-A-2"
+ fi
+ ;;
+ *)
+ exit 1
+ ;;
+ esac
+
+ if [[ "$(is_monitor_fullscreen "${target_monitor}")" == "true" && "${ignore_fullscreen}" = 0 ]]; then
+ case $target_monitor in
+ "HDMI-A-2")
+ if [[ "$direction" == "right" ]]; then
+ target_monitor="DP-2"
+ else
+ target_monitor="DP-1"
+ fi
+ ;;
+ "DP-2")
+ if [[ "$direction" == "right" ]]; then
+ target_monitor="DP-1"
+ else
+ target_monitor="HDMI-A-2"
+ fi
+ ;;
+ "DP-1")
+ if [[ "$direction" == "left" ]]; then
+ target_monitor="DP-2"
+ else
+ target_monitor="HDMI-A-2"
+ fi
+ ;;
+ esac
+ fi
+
+ echo "${target_monitor}"
+}
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status
new file mode 100755
index 0000000..e198758
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status
@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+. "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+previous_id=$(cat /tmp/fake_fullscreen_notify_id 2>/dev/null)
+previous_id_flag=""
+
+if [[ -n "${previous_id}" ]]; then
+ previous_id_flag="-r ${previous_id}"
+fi
+
+id=$(notify-send -p ${previous_id_flag} "$(hyprctl activewindow -j | jq -r '.title')
+
+Fake fullscreen is $([[ "$(hyprctl activewindow -j | jq -r '.fakeFullscreen')" == "true" ]] &&
+ echo "enabled" ||
+ echo "disabled").")
+
+echo "${id}" >/tmp/fake_fullscreen_notify_id
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion
new file mode 100755
index 0000000..ab7c3bb
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion
@@ -0,0 +1,10 @@
+#!/usr/bin/env dash
+
+workspace_name=$(hyprctl -j activeworkspace | jq -r '.name')
+
+if [ "${workspace_name}" = "OVERVIEW" ]; then
+ hyprctl dispatch hycov:leaveoverview
+else
+ hyprctl dispatch hycov:enteroverview
+ hyprctl dispatch 'easymotion action:hyprctl --batch "dispatch focuswindow address:{} ; dispatch hycov:leaveoverview"'
+fi
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk
new file mode 100755
index 0000000..861aa12
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk
@@ -0,0 +1,19 @@
+#!/usr/bin/env dash
+
+THEME='WhiteSur-Dark'
+ICONS='WhiteSur-dark'
+FONT='SF Pro Text'
+# CURSOR='WhiteSur-cursors'
+CURSOR='Bibata-Modern-Ice'
+CURSOR_SIZE='18'
+SCHEMA='gsettings set org.gnome.desktop.interface'
+
+apply_themes() {
+ ${SCHEMA} gtk-theme "${THEME}"
+ ${SCHEMA} icon-theme "${ICONS}"
+ ${SCHEMA} cursor-theme "${CURSOR}"
+ ${SCHEMA} cursor-size "${CURSOR_SIZE}"
+ ${SCHEMA} font-name "${FONT}"
+}
+
+apply_themes
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar
new file mode 100755
index 0000000..09f7ff9
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar
@@ -0,0 +1,19 @@
+#!/usr/bin/env dash
+
+CONFIG_FILES="${HOME}/.config/waybar/config.json ${HOME}/.config/waybar/default-modules.json ${HOME}/.config/waybar/style.css ${HOME}/.cache/wal/colors-waybar.css"
+
+trap "pkill -x waybar" EXIT
+
+\cp -r ~/.cache/wal/colors-waybar.css ~/.config/waybar/
+
+while true; do
+ if ! pgrep -x "waybar" >/dev/null; then
+ waybar -c ~/.config/waybar/config.json -s ~/.config/waybar/style.css &
+ fi
+
+ inotifywait -e create,modify ${CONFIG_FILES}
+
+ pkill -x waybar
+
+ while pgrep -x waybar >/dev/null; do sleep 0.5; done
+done
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal
new file mode 100755
index 0000000..10470eb
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal
@@ -0,0 +1,13 @@
+#!/usr/bin/env dash
+
+sleep 1
+
+killall -e xdg-desktop-portal-hyprland
+killall -e xdg-desktop-portal-wlr
+killall xdg-desktop-portal
+
+/usr/lib/xdg-desktop-portal-hyprland &
+
+sleep 2
+
+/usr/lib/xdg-desktop-portal &
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor
new file mode 100755
index 0000000..27562a9
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+. "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+target_monitor=$(get_relative_target_monitor "$1" 1)
+
+if [[ -n "${target_monitor}" ]]; then
+ hyprctl dispatch focusmonitor "${target_monitor}"
+fi
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor
new file mode 100755
index 0000000..06e4f94
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+. "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+target_monitor=$(get_relative_target_monitor "$1")
+target_workspace=$(get_active_workspace "${target_monitor}")
+
+# target_workspace=$(get_empty_workspace $target_monitor)
+
+# if [[ -z "$target_workspace" ]]; then
+# target_workspace=$(get_active_workspaces $target_monitor | head -n 1)
+# fi
+
+if [[ -n "${target_workspace}" ]]; then
+ hyprctl dispatch movetoworkspace "${target_workspace}"
+fi
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace
new file mode 100755
index 0000000..4256a9f
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace
@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+. "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+initial_active_workspace="$(get_current_workspace)"
+target_workspace="$(get_relative_target_workspace "${1}")"
+
+hyprctl dispatch movetoworkspace "${target_workspace}"
+
+if [[ $(get_workspace_client_count "${target_workspace}") -gt 2 ]]; then
+ hyprctl dispatch workspace "${initial_active_workspace}"
+fi
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace
new file mode 100755
index 0000000..fc8900c
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+. "${HOME}/.config/hypr/hyprland/scripts/common.sh"
+
+hyprctl dispatch workspace "$(get_relative_target_workspace "${1}")"
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps
new file mode 100755
index 0000000..d593ab2
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps
@@ -0,0 +1,13 @@
+#!/usr/bin/env dash
+
+inner_gap_size=5
+outer_gap_size=10
+
+if [ "$(hyprctl getoption general:gaps_in | awk '{print $3}' || true)" -eq 0 ] &&
+ [ "$(hyprctl getoption general:gaps_out | awk '{print $3}' || true)" -eq 0 ]; then
+ hyprctl keyword general:gaps_in "${inner_gap_size}"
+ hyprctl keyword general:gaps_out "${outer_gap_size}"
+else
+ hyprctl keyword general:gaps_in 0
+ hyprctl keyword general:gaps_out 0
+fi
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout
new file mode 100755
index 0000000..1ef8774
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout
@@ -0,0 +1,22 @@
+#!/usr/bin/env dash
+
+layout=$(hyprctl -j getoption general:layout)
+new_layout=""
+
+case "$(echo "${layout}" | jq -r .str)" in
+dwindle)
+ hyprctl keyword general:layout master
+
+ new_layout="master"
+
+ ;;
+master)
+ hyprctl keyword general:layout dwindle
+
+ new_layout="dwindle"
+
+ ;;
+*) ;;
+esac
+
+notify-send "You've changed the layout to ${new_layout}."
diff --git a/home/fuwn/meta/desktop/wayland/hyprland/hyprland/workspaces.nix b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/workspaces.nix
new file mode 100644
index 0000000..89644ae
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/hyprland/hyprland/workspaces.nix
@@ -0,0 +1,38 @@
+_: {
+ wayland.windowManager.hyprland.settings.workspace = (
+ let
+ generateWorkspaces = monitor: workspaces: offset:
+ builtins.genList
+ (x:
+ let
+ ws =
+ let
+ c = (x + 1) / workspaces;
+ in
+ builtins.toString (x + 1 - (c * workspaces));
+ in
+ [ "${toString (x + offset + 1)}, monitor:${monitor}" ]
+ )
+ workspaces;
+ generateWorkspacesAll = monitors: tags:
+ builtins.concatLists (builtins.map
+ (monitor: generateWorkspaces
+ (builtins.elemAt monitors monitor)
+ tags
+ (builtins.elemAt
+ (builtins.genList
+ (index: index * tags)
+ (builtins.length monitors))
+ monitor))
+ (builtins.genList (index: index) (builtins.length monitors))
+ );
+ in
+ builtins.concatLists (generateWorkspacesAll [ "DP-2" "HDMI-A-2" "DP-1" ] 10)
+ ) ++ [
+ "special:simple_terminal, on-created-empty:[float;center;size 50% 65%] kitty --class simple_terminal"
+ "special:simple_calculator, on-created-empty:[float;center;size 50% 50%] kitty --class simple_calculator -e bc -lq"
+ "special:chatgpt, on-created-empty:[float;center;size 65% 75%] thorium-browser --user-data-dir=/home/fuwn/.local/share/spgpt --app='https://chatgpt.com/'"
+ "special:spotify, on-created-empty:[float;center;size 65% 90%] LD_PRELOAD=/usr/lib/spotifywm.so /opt/spotify/spotify"
+ "special:calculator, on-created-empty:[float;center;size 50% 50%] qalculate-gtk"
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/meta/default.nix b/home/fuwn/meta/desktop/wayland/meta/default.nix
new file mode 100644
index 0000000..0115f30
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/meta/default.nix
@@ -0,0 +1,5 @@
+_: {
+ imports = [
+ ./screenshot
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/meta/screenshot/default.nix b/home/fuwn/meta/desktop/wayland/meta/screenshot/default.nix
new file mode 100644
index 0000000..5900ee2
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/meta/screenshot/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ grim
+ slurp
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/waybar/default.nix b/home/fuwn/meta/desktop/wayland/waybar/default.nix
new file mode 100644
index 0000000..9d3d691
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/waybar/default.nix
@@ -0,0 +1,92 @@
+{ pkgs, ... }: {
+ programs.waybar = {
+ enable = true;
+ style = ./waybar/style.css;
+
+ settings = (
+ let
+ defaultModules =
+ (import ./waybar/default-modules.nix {
+ inherit pkgs;
+ });
+ hyprland-workspaces-base = {
+ disable-scroll = true;
+ disable-markup = false;
+ all-outputs = false;
+ format = "{icon}";
+ };
+ in
+ [
+ (defaultModules // {
+ output = "HDMI-A-2";
+ "hyprland/workspaces" = hyprland-workspaces-base // {
+ format-icons = {
+ "11" = "一";
+ "12" = "二";
+ "13" = "三";
+ "14" = "四";
+ "15" = "五";
+ "16" = "六";
+ "17" = "七";
+ "18" = "八";
+ "19" = "九";
+ "20" = "十";
+ };
+ };
+ })
+ (defaultModules // {
+ output = "DP-2";
+ "hyprland/workspaces" = hyprland-workspaces-base // {
+ format-icons = {
+ "1" = "一";
+ "2" = "二";
+ "3" = "三";
+ "4" = "四";
+ "5" = "五";
+ "6" = "六";
+ "7" = "七";
+ "8" = "八";
+ "9" = "九";
+ "10" = "十";
+ };
+ };
+ })
+ (defaultModules // {
+ output = "DP-1";
+ "hyprland/workspaces" = hyprland-workspaces-base // {
+ format-icons = {
+ "21" = "一";
+ "22" = "二";
+ "23" = "三";
+ "24" = "四";
+ "25" = "五";
+ "26" = "六";
+ "27" = "七";
+ "28" = "八";
+ "29" = "九";
+ "30" = "十";
+ };
+ };
+ })
+ ]
+ );
+ };
+ xdg.configFile = (
+ let
+ scripts = [
+ "mediaplayer.py"
+ ];
+ in
+ (
+ builtins.listToAttrs (map
+ (script: {
+ name = "waybar/scripts/${script}";
+
+ value = {
+ source = ./waybar/scripts/${script};
+ };
+ })
+ scripts)
+ )
+ );
+}
diff --git a/home/fuwn/meta/desktop/wayland/waybar/waybar/default-modules.nix b/home/fuwn/meta/desktop/wayland/waybar/waybar/default-modules.nix
new file mode 100644
index 0000000..a793332
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/waybar/waybar/default-modules.nix
@@ -0,0 +1,214 @@
+{ pkgs, ... }: {
+ layer = "top";
+ position = "top";
+ margin-left = 8;
+ margin-right = 8;
+ height = 40;
+
+ bluetooth = {
+ format = "";
+ on-click = "${pkgs.blueberry}/bin/blueberry";
+ };
+
+ clock = {
+ locale = "ja_JP.utf8";
+ interval = 5;
+ tooltip-format = "<tt><small>{calendar}</small></tt>";
+ # format = "{:%m月 %d日 %H:%M:%S}";
+ format = "{:L%m月 %d日 %H:%M}";
+ format-alt = "{:L%G年%b %d日 %A}";
+ };
+
+ # For when clock doesn't work
+ "custom/clock" = {
+ exec = "date '+%m月 %d日 %H:%M'";
+ tooltip = false;
+ interval = 5;
+ };
+
+ cpu = {
+ interval = 5;
+ format = " {usage}% ({load})";
+
+ states = {
+ warning = 70;
+ critical = 90;
+ };
+
+ on-click = "kitty -e '${pkgs.bottom}/bin/btm'";
+ };
+
+ memory = {
+ interval = 5;
+ format = " {}%";
+ format-alt = " {used:0.1f}/{total:0.1f}ギガ";
+
+ # I might remove these. I have 64GB of RAM ....
+ states = {
+ warning = 70;
+ critical = 90;
+ };
+ };
+
+ network = {
+ interval = 1;
+ # format-wifi = " {bandwidthUpBytes} {bandwidthDownBytes}",
+ # format-ethernet = " {bandwidthUpBytes} {bandwidthDownBytes}",
+ format = " {bandwidthUpBytes}  {bandwidthDownBytes}";
+ format-disconnected = "⚠ Disconnected";
+ tooltip-format = "{ifname}: {ipaddr}";
+ on-click = "kitty -e 'nmtui'";
+ };
+
+ "hyprland/mode" = {
+ format = "{}";
+ tooltip = false;
+ };
+
+ "hyprland/window" = {
+ format = "{}";
+ max-length = 120;
+ separate-outputs = true;
+ icon = false;
+
+ rewrite = {
+ "(.*) - Thorium" = "󰖟 $1";
+ "(.*) - NVIM" = " $1";
+ "ChatGPT" = " ChatGPT";
+ "~(.*)" = " ~$1";
+ "…(.*)" = " …$1";
+ "zsh" = " ~";
+ "fish" = " ~";
+ "kitty" = " ~";
+ "Volume Control" = " Volume Control";
+ "Bluetooth" = " Bluetooth";
+ "JamesDSP for Linux" = "󰺢 JamesDSP";
+ };
+ };
+
+ pulseaudio = {
+ scroll-step = 1;
+ format = "{icon} {volume}%";
+ # format-bluetooth = "{volume}% {icon}  {format_source}";
+ # format-bluetooth-muted = " {icon}  {format_source}";
+ format-muted = "󰸈";
+
+ format-icons = {
+ headphone = "󰋋";
+ hands-free = "וֹ";
+ headset = "󱡏";
+ phone = "";
+ portable = "";
+ car = "";
+
+ default = [ "" ];
+ };
+
+ on-click = "pactl set-sink-mute @DEFAULT_SINK@ toggle";
+ on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol";
+ on-scroll-up = "pactl set-sink-volume @DEFAULT_SINK@ +2%";
+ on-scroll-down = "pactl set-sink-volume @DEFAULT_SINK@ -2%";
+ };
+
+ tray = {
+ spacing = 10;
+ show-passive-items = true;
+ };
+
+ "image#album-art" = {
+ path = "/tmp/mediaplayer_art";
+ size = 22.5; # (18 + (18 / 4))
+ interval = 5;
+ on-click = "${pkgs.playerctl}/bin/playerctl play-pause";
+ };
+
+ "custom/media" = {
+ format = "{icon} {}";
+ return-type = "json";
+ max-length = 40;
+
+ format-icons = {
+ spotify = " ";
+ default = "󰗃 ";
+ };
+
+ escape = true;
+ exec = "/usr/bin/env python3 ~/.config/waybar/scripts/mediaplayer.py 2> /dev/null";
+ on-click = "${pkgs.playerctl}/bin/playerctl play-pause";
+ on-scroll-up = "${pkgs.playerctl}/bin/playerctl next";
+ on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous";
+ };
+
+ cava = {
+ framerate = 280;
+ autosens = 1;
+ sensitivity = 3;
+ bars = 26;
+ lower_cutoff_freq = 50;
+ higher_cutoff_freq = 10000;
+ method = "pipewire";
+ source = "auto";
+ stereo = true;
+ reverse = true;
+ bar_delimiter = 0;
+ monstercat = false;
+ waves = false;
+ hide_on_silence = true;
+ noise_reduction = 0.77;
+ input_delay = 0;
+ on-click = "${pkgs.playerctl}/bin/playerctl play-pause";
+
+ # actions = {
+ # on-click-right = "mode";
+ # };
+
+ # format-icons = ["░", "▒", "▓", "█", "█", "█", "█", "█"]
+ # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎼", "⎻", "⎺", "⎹"]
+ # format-icons = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]
+ format-icons = [ "⠁" "⠃" "⠇" "⠋" "⠛" "⠟" "⠿" "⣿" ];
+ # format-icons = ["◰", "◳", "◲", "◱", "▘", "▝", "▖", "▗"]
+ # format-icons = ["▖", "▗", "▘", "▝", "▚", "▞", "▛", "▟"]
+ # format-icons = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊"]
+ # format-icons = ["⎯", "⎰", "⎱", "⎲", "⎳", "⎴", "⎵", "⎶"]
+ # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎾", "⎿", "⏀", "⏁"]
+ # format-icons = ["♪", "♫", "♬", "♭", "♮", "♯", "♩", "♪"]
+ # format-icons = ["→", "⇉", "⇒", "⇉", "→", "⇉", "⇒", "⇉"]
+ # format-icons = ["·", ":", "⁙", "⁘", "⁙", ":", "·", "•"]
+ # format-icons = ["○", "◔", "◑", "◕", "●", "◍", "◎", "◉"]
+ # format-icons = ["△", "▲", "▴", "▸", "▶", "▹", "►", "▻"]
+ # format-icons = ["◇", "◈", "◉", "◍", "◎", "◯", "⦿", "◑"]
+ # format-icons = ["-", "–", "—", "––", "–––", "——", "———", "——––"]
+ # format-icons = ["-", "=", "≡", "≣", "≠", "≢", "≜", "≝"]
+ # format-icons = ["✓", "✔", "✕", "✖", "✗", "✘", "✙", "✚"]
+ # format-icons = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"]
+ };
+
+ "custom/gpu" = {
+ exec = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader | sed 's/ %/%/'";
+ interval = 5;
+ format = " {}";
+ on-click = "kitty -e 'nvtop'";
+ };
+
+ modules-left = [
+ "hyprland/workspaces"
+ "hyprland/window"
+ "custom/media"
+ "image#album-art"
+ ];
+
+ modules-center = [
+ "clock"
+ ];
+
+ modules-right = [
+ "cava"
+ # "network"
+ "tray"
+ "cpu"
+ "custom/gpu"
+ "memory"
+ "bluetooth"
+ "pulseaudio"
+ ];
+}
diff --git a/home/fuwn/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py b/home/fuwn/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py
new file mode 100755
index 0000000..c44ee0b
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python3
+
+import argparse
+import logging
+import os
+import sys
+import signal
+import gi
+import json
+
+gi.require_version("Playerctl", "2.0")
+
+from gi.repository import Playerctl, GLib
+
+logger = logging.getLogger(__name__)
+
+
+def write_output(text, player):
+ logger.info("Writing output")
+
+ output = {
+ "text": text,
+ "class": "custom-" + player.props.player_name,
+ "alt": player.props.player_name,
+ "art": player.props.metadata["mpris:artUrl"],
+ }
+
+ sys.stdout.write(json.dumps(output) + "\n")
+ sys.stdout.flush()
+
+
+def on_play(player, status, manager):
+ logger.info("Received new playback status")
+ on_metadata(player, player.props.metadata, manager)
+
+
+def on_metadata(player, metadata, manager):
+ logger.info("Received new metadata")
+
+ track_info = ""
+
+ if (
+ player.props.player_name == "spotify"
+ and "mpris:trackid" in metadata.keys()
+ and ":ad:" in player.props.metadata["mpris:trackid"]
+ ):
+ track_info = "AD PLAYING"
+ elif player.get_artist() != "" and player.get_title() != "":
+ track_info = "{title} - {artist}".format(
+ artist=player.get_artist(), title=player.get_title()
+ )
+ else:
+ track_info = player.get_title()
+
+ if "file://" in player.props.metadata["mpris:artUrl"]:
+ os.system(
+ f"cp $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') /tmp/mediaplayer_art"
+ )
+ else:
+ os.system(
+ f"curl --silent $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') --output /tmp/mediaplayer_art"
+ )
+
+ # if player.props.status != 'Playing' and track_info:
+ # track_info = ' ' + track_info
+
+ write_output(track_info, player)
+
+
+def on_player_appeared(manager, player, selected_player=None):
+ if player is not None and (
+ selected_player is None or player.name == selected_player
+ ):
+ init_player(manager, player)
+ else:
+ logger.debug("New player appeared, but it's not the selected player, skipping")
+
+
+def on_player_vanished(manager, player):
+ logger.info("Player has vanished")
+ sys.stdout.write("\n")
+ sys.stdout.flush()
+ os.system("rm /tmp/mediaplayer_art")
+
+
+def init_player(manager, name):
+ logger.debug("Initialize player: {player}".format(player=name.name))
+
+ player = Playerctl.Player.new_from_name(name)
+
+ player.connect("playback-status", on_play, manager)
+ player.connect("metadata", on_metadata, manager)
+ manager.manage_player(player)
+ on_metadata(player, player.props.metadata, manager)
+
+
+def signal_handler(sig, frame):
+ logger.debug("Received signal to stop, exiting")
+ sys.stdout.write("\n")
+ sys.stdout.flush()
+ # loop.quit()
+ sys.exit(0)
+
+
+def parse_arguments():
+ parser = argparse.ArgumentParser()
+
+ parser.add_argument("-v", "--verbose", action="count", default=0)
+ parser.add_argument("--player")
+
+ return parser.parse_args()
+
+
+def main():
+ arguments = parse_arguments()
+ logging.basicConfig(
+ stream=sys.stderr,
+ level=logging.DEBUG,
+ format="%(name)s %(levelname)s %(message)s",
+ )
+
+ logger.setLevel(max((3 - arguments.verbose) * 10, 0))
+ logger.debug("Arguments received {}".format(vars(arguments)))
+
+ manager = Playerctl.PlayerManager()
+ loop = GLib.MainLoop()
+
+ manager.connect(
+ "name-appeared", lambda *args: on_player_appeared(*args, arguments.player)
+ )
+ manager.connect("player-vanished", on_player_vanished)
+ signal.signal(signal.SIGINT, signal_handler)
+ signal.signal(signal.SIGTERM, signal_handler)
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+ for player in manager.props.player_names:
+ if arguments.player is not None and arguments.player != player.name:
+ logger.debug(
+ "{player} is not the filtered player, skipping it".format(
+ player=player.name
+ )
+ )
+
+ continue
+
+ init_player(manager, player)
+
+ loop.run()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/home/fuwn/meta/desktop/wayland/waybar/waybar/style.css b/home/fuwn/meta/desktop/wayland/waybar/waybar/style.css
new file mode 100644
index 0000000..9a85e83
--- /dev/null
+++ b/home/fuwn/meta/desktop/wayland/waybar/waybar/style.css
@@ -0,0 +1,134 @@
+@import "/home/fuwn/.cache/wal/colors-waybar.css";
+
+* {
+ /* font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; */
+ /* font-family: Noto Sans Mono, Sarasa Mono J, cursive; */
+ /* font-family: SF Mono, cursive; */
+ /* font-family: MesloLGS NF; */
+ font-family: SF Pro, Hiragino Sans, cursive;
+ font-size: 15px;
+}
+
+window#waybar {
+ background-color: rgba(0, 0, 0, 0);
+ color: @foreground;
+ /* -gtk-icon-shadow: */
+ /* -1px 0 #ffffff, */
+ /* 0 1px #ffffff, */
+ /* 1px 0 #ffffff, */
+ /* 0 -1px #ffffff; */
+}
+
+#battery,
+#cava,
+#custom-know,
+#clock,
+#custom-clock,
+#backlight,
+#cpu,
+#custom-keyboard-layout,
+#memory,
+#mode,
+#custom-weather,
+#network,
+#pulseaudio,
+#temperature,
+#tray,
+#idle_inhibitor,
+#window,
+#bluetooth,
+#custom-power,
+#workspaces,
+#custom-media,
+#custom-gpu,
+#custom-PBPbattery {
+ /* padding: 0.25rem 0.75rem; */
+ /* margin: 10px 5px 0px 0; */
+ padding: 5px 15px;
+ margin: 10px 1rem 0px 0;
+ background-color: @background;
+ border-radius: 10px; /* 9 */
+ color: @foreground;
+}
+
+#image {
+ margin-top: 10px;
+ border-top-right-radius: 10px;
+ border-bottom-right-radius: 10px;
+ background-color: @background;
+ margin-right: 1rem;
+ padding-right: 1rem;
+}
+
+#image > * {
+ border-radius: 10px;
+}
+
+#image.empty {
+ background-color: transparent;
+ min-width: 0;
+ min-height: 0;
+ margin: 0;
+ padding: 0;
+}
+
+window#waybar #custom-media {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ padding-right: 1rem;
+ margin-right: 0;
+}
+
+window#waybar.empty #window {
+ background-color: transparent;
+ padding: 0;
+ margin: 0;
+}
+
+window#custom-media.empty #window {
+ background-color: transparent;
+}
+
+#workspaces button.active {
+ color: @color11;
+}
+
+#workspaces button:hover {
+ background-color: unset;
+}
+
+#pulseaudio {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ margin-left: 0;
+ padding-left: 0.5rem;
+}
+
+#bluetooth {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ margin-right: 0;
+ padding-right: 0.5rem;
+}
+
+#memory {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ margin-left: 0;
+ padding-left: 0.5rem;
+}
+
+#custom-gpu {
+ border-radius: 0;
+ margin-right: 0;
+ margin-left: 0;
+ padding-right: 0.5rem;
+ padding-left: 0.5rem;
+}
+
+#cpu {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ margin-right: 0;
+ padding-right: 0.5rem;
+}
diff --git a/home/fuwn/meta/imagery/default.nix b/home/fuwn/meta/imagery/default.nix
new file mode 100644
index 0000000..38c92e8
--- /dev/null
+++ b/home/fuwn/meta/imagery/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nsxiv
+ viewnior
+ feh
+ viu
+ ];
+}
diff --git a/home/fuwn/meta/language/codespell/default.nix b/home/fuwn/meta/language/codespell/default.nix
new file mode 100644
index 0000000..9018b9f
--- /dev/null
+++ b/home/fuwn/meta/language/codespell/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ codespell
+ ];
+}
diff --git a/home/fuwn/meta/language/default.nix b/home/fuwn/meta/language/default.nix
new file mode 100644
index 0000000..3a48e40
--- /dev/null
+++ b/home/fuwn/meta/language/default.nix
@@ -0,0 +1,5 @@
+_: {
+ imports = [
+ ./codespell
+ ];
+}
diff --git a/home/fuwn/meta/rice/bottom/default.nix b/home/fuwn/meta/rice/bottom/default.nix
new file mode 100644
index 0000000..4acf218
--- /dev/null
+++ b/home/fuwn/meta/rice/bottom/default.nix
@@ -0,0 +1,195 @@
+{ pkgs, ... }: {
+ programs.bottom.enable = true;
+
+ xdg.configFile."bottom/bottom.toml".text = ''
+ # This is a default config file for bottom. All of the settings are commented
+ # out by default; if you wish to change them uncomment and modify as you see
+ # fit.
+
+ # This group of options represents a command-line flag/option. Flags explicitly
+ # added when running (ie: btm -a) will override this config file if an option
+ # is also set here.
+
+ [flags]
+ # Whether to hide the average cpu entry.
+ #hide_avg_cpu = false
+ # Whether to use dot markers rather than braille.
+ #dot_marker = false
+ # The update rate of the application.
+ rate = "250ms"
+ # Whether to put the CPU legend to the left.
+ #left_legend = false
+ # Whether to set CPU% on a process to be based on the total CPU or just current usage.
+ #current_usage = false
+ # Whether to set CPU% on a process to be based on the total CPU or per-core CPU% (not divided by the number of cpus).
+ #unnormalized_cpu = false
+ # Whether to group processes with the same name together by default.
+ #group_processes = false
+ # Whether to make process searching case sensitive by default.
+ #case_sensitive = false
+ # Whether to make process searching look for matching the entire word by default.
+ #whole_word = false
+ # Whether to make process searching use regex by default.
+ #regex = false
+ # Defaults to Celsius. Temperature is one of:
+ #temperature_type = "k"
+ #temperature_type = "f"
+ #temperature_type = "c"
+ #temperature_type = "kelvin"
+ #temperature_type = "fahrenheit"
+ #temperature_type = "celsius"
+ # The default time interval (in milliseconds).
+ #default_time_value = "60s"
+ # The time delta on each zoom in/out action (in milliseconds).
+ #time_delta = 15000
+ # Hides the time scale.
+ #hide_time = false
+ # Override layout default widget
+ #default_widget_type = "proc"
+ #default_widget_count = 1
+ # Expand selected widget upon starting the app
+ #expanded_on_startup = true
+ # Use basic mode
+ basic = false
+ # Use the old network legend style
+ #use_old_network_legend = false
+ # Remove space in tables
+ #hide_table_gap = false
+ # Show the battery widgets
+ battery = false
+ # Disable mouse clicks
+ #disable_click = false
+ # Built-in themes. Valid values are "default", "default-light", "gruvbox", "gruvbox-light", "nord", "nord-light"
+ #color = "default"
+ # Show memory values in the processes widget as values by default
+ #mem_as_value = false
+ # Show tree mode by default in the processes widget.
+ #tree = false
+ # Shows an indicator in table widgets tracking where in the list you are.
+ #show_table_scroll_position = false
+ # Show processes as their commands by default in the process widget.
+ #process_command = false
+ # Displays the network widget with binary prefixes.
+ #network_use_binary_prefix = false
+ # Displays the network widget using bytes.
+ #network_use_bytes = false
+ # Displays the network widget with a log scale.
+ #network_use_log = false
+ # Hides advanced options to stop a process on Unix-like systems.
+ #disable_advanced_kill = false
+ # Shows GPU(s) memory
+ enable_gpu_memory = true
+ # Shows cache and buffer memory
+ enable_cache_memory = true
+ # How much data is stored at once in terms of time.
+ #retention = "10m"
+
+ # These are flags around the process widget.
+
+ #[processes]
+ #columns = ["PID", "Name", "CPU%", "Mem%", "R/s", "W/s", "T.Read", "T.Write", "User", "State"]
+
+ # These are all the components that support custom theming. Note that colour support
+ # will depend on terminal support.
+
+ #[colors] # Uncomment if you want to use custom colors
+ # Represents the colour of table headers (processes, CPU, disks, temperature).
+ #table_header_color="LightBlue"
+ # Represents the colour of the label each widget has.
+ #widget_title_color="Gray"
+ # Represents the average CPU color.
+ #avg_cpu_color="Red"
+ # Represents the colour the core will use in the CPU legend and graph.
+ #cpu_core_colors=["LightMagenta", "LightYellow", "LightCyan", "LightGreen", "LightBlue", "LightRed", "Cyan", "Green", "Blue", "Red"]
+ # Represents the colour RAM will use in the memory legend and graph.
+ #ram_color="LightMagenta"
+ # Represents the colour SWAP will use in the memory legend and graph.
+ #swap_color="LightYellow"
+ # Represents the colour ARC will use in the memory legend and graph.
+ #arc_color="LightCyan"
+ # Represents the colour the GPU will use in the memory legend and graph.
+ #gpu_core_colors=["LightGreen", "LightBlue", "LightRed", "Cyan", "Green", "Blue", "Red"]
+ # Represents the colour rx will use in the network legend and graph.
+ #rx_color="LightCyan"
+ # Represents the colour tx will use in the network legend and graph.
+ #tx_color="LightGreen"
+ # Represents the colour of the border of unselected widgets.
+ #border_color="Gray"
+ # Represents the colour of the border of selected widgets.
+ #highlighted_border_color="LightBlue"
+ # Represents the colour of most text.
+ #text_color="Gray"
+ # Represents the colour of text that is selected.
+ #selected_text_color="Black"
+ # Represents the background colour of text that is selected.
+ #selected_bg_color="LightBlue"
+ # Represents the colour of the lines and text of the graph.
+ #graph_color="Gray"
+ # Represents the colours of the battery based on charge
+ #high_battery_color="green"
+ #medium_battery_color="yellow"
+ #low_battery_color="red"
+
+ # Layout - layouts follow a pattern like this:
+ # [[row]] represents a row in the application.
+ # [[row.child]] represents either a widget or a column.
+ # [[row.child.child]] represents a widget.
+ #
+ # All widgets must have the type value set to one of ["cpu", "mem", "proc", "net", "temp", "disk", "empty"].
+ # All layout components have a ratio value - if this is not set, then it defaults to 1.
+ # The default widget layout:
+ #[[row]]
+ # ratio=30
+ # [[row.child]]
+ # type="cpu"
+ #[[row]]
+ # ratio=40
+ # [[row.child]]
+ # ratio=4
+ # type="mem"
+ # [[row.child]]
+ # ratio=3
+ # [[row.child.child]]
+ # type="temp"
+ # [[row.child.child]]
+ # type="disk"
+ #[[row]]
+ # ratio=30
+ # [[row.child]]
+ # type="net"
+ # [[row.child]]
+ # type="proc"
+ # default=true
+
+
+ # Filters - you can hide specific temperature sensors, network interfaces, and disks using filters. This is admittedly
+ # a bit hard to use as of now, and there is a planned in-app interface for managing this in the future:
+ #[disk_filter]
+ #is_list_ignored = true
+ #list = ["/dev/sda\\d+", "/dev/nvme0n1p2"]
+ #regex = true
+ #case_sensitive = false
+ #whole_word = false
+
+ #[mount_filter]
+ #is_list_ignored = true
+ #list = ["/mnt/.*", "/boot"]
+ #regex = true
+ #case_sensitive = false
+ #whole_word = false
+
+ #[temp_filter]
+ #is_list_ignored = true
+ #list = ["cpu", "wifi"]
+ #regex = false
+ #case_sensitive = false
+ #whole_word = false
+
+ #[net_filter]
+ #is_list_ignored = true
+ #list = ["virbr0.*"]
+ #regex = true
+ #case_sensitive = false
+ #whole_word = false
+ '';
+}
diff --git a/home/fuwn/meta/rice/btop/default.nix b/home/fuwn/meta/rice/btop/default.nix
new file mode 100644
index 0000000..d483420
--- /dev/null
+++ b/home/fuwn/meta/rice/btop/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.btop.enable = true;
+}
diff --git a/home/fuwn/meta/rice/cpufetch/default.nix b/home/fuwn/meta/rice/cpufetch/default.nix
new file mode 100644
index 0000000..b045b4a
--- /dev/null
+++ b/home/fuwn/meta/rice/cpufetch/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cpufetch
+ ];
+}
diff --git a/home/fuwn/meta/rice/default.nix b/home/fuwn/meta/rice/default.nix
new file mode 100644
index 0000000..56e4bc1
--- /dev/null
+++ b/home/fuwn/meta/rice/default.nix
@@ -0,0 +1,9 @@
+_: {
+ imports = [
+ ./bottom
+ ./btop
+ ./cpufetch
+ ./fastfetch
+ ./iotop
+ ];
+}
diff --git a/home/fuwn/meta/rice/fastfetch/default.nix b/home/fuwn/meta/rice/fastfetch/default.nix
new file mode 100644
index 0000000..8ae6284
--- /dev/null
+++ b/home/fuwn/meta/rice/fastfetch/default.nix
@@ -0,0 +1,34 @@
+{ pkgs, ... }: {
+ programs.fastfetch = {
+ enable = true;
+
+ settings = {
+ logo = {
+ source = "~/Downloads/91363-1550240807.png";
+ width = 30;
+
+ padding = {
+ top = 0;
+ };
+ };
+
+ modules = [
+ "title"
+ "break"
+ "os"
+ "kernel"
+ "uptime"
+ "packages"
+ "shell"
+ "de"
+ "wm"
+ "terminal"
+ "cpu"
+ "gpu"
+ "memory"
+ "break"
+ "colors"
+ ];
+ };
+ };
+}
diff --git a/home/fuwn/meta/rice/iotop/default.nix b/home/fuwn/meta/rice/iotop/default.nix
new file mode 100644
index 0000000..a219adc
--- /dev/null
+++ b/home/fuwn/meta/rice/iotop/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ iotop
+ ];
+}
diff --git a/home/fuwn/meta/spotify/default.nix b/home/fuwn/meta/spotify/default.nix
new file mode 100644
index 0000000..034edb9
--- /dev/null
+++ b/home/fuwn/meta/spotify/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ # spotify-edge
+ spotify-player
+ ncspot
+ psst
+ playerctl
+ ];
+}
diff --git a/home/fuwn/meta/steam/default.nix b/home/fuwn/meta/steam/default.nix
new file mode 100644
index 0000000..c358a60
--- /dev/null
+++ b/home/fuwn/meta/steam/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ steam-tui
+ ];
+
+ # programs.steam.enable = true;
+}
diff --git a/home/fuwn/meta/tools/default.nix b/home/fuwn/meta/tools/default.nix
new file mode 100644
index 0000000..0fa7981
--- /dev/null
+++ b/home/fuwn/meta/tools/default.nix
@@ -0,0 +1,9 @@
+_: {
+ imports = [
+ ./http
+ ./infrastructure
+ ./languages
+ ./nix
+ ./tcp
+ ];
+}
diff --git a/home/fuwn/meta/tools/http/default.nix b/home/fuwn/meta/tools/http/default.nix
new file mode 100644
index 0000000..b917245
--- /dev/null
+++ b/home/fuwn/meta/tools/http/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ httpie
+ httpie-desktop
+ ];
+}
diff --git a/home/fuwn/meta/tools/infrastructure/default.nix b/home/fuwn/meta/tools/infrastructure/default.nix
new file mode 100644
index 0000000..756050f
--- /dev/null
+++ b/home/fuwn/meta/tools/infrastructure/default.nix
@@ -0,0 +1,6 @@
+_: {
+ imports = [
+ ./docker
+ ./fly
+ ];
+}
diff --git a/home/fuwn/meta/tools/infrastructure/docker/default.nix b/home/fuwn/meta/tools/infrastructure/docker/default.nix
new file mode 100644
index 0000000..0a17952
--- /dev/null
+++ b/home/fuwn/meta/tools/infrastructure/docker/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ earthly
+ ];
+}
diff --git a/home/fuwn/meta/tools/infrastructure/fly/default.nix b/home/fuwn/meta/tools/infrastructure/fly/default.nix
new file mode 100644
index 0000000..9e8147e
--- /dev/null
+++ b/home/fuwn/meta/tools/infrastructure/fly/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ flyctl
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/agnostic/default.nix b/home/fuwn/meta/tools/languages/agnostic/default.nix
new file mode 100644
index 0000000..77a3086
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/agnostic/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cmake
+ tup
+ valgrind
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/assembly/default.nix b/home/fuwn/meta/tools/languages/assembly/default.nix
new file mode 100644
index 0000000..b593a41
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/assembly/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nasm
+ # nasmfmt
+ yasm
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/cobol/default.nix b/home/fuwn/meta/tools/languages/cobol/default.nix
new file mode 100644
index 0000000..82e5464
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/cobol/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gnu-cobol
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/default.nix b/home/fuwn/meta/tools/languages/default.nix
new file mode 100644
index 0000000..30f7894
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/default.nix
@@ -0,0 +1,19 @@
+_: {
+ imports = [
+ ./agnostic
+ # ./assembly
+ ./cobol
+ ./gleam
+ ./go
+ ./hare
+ ./javascript
+ # ./jvm
+ # ./protobuf
+ ./python
+ ./rust
+ ./shell
+ # ./vlang
+ ./yaml
+ ./zig
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/gleam/default.nix b/home/fuwn/meta/tools/languages/gleam/default.nix
new file mode 100644
index 0000000..de1ab92
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/gleam/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gleam
+ rebar3
+ erlang_nox
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/go/default.nix b/home/fuwn/meta/tools/languages/go/default.nix
new file mode 100644
index 0000000..3c4a809
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/go/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.go.enable = true;
+}
diff --git a/home/fuwn/meta/tools/languages/hare/default.nix b/home/fuwn/meta/tools/languages/hare/default.nix
new file mode 100644
index 0000000..79fc13b
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/hare/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ hare
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/javascript/default.nix b/home/fuwn/meta/tools/languages/javascript/default.nix
new file mode 100644
index 0000000..5aaccda
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/javascript/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ bun
+ # deno
+ # nodejs
+ # typescript
+ # nodePackages.npm
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/jvm/default.nix b/home/fuwn/meta/tools/languages/jvm/default.nix
new file mode 100644
index 0000000..d3ab862
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/jvm/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ # kotlin
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/protobuf/default.nix b/home/fuwn/meta/tools/languages/protobuf/default.nix
new file mode 100644
index 0000000..21dd9f7
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/protobuf/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ protobuf
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/python/default.nix b/home/fuwn/meta/tools/languages/python/default.nix
new file mode 100644
index 0000000..84b15d4
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/python/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ python312
+ rye
+ ];
+
+ programs.poetry.enable = true;
+}
diff --git a/home/fuwn/meta/tools/languages/rust/default.nix b/home/fuwn/meta/tools/languages/rust/default.nix
new file mode 100644
index 0000000..02360d1
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/rust/default.nix
@@ -0,0 +1,10 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cargo-outdated
+ cargo-watch
+ cargo-make
+ cargo-cache
+ # cargo-clean-all
+ rustup
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/shell/default.nix b/home/fuwn/meta/tools/languages/shell/default.nix
new file mode 100644
index 0000000..1953aac
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/shell/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ shfmt
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/vlang/default.nix b/home/fuwn/meta/tools/languages/vlang/default.nix
new file mode 100644
index 0000000..d9da941
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/vlang/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ vlang
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/yaml/default.nix b/home/fuwn/meta/tools/languages/yaml/default.nix
new file mode 100644
index 0000000..cd91d5e
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/yaml/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ yamllint
+ ];
+}
diff --git a/home/fuwn/meta/tools/languages/zig/default.nix b/home/fuwn/meta/tools/languages/zig/default.nix
new file mode 100644
index 0000000..821e4ab
--- /dev/null
+++ b/home/fuwn/meta/tools/languages/zig/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ zig
+ zls
+ ];
+}
diff --git a/home/fuwn/meta/tools/nix/default.nix b/home/fuwn/meta/tools/nix/default.nix
new file mode 100644
index 0000000..fe41b1d
--- /dev/null
+++ b/home/fuwn/meta/tools/nix/default.nix
@@ -0,0 +1,10 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nil
+ statix
+ alejandra
+ nurl
+ nix-init
+ nix-prefetch-git
+ ];
+}
diff --git a/home/fuwn/meta/tools/tcp/default.nix b/home/fuwn/meta/tools/tcp/default.nix
new file mode 100644
index 0000000..85b6120
--- /dev/null
+++ b/home/fuwn/meta/tools/tcp/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ netcat-openbsd
+ inetutils
+ ];
+}
diff --git a/home/fuwn/wallpaper.png b/home/fuwn/wallpaper.png
new file mode 100644
index 0000000..b0db6b0
--- /dev/null
+++ b/home/fuwn/wallpaper.png
Binary files differ