summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
Diffstat (limited to 'meta')
-rw-r--r--meta/bitwarden/default.nix7
-rw-r--r--meta/calculator/default.nix7
-rw-r--r--meta/default.nix13
-rw-r--r--meta/desktop/default.nix1
-rw-r--r--meta/desktop/wayland/default.nix7
-rw-r--r--meta/desktop/wayland/hyprland/default.nix23
-rw-r--r--meta/desktop/wayland/hyprland/hypridle/default.nix34
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/animations.nix86
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/binds.nix208
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/decoration.nix44
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/default.nix42
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/environment.nix80
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/executions.nix54
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/general.nix137
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/plugins.nix69
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/rules.nix78
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/scripts/common.sh146
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status18
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion10
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk19
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar22
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal13
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor9
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor18
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace12
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/scripts/source/screenshot.ab158
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace5
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps13
-rwxr-xr-xmeta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout22
-rw-r--r--meta/desktop/wayland/hyprland/hyprland/workspaces.nix38
-rw-r--r--meta/desktop/wayland/hyprland/pyprland/default.nix38
-rw-r--r--meta/desktop/wayland/meta/default.nix5
-rw-r--r--meta/desktop/wayland/meta/screenshot/default.nix6
-rw-r--r--meta/desktop/wayland/waybar/default.nix95
-rw-r--r--meta/desktop/wayland/waybar/waybar/default-modules.nix329
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/brightness.sh54
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py155
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/spotify.sh27
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/theme.sh45
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/volume.sh73
-rwxr-xr-xmeta/desktop/wayland/waybar/waybar/scripts/wallpaper.sh28
-rw-r--r--meta/desktop/wayland/waybar/waybar/style.css134
-rw-r--r--meta/imagery/default.nix8
-rw-r--r--meta/language/codespell/default.nix5
-rw-r--r--meta/language/default.nix5
-rw-r--r--meta/rice/bottom/default.nix3
-rw-r--r--meta/rice/btop/default.nix3
-rw-r--r--meta/rice/cpufetch/default.nix5
-rw-r--r--meta/rice/default.nix9
-rw-r--r--meta/rice/fastfetch/default.nix34
-rw-r--r--meta/rice/iotop/default.nix5
-rw-r--r--meta/spotify/default.nix8
-rw-r--r--meta/steam/default.nix7
-rw-r--r--meta/tools/default.nix8
-rw-r--r--meta/tools/http/default.nix6
-rw-r--r--meta/tools/infrastructure/default.nix6
-rw-r--r--meta/tools/infrastructure/docker/default.nix5
-rw-r--r--meta/tools/infrastructure/fly/default.nix5
-rw-r--r--meta/tools/languages/agnostic/default.nix7
-rw-r--r--meta/tools/languages/assembly/default.nix7
-rw-r--r--meta/tools/languages/cobol/default.nix5
-rw-r--r--meta/tools/languages/default.nix19
-rw-r--r--meta/tools/languages/gleam/default.nix7
-rw-r--r--meta/tools/languages/go/default.nix3
-rw-r--r--meta/tools/languages/hare/default.nix5
-rw-r--r--meta/tools/languages/javascript/default.nix9
-rw-r--r--meta/tools/languages/jvm/default.nix5
-rw-r--r--meta/tools/languages/protobuf/default.nix5
-rw-r--r--meta/tools/languages/python/default.nix8
-rw-r--r--meta/tools/languages/rust/default.nix10
-rw-r--r--meta/tools/languages/shell/default.nix5
-rw-r--r--meta/tools/languages/vlang/default.nix5
-rw-r--r--meta/tools/languages/yaml/default.nix5
-rw-r--r--meta/tools/languages/zig/default.nix6
-rw-r--r--meta/tools/nix/default.nix10
-rw-r--r--meta/tools/tcp/default.nix6
76 files changed, 2631 insertions, 0 deletions
diff --git a/meta/bitwarden/default.nix b/meta/bitwarden/default.nix
new file mode 100644
index 0000000..2ac188f
--- /dev/null
+++ b/meta/bitwarden/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ bitwarden-desktop
+ # bitwarden-cli
+ # bitwarden-menu
+ ];
+}
diff --git a/meta/calculator/default.nix b/meta/calculator/default.nix
new file mode 100644
index 0000000..a8bcc7f
--- /dev/null
+++ b/meta/calculator/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gavin-bc
+ qalculate-gtk
+ programmer-calculator
+ ];
+}
diff --git a/meta/default.nix b/meta/default.nix
new file mode 100644
index 0000000..0086e7e
--- /dev/null
+++ b/meta/default.nix
@@ -0,0 +1,13 @@
+_: {
+ imports = [
+ ./bitwarden
+ ./calculator
+ ./desktop
+ ./imagery
+ ./language
+ ./rice
+ ./spotify
+ ./steam
+ ./tools
+ ];
+}
diff --git a/meta/desktop/default.nix b/meta/desktop/default.nix
new file mode 100644
index 0000000..36de93a
--- /dev/null
+++ b/meta/desktop/default.nix
@@ -0,0 +1 @@
+_: { imports = [ ./wayland ]; }
diff --git a/meta/desktop/wayland/default.nix b/meta/desktop/wayland/default.nix
new file mode 100644
index 0000000..89f1bf0
--- /dev/null
+++ b/meta/desktop/wayland/default.nix
@@ -0,0 +1,7 @@
+_: {
+ imports = [
+ ./hyprland
+ ./meta
+ ./waybar
+ ];
+}
diff --git a/meta/desktop/wayland/hyprland/default.nix b/meta/desktop/wayland/hyprland/default.nix
new file mode 100644
index 0000000..46ba5c4
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/default.nix
@@ -0,0 +1,23 @@
+{ pkgs, ... }: {
+ # Insipration
+ # https://github.com/codingjerk/dotfiles/blob/main/config/hypr/hyprland.conf
+ # https://github.com/JoshM-Yoru/dotfiles/blob/main/hypr/hyprland.conf
+ # https://github.com/end-4/dots-hyprland/blob/main/.config/hypr/hyprland.conf
+ # https://github.com/Andy3153/hyprland-rice
+ imports = [
+ ./hypridle
+ # ./pyprland
+ ./hyprland
+ ];
+ wayland.windowManager.hyprland = {
+ enable = true;
+ package = pkgs.hyprland;
+ xwayland = {
+ enable = true;
+ };
+ systemd = {
+ enable = true;
+ variables = [ "--all" ];
+ };
+ };
+}
diff --git a/meta/desktop/wayland/hyprland/hypridle/default.nix b/meta/desktop/wayland/hyprland/hypridle/default.nix
new file mode 100644
index 0000000..78e0153
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hypridle/default.nix
@@ -0,0 +1,34 @@
+{ pkgs, ... }: {
+ # exec-once = swayidle timeout 600 '[ $(pgrep -x hyprlock || pgrep -x swaylock) ] || (hyprctl dispatcher dpms off && hyprlock)'
+ services.hypridle = {
+ enable = true;
+ settings = {
+ "$lock_command" = "pidof hyprlock || hyprlock";
+ # $suspend_command = pidof steam || systemctl suspend || loginctl suspend # fuck nvidia
+ 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/meta/desktop/wayland/hyprland/hyprland/animations.nix b/meta/desktop/wayland/hyprland/hyprland/animations.nix
new file mode 100644
index 0000000..c47c164
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/binds.nix b/meta/desktop/wayland/hyprland/hyprland/binds.nix
new file mode 100644
index 0000000..30ac4e1
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/binds.nix
@@ -0,0 +1,208 @@
+_: {
+ 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"
+
+ # Skipping media keys for now
+ ]
+ );
+
+ 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/meta/desktop/wayland/hyprland/hyprland/decoration.nix b/meta/desktop/wayland/hyprland/hyprland/decoration.nix
new file mode 100644
index 0000000..ffabda8
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/decoration.nix
@@ -0,0 +1,44 @@
+_: {
+ 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/meta/desktop/wayland/hyprland/hyprland/default.nix b/meta/desktop/wayland/hyprland/hyprland/default.nix
new file mode 100644
index 0000000..9d0af4c
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/default.nix
@@ -0,0 +1,42 @@
+_: {
+ 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/meta/desktop/wayland/hyprland/hyprland/environment.nix b/meta/desktop/wayland/hyprland/hyprland/environment.nix
new file mode 100644
index 0000000..00a7e66
--- /dev/null
+++ b/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" # With this, you'll need to use gamescope for gaming.
+
+ # 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" # Crashes Electron apps in Xwayland
+ # "GTK_IM_MODULE, fcitx" # My Gtk apps no longer require this to work with fcitx5. Hmm.
+ "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/meta/desktop/wayland/hyprland/hyprland/executions.nix b/meta/desktop/wayland/hyprland/hyprland/executions.nix
new file mode 100644
index 0000000..86a944a
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/executions.nix
@@ -0,0 +1,54 @@
+{ 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"
+ "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/meta/desktop/wayland/hyprland/hyprland/general.nix b/meta/desktop/wayland/hyprland/hyprland/general.nix
new file mode 100644
index 0000000..270fa1c
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/general.nix
@@ -0,0 +1,137 @@
+_: {
+ 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 = 50;
+ # repeat_delay = 200;
+ repeat_rate = 35;
+ repeat_delay = 250;
+
+ 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/meta/desktop/wayland/hyprland/hyprland/plugins.nix b/meta/desktop/wayland/hyprland/hyprland/plugins.nix
new file mode 100644
index 0000000..61d73e3
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/rules.nix b/meta/desktop/wayland/hyprland/hyprland/rules.nix
new file mode 100644
index 0000000..862d8f1
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh b/meta/desktop/wayland/hyprland/hyprland/scripts/common.sh
new file mode 100644
index 0000000..25be5b6
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status b/meta/desktop/wayland/hyprland/hyprland/scripts/fake_fullscreen_status
new file mode 100755
index 0000000..e198758
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion b/meta/desktop/wayland/hyprland/hyprland/scripts/hycov_easymotion
new file mode 100755
index 0000000..ab7c3bb
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk b/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_gtk
new file mode 100755
index 0000000..861aa12
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar b/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar
new file mode 100755
index 0000000..ff4a25f
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_waybar
@@ -0,0 +1,22 @@
+#!/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
+
+# Initial copy of colors
+\cp -r ~/.cache/wal/colors-waybar.css ~/.config/waybar/
+
+while true; do
+ # If Waybar is not running, start it
+ if ! pgrep -x "waybar" >/dev/null; then
+ waybar -c ~/.config/waybar/config.json -s ~/.config/waybar/style.css &
+ fi
+
+ # Wait for changes in the configuration files
+ inotifywait -e create,modify ${CONFIG_FILES}
+
+ # Kill Waybar gracefully and wait until it's completely terminated
+ pkill -x waybar
+ while pgrep -x waybar >/dev/null; do sleep 0.5; done
+done
diff --git a/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal b/meta/desktop/wayland/hyprland/hyprland/scripts/initialise_xdg_portal
new file mode 100755
index 0000000..10470eb
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor b/meta/desktop/wayland/hyprland/hyprland/scripts/move_focus_to_monitor
new file mode 100755
index 0000000..27562a9
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor b/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor
new file mode 100755
index 0000000..76fd463
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_monitor
@@ -0,0 +1,18 @@
+#!/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}")
+
+# # Get the empty workspace on the target monitor, if available
+# target_workspace=$(get_empty_workspace $target_monitor)
+
+# # If no empty workspace is found, fall back to the active workspace
+# 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/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace b/meta/desktop/wayland/hyprland/hyprland/scripts/move_window_to_workspace
new file mode 100755
index 0000000..4256a9f
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/source/screenshot.ab b/meta/desktop/wayland/hyprland/hyprland/scripts/source/screenshot.ab
new file mode 100644
index 0000000..6bc510d
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/hyprland/scripts/source/screenshot.ab
@@ -0,0 +1,158 @@
+let current_date_time = unsafe $date +%Y-%m-%d-%H-%M-%S$
+let output_directory = "{unsafe $xdg-user-dir PICTURES$}/Screenshots"
+let output_file = "Screenshot_{current_date_time}_{unsafe $echo \$RANDOM$}.png"
+
+fun notify_command(message: Text): Null {
+ unsafe $notify-send -h string:x-canonical-private-synchronous:shot-notify -u low "{message}"$
+}
+
+fun notify(clipboard: Bool, type: Text): Null {
+ notify_command("Screenshot copied to clipboard. ({type})")
+
+ if not clipboard {
+ if unsafe $test -f "{output_directory}/{output_file}" &&
+ echo 'true' ||
+ echo 'false'$ == "true"
+ {
+ // unsafe $feh "{output_directory}/{output_file}"$
+
+ notify_command("Screenshot saved. ({type})")
+ } else {
+ notify_command("Screenshot deleted.")
+ }
+ }
+}
+
+fun get_hyprctl_monitors(): Text {
+ return $hyprctl monitors -j || true$ failed {
+ notify_command("Failed to get monitors.")
+
+ fail status
+ }
+}
+
+fun get_focused_monitor(): Text {
+ let monitors = get_hyprctl_monitors() failed {
+ notify_command("Failed to get monitors.")
+
+ fail status
+ }
+
+ return $echo {monitors} | jq -r '.[] | select(.focused) | .name'$ failed {
+ notify_command("Failed to get focused monitor.")
+
+ fail status
+ }
+}
+
+fun screenshot_now(clipboard: Bool): Null {
+ if clipboard {
+ unsafe $(grim - || true) | wl-copy$
+ } else {
+ unsafe $cd "{output_directory}" &&
+ grim - |
+ tee "{output_file}" |
+ wl-copy$
+ }
+
+ notify(clipboard, "now")
+}
+
+fun screenshot_window(clipboard: Bool): Null {
+ let width_position = unsafe $hyprctl activewindow |
+ grep 'at:' |
+ cut -d':' -f2 |
+ tr -d ' ' |
+ tail -n1$
+ let width_size = unsafe $hyprctl activewindow |
+ grep 'size:' |
+ cut -d':' -f2 |
+ tr -d ' ' |
+ tail -n1 |
+ sed s/,/x/g$
+
+ if clipboard {
+ unsafe $grim -g "{width_position} {width_size}" - | wl-copy$
+ } else {
+ unsafe $cd "{output_directory}" &&
+ grim -g "{width_position} {width_size}" - |
+ tee "{output_file}" |
+ wl-copy$
+ }
+
+ notify(clipboard, "window")
+}
+
+fun screenshot_monitor(clipboard: Bool): Null {
+ if clipboard {
+ unsafe $grim -o "{get_focused_monitor()}" - | wl-copy$
+ } else {
+ unsafe $cd "{output_directory}" &&
+ grim -o "{get_focused_monitor()}" - |
+ tee "{output_file}" |
+ wl-copy$
+ }
+
+ notify(clipboard, "monitor")
+}
+
+fun screenshot_area(clipboard: Bool): Null {
+ // slurp -b 1B1F28CC -c E06B74ff -s C778DD0D -w 2
+
+ if clipboard {
+ unsafe $grim -g "{unsafe $slurp$}" - | wl-copy$
+ } else {
+ unsafe $cd "{output_directory}" &&
+ grim -g "{unsafe $slurp$}" - |
+ tee "{output_file}" |
+ wl-copy$
+ }
+
+ notify(clipboard, "area")
+}
+
+fun screenshot(mode: Text, clipboard: Bool): Null {
+ if {
+ mode == "now" {
+ screenshot_now(clipboard)
+ }
+ mode == "window" {
+ screenshot_window(clipboard)
+ }
+ mode == "monitor" {
+ screenshot_monitor(clipboard)
+ }
+ mode == "area" {
+ screenshot_area(clipboard)
+ }
+ else {
+ echo "usage: {unsafe $echo "\${0}"$} [flags]\n"
+ echo "flags:"
+ echo " --now"
+ echo " --window"
+ echo " --area"
+ echo " --monitor"
+ echo " --clipboard"
+ echo " --help"
+ echo ""
+ }
+ }
+}
+
+main {
+ if unsafe $test -d "{output_directory}" &&
+ echo 'true' ||
+ echo 'false'$ == "false"
+ {
+ $mkdir -p "{output_directory}"$ failed {
+ notify_command("Failed to create output directory.")
+
+ fail status
+ }
+ }
+
+ screenshot(
+ unsafe $echo "\${1}" | sed -E s/--//g$,
+ unsafe $echo "\${2}"$ == "--clipboard"
+ )
+}
diff --git a/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace b/meta/desktop/wayland/hyprland/hyprland/scripts/switch_workspace
new file mode 100755
index 0000000..fc8900c
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps b/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_gaps
new file mode 100755
index 0000000..d593ab2
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout b/meta/desktop/wayland/hyprland/hyprland/scripts/toggle_layout
new file mode 100755
index 0000000..1ef8774
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/hyprland/workspaces.nix b/meta/desktop/wayland/hyprland/hyprland/workspaces.nix
new file mode 100644
index 0000000..89644ae
--- /dev/null
+++ b/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/meta/desktop/wayland/hyprland/pyprland/default.nix b/meta/desktop/wayland/hyprland/pyprland/default.nix
new file mode 100644
index 0000000..2dc04c7
--- /dev/null
+++ b/meta/desktop/wayland/hyprland/pyprland/default.nix
@@ -0,0 +1,38 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [ pyprland ];
+ xdg.configFile."hypr/pyprland.toml".text = ''
+ [pyprland]
+ plugins = ["scratchpads"]
+
+ [scratchpads.spterm]
+ animation = "fromTop"
+ command = "kitty --class spterm"
+ class = "spterm"
+ size = "50% 65%"
+ margin = "17%" # (50 / 3)
+
+ [scratchpads.spcalc]
+ animation = "fromTop"
+ command = "kitty --class spcalc -e bc -lq"
+ class = "spcalc"
+ size = "50% 50%"
+ margin = "25%" # (50 / 2)
+
+ [scratchpads.spgpt]
+ animation = "fromTop"
+ command = "thorium-browser --user-data-dir=/home/fuwn/.local/share/spgpt --app='https://chatgpt.com/'"
+ class = "thorium-chatgpt.com__-Default"
+ size = "65% 75%"
+ # process_tracking = false
+ match_by = "class"
+ margin = "13%" # (50 / 4)
+
+ [scratchpads.spspotify]
+ animation = "fromTop"
+ command = "LD_PRELOAD=/usr/lib/spotifywm.so /opt/spotify/spotify"
+ class = "Spotify"
+ size = "65% 90%"
+ unfocus = "hide"
+ lazy = true
+ '';
+}
diff --git a/meta/desktop/wayland/meta/default.nix b/meta/desktop/wayland/meta/default.nix
new file mode 100644
index 0000000..0115f30
--- /dev/null
+++ b/meta/desktop/wayland/meta/default.nix
@@ -0,0 +1,5 @@
+_: {
+ imports = [
+ ./screenshot
+ ];
+}
diff --git a/meta/desktop/wayland/meta/screenshot/default.nix b/meta/desktop/wayland/meta/screenshot/default.nix
new file mode 100644
index 0000000..5900ee2
--- /dev/null
+++ b/meta/desktop/wayland/meta/screenshot/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ grim
+ slurp
+ ];
+}
diff --git a/meta/desktop/wayland/waybar/default.nix b/meta/desktop/wayland/waybar/default.nix
new file mode 100644
index 0000000..e823913
--- /dev/null
+++ b/meta/desktop/wayland/waybar/default.nix
@@ -0,0 +1,95 @@
+{ pkgs, ... }: {
+ programs.waybar = {
+ enable = true;
+ style = ./waybar/style.css;
+ settings = (
+ let
+ defaultModules =
+ (import ./waybar/default-modules.nix {
+ inherit pkgs;
+ }).mainBar;
+ 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 = [
+ "brightness.sh"
+ "mediaplayer.py"
+ "spotify.sh"
+ "theme.sh"
+ "volume.sh"
+ "wallpaper.sh"
+ ];
+ in
+ (
+ builtins.listToAttrs (map
+ (script: {
+ name = "waybar/scripts/${script}";
+ value = {
+ source = ./waybar/scripts/${script};
+ };
+ })
+ scripts)
+ )
+ );
+}
diff --git a/meta/desktop/wayland/waybar/waybar/default-modules.nix b/meta/desktop/wayland/waybar/waybar/default-modules.nix
new file mode 100644
index 0000000..9e52674
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/default-modules.nix
@@ -0,0 +1,329 @@
+{ pkgs, ... }: {
+ mainBar = {
+ "layer" = "top";
+ "position" = "top";
+ "margin-left" = 8;
+ "margin-right" = 8;
+ "height" = 40;
+ "idle_inhibitor" = {
+ "format" = "{icon}";
+ "format-icons" = {
+ "activated" = "";
+ "deactivated" = "";
+ };
+ };
+ "bluetooth" = {
+ "format" = "";
+ "on-click" = "blueberry";
+ };
+ "battery" = {
+ "states" = {
+ # "good" = 95;
+ "warning" = 30;
+ "critical" = 15;
+ };
+ "format" = "{capacity}% {icon} ";
+ "format-charging" = "{capacity}% 󰂄";
+ "format-plugged" = "{capacity}% ";
+ # "format-good" = "",
+ # "format-full" = "";
+ "format-icons" = [ "" "" "" "" "" ];
+ };
+ "custom/PBPbattery" = {
+ "exec" = "~/.config/waybar/scripts/PBPbattery.sh";
+ "format" = "{}";
+ };
+ "clock" = {
+ "locale" = "ja_JP.utf8";
+ "interval" = 5;
+
+ # "format-alt" = " {:%e %b %Y}", # Icon: calendar-alt
+ # "format" = "{:%e %b %Y %H:%M}";
+ # "tooltip-format" = "{:%e %B %Y}";
+ "tooltip-format" = "<tt><small>{calendar}</small></tt>";
+ # "format" = "{:%m月 %d日 %I時%M分%S秒}";
+
+ # "format" = "{:%m月 %d日 %H:%M:%S}";
+ "format" = "{:L%m月 %d日 %H:%M}";
+ # "format-alt" = "{:L%G年%b %d日 %A}";
+ "format-alt" = "{:L%G年%b %d日 %A}";
+ };
+ "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'";
+ };
+ "custom/keyboard-layout" = {
+ "exec" = "swaymsg -t get_inputs | grep -m1 'xkb_active_layout_name' | cut -d '\"' -f4";
+ "interval" = 30;
+ "format" = " {}";
+ "signal" = 1; # SIGHUP
+ "tooltip" = false;
+ "on-click" = "~/.config/waybar/scripts/keyhint.sh";
+ };
+ "memory" = {
+ "interval" = 5;
+ "format" = " {}%";
+ "format-alt" = " {used:0.1f}/{total:0.1f}ギガ";
+ "states" = {
+ "warning" = 70;
+ "critical" = 90;
+ };
+ };
+ "network" = {
+ "interval" = 1;
+ # "format-wifi" = " ",
+ # "format-ethernet" = " {bandwidthUpBytes} {bandwidthDownBytes}",
+ "format" = " {bandwidthUpBytes}  {bandwidthDownBytes}";
+ "format-disconnected" = "⚠ Disconnected";
+ "tooltip-format" = "{ifname}: {ipaddr}";
+ "on-click" = "kitty -e 'nmtui'";
+ };
+ "network#vpn" = {
+ "interface" = "tun0";
+ "format" = " ";
+ "format-disconnected" = "⚠ Disconnected";
+ "tooltip-format" = "{ifname}: {ipaddr}/{cidr}";
+ };
+ "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" = "{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" = "pavucontrol";
+ "on-scroll-up" = "pactl set-sink-volume @DEFAULT_SINK@ +2%";
+ "on-scroll-down" = "pactl set-sink-volume @DEFAULT_SINK@ -2%";
+ };
+ "pulseaudio#microphone" = {
+ "format" = "{format_source}";
+ "format-source" = " {volume}%";
+ "format-source-muted" = " ";
+ "on-click" = "pamixer --default-source -t";
+ "on-click-right" = "pavucontrol";
+ "on-scroll-up" = "pamixer --default-source -i 5";
+ "on-scroll-down" = "pamixer --default-source -d 5";
+ "scroll-step" = 5;
+ };
+ "custom/weather" = {
+ "exec" = "~/.config/waybar/scripts/weather.sh tampa";
+ "return-type" = "json";
+ "interval" = 600;
+ };
+ "tray" = {
+ # "icon-size" = 18;
+ "spacing" = 10;
+ "show-passive-items" = true;
+ };
+ "backlight#icon" = {
+ "format" = "{icon}";
+ "format-icons" = [ "" ];
+ "on-scroll-down" = "brightnessctl -c backlight set 1%-";
+ "on-scroll-up" = "brightnessctl -c backlight set +1%";
+ };
+ "backlight#value" = {
+ "format" = "{percent}%";
+ "on-scroll-down" = "brightnessctl -c backlight set 1%-";
+ "on-scroll-up" = "brightnessctl -c backlight set +1%";
+ };
+ "custom/firefox" = {
+ "format" = " ";
+ "on-click" = "exec firefox";
+ "tooltip" = false;
+ };
+ "custom/terminal" = {
+ "format" = " ";
+ "on-click" = "exec kitty";
+ "tooltip" = false;
+ };
+ "custom/files" = {
+ "format" = " ";
+ "on-click" = "exec nautilus";
+ "tooltip" = false;
+ };
+ "custom/power" = {
+ "format" = "⏻";
+ "on-click" = "exec ~/.config/waybar/scripts/power-menu.sh";
+ "tooltip" = false;
+ };
+ "image#album-art" = {
+ "path" = "/tmp/mediaplayer_art";
+ "size" = 22.5; # (18 + (18 / 4))
+ "interval" = 5;
+ "on-click" = "playerctl play-pause";
+ };
+ "custom/media" = {
+ "format" = "{icon} {}";
+ "return-type" = "json";
+ "max-length" = 40;
+ "format-icons" = {
+ "spotify" = " ";
+ "default" = "󰗃 ";
+ };
+ "escape" = true;
+ "exec" = "/usr/bin/python3 ~/.config/waybar/scripts/mediaplayer.py 2> /dev/null";
+ "on-click" = "playerctl play-pause";
+ "on-scroll-up" = "playerctl next";
+ "on-scroll-down" = "playerctl previous";
+ };
+ "cava#cava1" = {
+ "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" = "playerctl play-pause";
+ # "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" = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"]
+ /* "actions" = {
+ "on-click-right" = "mode";
+ } */
+ };
+ "cava#cava2" = {
+ "framerate" = 280;
+ "autosens" = 1;
+ "sensitivity" = 4;
+ "bars" = 10;
+ "lower_cutoff_freq" = 50;
+ "higher_cutoff_freq" = 10000;
+ "method" = "pipewire";
+ "source" = "auto";
+ "stereo" = false;
+ "reverse" = true;
+ "bar_delimiter" = 0;
+ "monstercat" = false;
+ "waves" = false;
+ "hide_on_silence" = true;
+ "noise_reduction" = 0.77;
+ "input_delay" = 0;
+ # "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" = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"]
+ /* "actions" = { "on-click-right" = "mode"; } */
+ };
+ "custom/know" = {
+ "exec" = "know";
+ "interval" = 1;
+ };
+ "custom/gpu" = {
+ "exec" = "gpu-utilisation";
+ "interval" = 5;
+ "format" = " {}";
+ "on-click" = "kitty -e 'nvtop'";
+ };
+ "modules-left" = [
+ "hyprland/workspaces"
+ "hyprland/window"
+ "custom/media"
+ "image#album-art"
+ ];
+ "modules-center" = [ "custom/clock" ];
+ "modules-right" = [
+ # "custom/know"
+ # "cava#cava1"
+ # "network"
+ # "cava#cava2"
+ "tray"
+ # "idle_inhibitor"
+ "cpu"
+ "custom/gpu"
+ "memory"
+ # "custom/keyboard-layout"
+ #"custom/PBPbattery"
+ # "backlight#icon"
+ # "backlight#value"
+ "bluetooth"
+ "pulseaudio"
+ # "pulseaudio#microphone"
+ # "network"
+ # "battery"
+ ];
+ };
+}
diff --git a/meta/desktop/wayland/waybar/waybar/scripts/brightness.sh b/meta/desktop/wayland/waybar/waybar/scripts/brightness.sh
new file mode 100755
index 0000000..9830a3a
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/brightness.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+
+iDIR="$HOME/.config/dunst/imgs"
+
+# Get brightness
+get_backlight() {
+ MAX=$(brightnessctl max)
+ LIGHT=$(printf "%.0f\n" $(brightnessctl get))
+ PERCENTAGE=$(expr 100 \* $LIGHT / $MAX)
+ echo "${PERCENTAGE}%"
+}
+
+# Get icons
+get_icon() {
+ backlight="$(get_backlight)"
+ current="${backlight%%%}"
+ if [[ ("$current" -ge "0") && ("$current" -le "20") ]]; then
+ icon="$iDIR/brightness-20.png"
+ elif [[ ("$current" -ge "20") && ("$current" -le "40") ]]; then
+ icon="$iDIR/brightness-40.png"
+ elif [[ ("$current" -ge "40") && ("$current" -le "60") ]]; then
+ icon="$iDIR/brightness-60.png"
+ elif [[ ("$current" -ge "60") && ("$current" -le "80") ]]; then
+ icon="$iDIR/brightness-80.png"
+ elif [[ ("$current" -ge "80") && ("$current" -le "100") ]]; then
+ icon="$iDIR/brightness-100.png"
+ fi
+}
+
+# Notify
+notify_user() {
+ notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$icon" "Brightness : $(get_backlight)"
+}
+
+# Increase brightness
+inc_backlight() {
+ brightnessctl set 5%+ && get_icon && notify_user
+}
+
+# Decrease brightness
+dec_backlight() {
+ brightnessctl set 5%- && get_icon && notify_user
+}
+
+# Execute accordingly
+if [[ "$1" == "--get" ]]; then
+ get_backlight
+elif [[ "$1" == "--inc" ]]; then
+ inc_backlight
+elif [[ "$1" == "--dec" ]]; then
+ dec_backlight
+else
+ get_backlight
+fi \ No newline at end of file
diff --git a/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py b/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py
new file mode 100755
index 0000000..f83bcd7
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/mediaplayer.py
@@ -0,0 +1,155 @@
+#!/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()
+
+ # Increase verbosity with every occurrence of -v
+ parser.add_argument("-v", "--verbose", action="count", default=0)
+
+ # Define for which player we're listening
+ parser.add_argument("--player")
+
+ return parser.parse_args()
+
+
+def main():
+ arguments = parse_arguments()
+
+ # Initialize logging
+ logging.basicConfig(
+ stream=sys.stderr,
+ level=logging.DEBUG,
+ format="%(name)s %(levelname)s %(message)s",
+ )
+
+ # Logging is set by default to WARN and higher.
+ # With every occurrence of -v it's lowered by one
+ logger.setLevel(max((3 - arguments.verbose) * 10, 0))
+
+ # Log the sent command line arguments
+ 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/meta/desktop/wayland/waybar/waybar/scripts/spotify.sh b/meta/desktop/wayland/waybar/waybar/scripts/spotify.sh
new file mode 100755
index 0000000..8d25ebd
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/spotify.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+while true; do
+
+ player_status=$(playerctl status 2>/dev/null)
+
+ if [ -z "$(playerctl metadata album)" ]; then
+ if [ "$player_status" = "Playing" ]; then
+ echo "$(playerctl metadata artist) - $(playerctl metadata title)"
+ elif [ "$player_status" = "Paused" ]; then
+ echo " $(playerctl metadata artist) - $(playerctl metadata title)"
+ else
+ echo ""
+ fi
+ else
+ if [ "$player_status" = "Playing" ]; then
+ echo "<span color='#1db954'></span> $(playerctl metadata artist) - $(playerctl metadata title)"
+ elif [ "$player_status" = "Paused" ]; then
+ echo "<span color='#1db954'></span>  $(playerctl metadata artist) - $(playerctl metadata title)"
+ else
+ echo ""
+ fi
+ fi
+
+ sleep 1
+
+done
diff --git a/meta/desktop/wayland/waybar/waybar/scripts/theme.sh b/meta/desktop/wayland/waybar/waybar/scripts/theme.sh
new file mode 100755
index 0000000..97fdc66
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/theme.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+export PATH="${PATH}:${HOME}/.local/bin/"
+
+CURRENTIMG="$(<~/.cache/wal/wal )"
+MODE=""
+
+if [[ -e "${HOME}/.cache/wal/mode" ]]; then
+ MODE="$(<~/.cache/wal/mode )"
+else
+ cd ${HOME}/.cache/wal && touch mode
+
+ set -o noclobber
+ echo "dark" >| ${HOME}/.cache/wal/mode
+
+ MODE="dark"
+fi
+
+if [[ $MODE = "light" ]]; then
+ notify-send "Changing to dark theme..."
+
+ MODE="dark"
+
+ wal -i $CURRENTIMG --cols16
+
+ . $HOME/.config/mako/update-colors.sh
+
+ set -o noclobber
+ echo "dark" >| ${HOME}/.cache/wal/mode
+
+ notify-send "Changed to dark theme!"
+else
+ notify-send "Changing to light theme..."
+
+ MODE="light"
+
+ wal -i $CURRENTIMG -l --cols16
+
+ . $HOME/.config/mako/update-colors.sh
+
+ set -o noclobber
+ echo "light" >| ${HOME}/.cache/wal/mode
+
+ notify-send "Changed to light theme!"
+fi \ No newline at end of file
diff --git a/meta/desktop/wayland/waybar/waybar/scripts/volume.sh b/meta/desktop/wayland/waybar/waybar/scripts/volume.sh
new file mode 100755
index 0000000..e4a9183
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/volume.sh
@@ -0,0 +1,73 @@
+#!/bin/bash
+
+iDIR="$HOME/.config/dunst/imgs"
+
+# Get Volume
+get_volume() {
+ volume=$(pamixer --get-volume)
+ echo "$volume"
+}
+
+# Get icons
+get_icon() {
+ current=$(get_volume)
+ if [[ "$current" -eq "0" ]]; then
+ echo "$iDIR/volume-mute.png"
+ elif [[ ("$current" -ge "0") && ("$current" -le "30") ]]; then
+ echo "$iDIR/volume-low.png"
+ elif [[ ("$current" -ge "30") && ("$current" -le "60") ]]; then
+ echo "$iDIR/volume-mid.png"
+ elif [[ ("$current" -ge "60") && ("$current" -le "100") ]]; then
+ echo "$iDIR/volume-high.png"
+ fi
+}
+
+# Notify
+notify_user() {
+ notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume : $(get_volume)"
+}
+
+# Increase Volume
+inc_volume() {
+ pamixer -i 5 && notify_user
+}
+
+# Decrease Volume
+dec_volume() {
+ pamixer -d 5 && notify_user
+}
+
+# Toggle Mute
+toggle_mute() {
+ if [ "$(pamixer --get-mute)" == "false" ]; then
+ pamixer -m && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/volume-mute.png" "Volume Switched OFF"
+ elif [ "$(pamixer --get-mute)" == "true" ]; then
+ pamixer -u && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$(get_icon)" "Volume Switched ON"
+ fi
+}
+
+# Toggle Mic
+toggle_mic() {
+ if [ "$(pamixer --source 66 --get-mute)" == "false" ]; then
+ pamixer -m --source 66 && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/microphone-mute.png" "Microphone Switched OFF"
+ elif [ "$(pamixer --source 66 --get-mute)" == "true" ]; then
+ pamixer -u --source 66 && notify-send -h string:x-canonical-private-synchronous:sys-notify -u low -i "$iDIR/microphone.png" "Microphone Switched ON"
+ fi
+}
+
+# Execute accordingly
+if [[ "$1" == "--get" ]]; then
+ get_volume
+elif [[ "$1" == "--inc" ]]; then
+ inc_volume
+elif [[ "$1" == "--dec" ]]; then
+ dec_volume
+elif [[ "$1" == "--toggle" ]]; then
+ toggle_mute
+elif [[ "$1" == "--toggle-mic" ]]; then
+ toggle_mic
+elif [[ "$1" == "--get-icon" ]]; then
+ get_icon
+else
+ get_volume
+fi
diff --git a/meta/desktop/wayland/waybar/waybar/scripts/wallpaper.sh b/meta/desktop/wayland/waybar/waybar/scripts/wallpaper.sh
new file mode 100755
index 0000000..23935cc
--- /dev/null
+++ b/meta/desktop/wayland/waybar/waybar/scripts/wallpaper.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+export PATH="${PATH}:${HOME}/.local/bin/"
+
+DIR=$HOME/Wallpapers
+PICS=($(ls ${DIR}))
+
+RANDOMPICS=${PICS[ $RANDOM % ${#PICS[@]} ]}
+
+if [[ $(pidof swww) ]]; then
+ pkill swww
+fi
+
+swww img ${DIR}/${RANDOMPICS} --transition-type grow --transition-fps 60 --transition-duration 0.5 --transition-bezier 0.65,0,0.35,1 --transition-pos 0.794,0.972 --transition-step 1
+
+sleep 1.25
+
+if [[ "$(<~/.cache/wal/mode )" = "dark" ]]; then
+ wal -i ${DIR}/${RANDOMPICS} --cols16
+elif [[ "$(<~/.cache/wal/mode )" = "light" ]]; then
+ wal -i ${DIR}/${RANDOMPICS} -l --cols16
+fi
+
+pywal-discord -t default
+pywalfox update
+wal-telegram --wal
+
+. $HOME/.config/mako/update-colors.sh \ No newline at end of file
diff --git a/meta/desktop/wayland/waybar/waybar/style.css b/meta/desktop/wayland/waybar/waybar/style.css
new file mode 100644
index 0000000..9a85e83
--- /dev/null
+++ b/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/meta/imagery/default.nix b/meta/imagery/default.nix
new file mode 100644
index 0000000..38c92e8
--- /dev/null
+++ b/meta/imagery/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nsxiv
+ viewnior
+ feh
+ viu
+ ];
+}
diff --git a/meta/language/codespell/default.nix b/meta/language/codespell/default.nix
new file mode 100644
index 0000000..9018b9f
--- /dev/null
+++ b/meta/language/codespell/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ codespell
+ ];
+}
diff --git a/meta/language/default.nix b/meta/language/default.nix
new file mode 100644
index 0000000..3a48e40
--- /dev/null
+++ b/meta/language/default.nix
@@ -0,0 +1,5 @@
+_: {
+ imports = [
+ ./codespell
+ ];
+}
diff --git a/meta/rice/bottom/default.nix b/meta/rice/bottom/default.nix
new file mode 100644
index 0000000..9248e3d
--- /dev/null
+++ b/meta/rice/bottom/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.bottom.enable = true;
+}
diff --git a/meta/rice/btop/default.nix b/meta/rice/btop/default.nix
new file mode 100644
index 0000000..d483420
--- /dev/null
+++ b/meta/rice/btop/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.btop.enable = true;
+}
diff --git a/meta/rice/cpufetch/default.nix b/meta/rice/cpufetch/default.nix
new file mode 100644
index 0000000..b045b4a
--- /dev/null
+++ b/meta/rice/cpufetch/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cpufetch
+ ];
+}
diff --git a/meta/rice/default.nix b/meta/rice/default.nix
new file mode 100644
index 0000000..56e4bc1
--- /dev/null
+++ b/meta/rice/default.nix
@@ -0,0 +1,9 @@
+_: {
+ imports = [
+ ./bottom
+ ./btop
+ ./cpufetch
+ ./fastfetch
+ ./iotop
+ ];
+}
diff --git a/meta/rice/fastfetch/default.nix b/meta/rice/fastfetch/default.nix
new file mode 100644
index 0000000..8ae6284
--- /dev/null
+++ b/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/meta/rice/iotop/default.nix b/meta/rice/iotop/default.nix
new file mode 100644
index 0000000..a219adc
--- /dev/null
+++ b/meta/rice/iotop/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ iotop
+ ];
+}
diff --git a/meta/spotify/default.nix b/meta/spotify/default.nix
new file mode 100644
index 0000000..237066e
--- /dev/null
+++ b/meta/spotify/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ # spotify-edge
+ spotify-player
+ ncspot
+ psst
+ ];
+}
diff --git a/meta/steam/default.nix b/meta/steam/default.nix
new file mode 100644
index 0000000..c358a60
--- /dev/null
+++ b/meta/steam/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ steam-tui
+ ];
+
+ # programs.steam.enable = true;
+}
diff --git a/meta/tools/default.nix b/meta/tools/default.nix
new file mode 100644
index 0000000..48bdbba
--- /dev/null
+++ b/meta/tools/default.nix
@@ -0,0 +1,8 @@
+_: {
+ imports = [
+ ./http
+ ./languages
+ ./nix
+ ./tcp
+ ];
+}
diff --git a/meta/tools/http/default.nix b/meta/tools/http/default.nix
new file mode 100644
index 0000000..b917245
--- /dev/null
+++ b/meta/tools/http/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ httpie
+ httpie-desktop
+ ];
+}
diff --git a/meta/tools/infrastructure/default.nix b/meta/tools/infrastructure/default.nix
new file mode 100644
index 0000000..075d6d4
--- /dev/null
+++ b/meta/tools/infrastructure/default.nix
@@ -0,0 +1,6 @@
+_: {
+ import = [
+ ./docker
+ ./fly
+ ];
+}
diff --git a/meta/tools/infrastructure/docker/default.nix b/meta/tools/infrastructure/docker/default.nix
new file mode 100644
index 0000000..0a17952
--- /dev/null
+++ b/meta/tools/infrastructure/docker/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ earthly
+ ];
+}
diff --git a/meta/tools/infrastructure/fly/default.nix b/meta/tools/infrastructure/fly/default.nix
new file mode 100644
index 0000000..9e8147e
--- /dev/null
+++ b/meta/tools/infrastructure/fly/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ flyctl
+ ];
+}
diff --git a/meta/tools/languages/agnostic/default.nix b/meta/tools/languages/agnostic/default.nix
new file mode 100644
index 0000000..77a3086
--- /dev/null
+++ b/meta/tools/languages/agnostic/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ cmake
+ tup
+ valgrind
+ ];
+}
diff --git a/meta/tools/languages/assembly/default.nix b/meta/tools/languages/assembly/default.nix
new file mode 100644
index 0000000..b593a41
--- /dev/null
+++ b/meta/tools/languages/assembly/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ nasm
+ # nasmfmt
+ yasm
+ ];
+}
diff --git a/meta/tools/languages/cobol/default.nix b/meta/tools/languages/cobol/default.nix
new file mode 100644
index 0000000..82e5464
--- /dev/null
+++ b/meta/tools/languages/cobol/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gnu-cobol
+ ];
+}
diff --git a/meta/tools/languages/default.nix b/meta/tools/languages/default.nix
new file mode 100644
index 0000000..30f7894
--- /dev/null
+++ b/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/meta/tools/languages/gleam/default.nix b/meta/tools/languages/gleam/default.nix
new file mode 100644
index 0000000..de1ab92
--- /dev/null
+++ b/meta/tools/languages/gleam/default.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ gleam
+ rebar3
+ erlang_nox
+ ];
+}
diff --git a/meta/tools/languages/go/default.nix b/meta/tools/languages/go/default.nix
new file mode 100644
index 0000000..3c4a809
--- /dev/null
+++ b/meta/tools/languages/go/default.nix
@@ -0,0 +1,3 @@
+{ pkgs, ... }: {
+ programs.go.enable = true;
+}
diff --git a/meta/tools/languages/hare/default.nix b/meta/tools/languages/hare/default.nix
new file mode 100644
index 0000000..79fc13b
--- /dev/null
+++ b/meta/tools/languages/hare/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ hare
+ ];
+}
diff --git a/meta/tools/languages/javascript/default.nix b/meta/tools/languages/javascript/default.nix
new file mode 100644
index 0000000..5aaccda
--- /dev/null
+++ b/meta/tools/languages/javascript/default.nix
@@ -0,0 +1,9 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ bun
+ # deno
+ # nodejs
+ # typescript
+ # nodePackages.npm
+ ];
+}
diff --git a/meta/tools/languages/jvm/default.nix b/meta/tools/languages/jvm/default.nix
new file mode 100644
index 0000000..d3ab862
--- /dev/null
+++ b/meta/tools/languages/jvm/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ # kotlin
+ ];
+}
diff --git a/meta/tools/languages/protobuf/default.nix b/meta/tools/languages/protobuf/default.nix
new file mode 100644
index 0000000..21dd9f7
--- /dev/null
+++ b/meta/tools/languages/protobuf/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ protobuf
+ ];
+}
diff --git a/meta/tools/languages/python/default.nix b/meta/tools/languages/python/default.nix
new file mode 100644
index 0000000..d9c592a
--- /dev/null
+++ b/meta/tools/languages/python/default.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ python3
+ rye
+ ];
+
+ programs.poetry.enable = true;
+}
diff --git a/meta/tools/languages/rust/default.nix b/meta/tools/languages/rust/default.nix
new file mode 100644
index 0000000..02360d1
--- /dev/null
+++ b/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/meta/tools/languages/shell/default.nix b/meta/tools/languages/shell/default.nix
new file mode 100644
index 0000000..1953aac
--- /dev/null
+++ b/meta/tools/languages/shell/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ shfmt
+ ];
+}
diff --git a/meta/tools/languages/vlang/default.nix b/meta/tools/languages/vlang/default.nix
new file mode 100644
index 0000000..d9da941
--- /dev/null
+++ b/meta/tools/languages/vlang/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ vlang
+ ];
+}
diff --git a/meta/tools/languages/yaml/default.nix b/meta/tools/languages/yaml/default.nix
new file mode 100644
index 0000000..cd91d5e
--- /dev/null
+++ b/meta/tools/languages/yaml/default.nix
@@ -0,0 +1,5 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ yamllint
+ ];
+}
diff --git a/meta/tools/languages/zig/default.nix b/meta/tools/languages/zig/default.nix
new file mode 100644
index 0000000..821e4ab
--- /dev/null
+++ b/meta/tools/languages/zig/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ zig
+ zls
+ ];
+}
diff --git a/meta/tools/nix/default.nix b/meta/tools/nix/default.nix
new file mode 100644
index 0000000..fe41b1d
--- /dev/null
+++ b/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/meta/tools/tcp/default.nix b/meta/tools/tcp/default.nix
new file mode 100644
index 0000000..85b6120
--- /dev/null
+++ b/meta/tools/tcp/default.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ home.packages = with pkgs; [
+ netcat-openbsd
+ inetutils
+ ];
+}