diff --git a/modules/desktop/hyprland/default.nix b/modules/desktop/hyprland/default.nix
new file mode 100644
index 000000000..13744ee75
--- /dev/null
+++ b/modules/desktop/hyprland/default.nix
@@ -0,0 +1,17 @@
+{pkgs, ...}: {
+ imports = [
+ ./keybinds.nix
+ ./execs.nix
+ ./rules.nix
+ ./env.nix
+ ./colours.nix
+ ];
+
+ wayland.windowManager.hyprland = {
+ enable = true;
+ xwayland.enable = true;
+ systemd.enable = true;
+ settings = {
+ };
+ };
+}
diff --git a/modules/desktop/hyprland/env.nix b/modules/desktop/hyprland/env.nix
new file mode 100644
index 000000000..4d95076cc
--- /dev/null
+++ b/modules/desktop/hyprland/env.nix
@@ -0,0 +1,30 @@
+{
+ config,
+ pkgs,
+ ...
+}: {
+ wayland.windowManager.hyprland.settings = {
+ env = [
+ # Input method
+ "QT_IM_MODULE, fcitx"
+ "XMODIFIERS, @im=fcitx"
+ "SDL_IM_MODULE, fcitx"
+ "GLFW_IM_MODULE, ibus"
+ "INPUT_METHOD, fcitx"
+
+ # Wayland
+ "ELECTRON_OZONE_PLATFORM_HINT, auto"
+
+ # Themes
+ "QT_QPA_PLATFORM, wayland"
+ "QT_QPA_PLATFORMTHEME, kde"
+ "XDG_MENU_PREFIX, plasma-"
+
+ # Virtual environment
+ "ILLOGICAL_IMPULSE_VIRTUAL_ENV, ~/.local/state/quickshell/.venv"
+
+ # Terminal application
+ "TERMINAL, kitty -1"
+ ];
+ };
+}
diff --git a/modules/desktop/hyprland/exec.nix b/modules/desktop/hyprland/exec.nix
new file mode 100644
index 000000000..2c63c0851
--- /dev/null
+++ b/modules/desktop/hyprland/exec.nix
@@ -0,0 +1,2 @@
+{
+}
diff --git a/modules/desktop/hyprland/general.nix b/modules/desktop/hyprland/general.nix
new file mode 100644
index 000000000..3c8958623
--- /dev/null
+++ b/modules/desktop/hyprland/general.nix
@@ -0,0 +1,155 @@
+{
+ config,
+ pkgs,
+ ...
+}: {
+ wayland.windowManager.hyprland.settings = {
+ monitor = [
+ ",preferred,auto,1,transform, 0"
+ # "HDMI-A-1,1920x1080@60,1920x0,1,mirror,eDP-1"
+ # ",addreserved, 0, 0, 0, 0"
+ ];
+
+ gestures = {
+ workspace_swipe = true;
+ workspace_swipe_distance = 700;
+ workspace_swipe_fingers = 3;
+ workspace_swipe_min_fingers = true;
+ 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;
+ };
+
+ general = {
+ gaps_in = 4;
+ gaps_out = 5;
+ gaps_workspaces = 50;
+ border_size = 1;
+ "col.active_border" = "rgba(0DB7D4FF)";
+ "col.inactive_border" = "rgba(31313600)";
+ resize_on_border = true;
+ no_focus_fallback = true;
+ allow_tearing = true;
+ snap.enabled = true;
+ };
+
+ dwindle = {
+ preserve_split = true;
+ smart_split = false;
+ smart_resizing = false;
+ # precise_mouse_move = true;
+ };
+
+ decoration = {
+ rounding = 18;
+ blur = {
+ enabled = true;
+ xray = true;
+ special = false;
+ new_optimizations = true;
+ size = 14;
+ passes = 3;
+ brightness = 1;
+ noise = 0.01;
+ contrast = 1;
+ popups = true;
+ popups_ignorealpha = 0.6;
+ input_methods = true;
+ input_methods_ignorealpha = 0.8;
+ };
+ shadow = {
+ enabled = true;
+ ignore_window = true;
+ range = 30;
+ offset = "0 2";
+ render_power = 4;
+ color = "rgba(00000010)";
+ };
+ dim_inactive = true;
+ dim_strength = 0.025;
+ dim_special = 0.07;
+ };
+
+ animations = {
+ enabled = true;
+ bezier = [
+ "expressiveFastSpatial, 0.42, 1.67, 0.21, 0.90"
+ "expressiveSlowSpatial, 0.39, 1.29, 0.35, 0.98"
+ "expressiveDefaultSpatial, 0.38, 1.21, 0.22, 1.00"
+ "emphasizedDecel, 0.05, 0.7, 0.1, 1"
+ "emphasizedAccel, 0.3, 0, 0.8, 0.15"
+ "standardDecel, 0, 0, 0, 1"
+ "menu_decel, 0.1, 1, 0, 1"
+ "menu_accel, 0.52, 0.03, 0.72, 0.08"
+ ];
+ animation = [
+ "windowsIn, 1, 3, emphasizedDecel, popin 80%"
+ "windowsOut, 1, 2, emphasizedDecel, popin 90%"
+ "windowsMove, 1, 3, emphasizedDecel, slide"
+ "border, 1, 10, emphasizedDecel"
+ "layersIn, 1, 2.7, emphasizedDecel, popin 93%"
+ "layersOut, 1, 2.4, menu_accel, popin 94%"
+ "fadeLayersIn, 1, 0.5, menu_decel"
+ "fadeLayersOut, 1, 2.7, menu_accel"
+ "workspaces, 1, 7, menu_decel, slide"
+ "specialWorkspaceIn, 1, 2.8, emphasizedDecel, slidevert"
+ "specialWorkspaceOut, 1, 1.2, emphasizedAccel, slidevert"
+ ];
+ };
+
+ input = {
+ kb_layout = "us";
+ numlock_by_default = true;
+ repeat_delay = 250;
+ repeat_rate = 35;
+ follow_mouse = 1;
+ off_window_axis_events = 2;
+ touchpad = {
+ natural_scroll = true;
+ disable_while_typing = true;
+ clickfinger_behavior = true;
+ scroll_factor = 0.5;
+ };
+ };
+
+ misc = {
+ disable_hyprland_logo = true;
+ disable_splash_rendering = true;
+ vfr = 1;
+ vrr = 1;
+ mouse_move_enables_dpms = true;
+ key_press_enables_dpms = true;
+ animate_manual_resizes = false;
+ animate_mouse_windowdragging = false;
+ enable_swallow = false;
+ swallow_regex = "(foot|kitty|allacritty|Alacritty)";
+ new_window_takes_over_fullscreen = 2;
+ allow_session_lock_restore = true;
+ # session_lock_xray = true;
+ initial_workspace_tracking = false;
+ focus_on_activate = true;
+ };
+
+ binds = {
+ scroll_event_delay = 0;
+ hide_special_on_workspace_change = true;
+ };
+
+ cursor = {
+ zoom_factor = 1;
+ zoom_rigid = false;
+ };
+
+ plugin.hyprexpo = {
+ columns = 3;
+ gap_size = 5;
+ bg_col = "rgb(000000)";
+ workspace_method = "first 1";
+ enable_gesture = false;
+ gesture_distance = 300;
+ gesture_positive = false;
+ };
+ };
+}
diff --git a/modules/desktop/hyprland/keybinds.nix b/modules/desktop/hyprland/keybinds.nix
new file mode 100644
index 000000000..2e2e9ac2d
--- /dev/null
+++ b/modules/desktop/hyprland/keybinds.nix
@@ -0,0 +1,189 @@
+{
+ config,
+ pkgs,
+ ...
+}: {
+ wayland.windowManager.hyprland.settings = {
+ # Shell keybinds
+ bindi = [
+ "Super, Super_L, Toggle overview, global, quickshell:overviewToggleRelease"
+ ];
+ binditn = [
+ "Super, catchall, global, quickshell:overviewToggleReleaseInterrupt"
+ "Ctrl, Super_L, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:272, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:273, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:274, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:275, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:276, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse:277, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse_up, global, quickshell:overviewToggleReleaseInterrupt"
+ "Super, mouse_down, global, quickshell:overviewToggleReleaseInterrupt"
+ ];
+ bindit = [
+ ", Super_L, global, quickshell:workspaceNumber"
+ ];
+ bindd = [
+ # The Nix module for Hyprland doesn't use `bindd` as a separate type,
+ # but it's used in the config file to handle cheatsheet descriptions.
+ # We'll put these into the main `bind` list and resolve the duplicates.
+ # The `bindd` lines here were already duplicates of the `bind` lines
+ # in your previous example, so they were the source of the conflict.
+ # I am merging them into a single, comprehensive `bind` list below.
+ ];
+
+ # All unique keybindings are listed here.
+ bind =
+ [
+ # Shell and QuickShell keybinds
+ "Super, V, exec, qs -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || cliphist list | fuzzel --match-mode fzf --dmenu | cliphist decode | wl-copy"
+ "Super, Period, exec, qs -c $qsConfig ipc call TEST_ALIVE || pkill fuzzel || ~/.config/hypr/hyprland/scripts/fuzzel-emoji.sh copy"
+ "Super, Tab, global, quickshell:overviewToggle"
+ "Super, A, global, quickshell:sidebarLeftToggle"
+ "Super+Alt, A, global, quickshell:sidebarLeftToggleDetach"
+ "Super, B, global, quickshell:sidebarLeftToggle"
+ "Super, O, global, quickshell:sidebarLeftToggle"
+ "Super, N, global, quickshell:sidebarRightToggle"
+ "Super, Slash, global, quickshell:ch+CtrleatsheetToggle"
+ "Super, M, global, quickshell:mediaControlsToggle"
+ "Ctrl+Alt, Delete, global, quickshell:sessionToggle"
+ "Ctrl+Alt, Delete, exec, qs -c $qsConfig ipc call TEST_ALIVE || pkill wlogout || wlogout -p layer-shell"
+ "Shift+Super+Alt, Slash, exec, qs -p ~/.config/quickshell/$qsConfig/welcome.qml"
+
+ # Utilities keybinds
+ "Super+Shift, S, exec, qs -p ~/.config/quickshell/$qsConfig/screenshot.qml || pidof slurp || hyprshot --freeze --clipboard-only --mode region --silent"
+ "Super+Shift, T, exec, grim -g \"$(slurp $SLURP_ARGS)\" \"tmp.png\" && tesseract \"tmp.png\" - | wl-copy && rm \"tmp.png\""
+ "Super+Shift, C, exec, hyprpicker -a"
+ "Super+Alt, R, exec, ~/.config/hypr/hyprland/scripts/record.sh"
+ "Ctrl+Alt, R, exec, ~/.config/hypr/hyprland/scripts/record.sh --fullscreen"
+ "Super+Shift+Alt, R, exec, ~/.config/hypr/hyprland/scripts/record.sh --fullscreen-sound"
+ "Super+Shift+Alt, mouse:273, exec, ~/.config/hypr/hyprland/scripts/ai/primary-buffer-query.sh"
+ "Ctrl+Super, T, exec, ~/.config/hypr/hyprland/scripts/colors/switchwall.sh"
+ "Ctrl+Super, R, exec, killall ags agsv1 gjs ydotool qs quickshell; qs -c $qsConfig &"
+ "Ctrl+Super, Backslash, resizeactive, exact 640 480"
+ "Super+Alt, f11, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i \"nipple\" | grep -v -i \"pussy\" | shuf -n 1); ACTION=$(notify-send \"Test notification with body image\" \"This notification should contain your user account image and Discord icon. Oh and here is a random image in your Pictures folder:
\" -a \"Hyprland keybind\" -p -h \"string:image-path:/var/lib/AccountsService/icons/$USER\" -t 6000 -i \"discord\" -A \"openImage=Open profile image\" -A \"action2=Open the random image\" -A \"action3=Useless button\"); [[ $ACTION == *openImage ]] && xdg-open \"/var/lib/AccountsService/icons/$USER\"; [[ $ACTION == *action2 ]] && xdg-open \"$RANDOM_IMAGE\"'"
+ "Super+Alt, f12, exec, bash -c 'RANDOM_IMAGE=$(find ~/Pictures -type f | grep -v -i \"nipple\" | grep -v -i \"pussy\" | shuf -n 1); ACTION=$(notify-send \"Test notification\" \"This notification should contain a random image in your Pictures folder and Discord icon.\\nFlick right to dismiss!\" -a \"Discord (fake)\" -p -h \"string:image-path:$RANDOM_IMAGE\" -t 6000 -i \"discord\" -A \"openImage=Open profile image\" -A \"action2=Useless button\" -A \"action3=Cry more\"); [[ $ACTION == *openImage ]] && xdg-open \"/var/lib/AccountsService/icons/$USER\"'"
+ "Super+Alt, Equal, exec, notify-send \"Urgent notification\" \"Ah hell no\" -u critical -a 'Hyprland keybind'"
+
+ # Window management
+ "Super, Q, killactive"
+ "Super+Shift+Alt, Q, exec, hyprctl kill"
+ "Super+Alt, Space, togglefloating"
+ "Super, D, fullscreen, 1"
+ "Super, F, fullscreen, 0"
+ "Super+Alt, F, fullscreenstate, 0 3"
+ "Super, P, pin"
+ "Super, S, togglespecialworkspace"
+ "Super+Alt, S, movetoworkspacesilent, special"
+ "Alt, Tab, cyclenext"
+ "Alt, Tab, bringactivetotop"
+ "Super, mouse:275, togglespecialworkspace"
+
+ # Media
+ "Super+Shift, N, exec, playerctl next || playerctl position `bc <<< \"100 * $(playerctl metadata mpris:length) / 1000000 / 100\"`"
+ "Super+Shift, B, exec, playerctl previous"
+ "Super+Shift, P, exec, playerctl play-pause"
+ "Super+Shift+Alt, mouse:275, exec, playerctl previous"
+ "Super+Shift+Alt, mouse:276, exec, playerctl next || playerctl position `bc <<< \"100 * $(playerctl metadata mpris:length) / 1000000 / 100\"`"
+
+ # Session
+ "Ctrl+Shift+Alt+Super, Delete, exec, systemctl poweroff || loginctl poweroff"
+
+ # Apps
+ "Super, Return, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"$TERMINAL\" \"kitty -1\" \"foot\" \"alacritty\" \"wezterm\" \"konsole\" \"kgx\" \"uxterm\" \"xterm\""
+ "Super, T, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"$TERMINAL\" \"kitty -1\" \"foot\" \"alacritty\" \"wezterm\" \"konsole\" \"kgx\" \"uxterm\" \"xterm\""
+ "Ctrl+Alt, T, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"$TERMINAL\" \"kitty -1\" \"foot\" \"alacritty\" \"wezterm\" \"konsole\" \"kgx\" \"uxterm\" \"xterm\""
+ "Super, E, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"dolphin\" \"nautilus\" \"nemo\" \"thunar\" \"$TERMINAL\" \"kitty -1 fish -c yazi\""
+ "Super, W, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"google-chrome-stable\" \"zen-browser\" \"firefox\" \"brave\" \"chromium\" \"microsoft-edge-stable\" \"opera\" \"librewolf\""
+ "Super, C, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"code\" \"codium\" \"cursor\" \"zed\" \"zedit\" \"zeditor\" \"kate\" \"gnome-text-editor\" \"emacs\" \"command -v nvim && kitty -1 nvim\""
+ "Super+Shift, W, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"wps\" \"onlyoffice-desktopeditors\""
+ "Super, X, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"kate\" \"gnome-text-editor\" \"emacs\""
+ "Ctrl+Super, V, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"pavucontrol-qt\" \"pavucontrol\""
+ "Super, I, exec, XDG_CURRENT_DESKTOP=gnome ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"qs -p ~/.config/quickshell/$qsConfig/settings.qml\" \"systemsettings\" \"gnome-control-center\" \"better-control\""
+ "Ctrl+Shift, Escape, exec, ~/.config/hypr/hyprland/scripts/launch_first_available.sh \"gnome-system-monitor\" \"plasma-systemmonitor --page-name Processes\" \"command -v btop && kitty -1 fish -c btop\""
+
+ # Window movement and focus
+ "Super, Left, movefocus, l"
+ "Super, Right, movefocus, r"
+ "Super, Up, movefocus, u"
+ "Super, Down, movefocus, d"
+ "Super, BracketLeft, movefocus, l"
+ "Super, BracketRight, movefocus, r"
+ "Super+Shift, Left, movewindow, l"
+ "Super+Shift, Right, movewindow, r"
+ "Super+Shift, Up, movewindow, u"
+ "Super+Shift, Down, movewindow, d"
+ "Alt, F4, killactive"
+ "Super+Shift, mouse_down, movetoworkspace, r-1"
+ "Super+Shift, mouse_up, movetoworkspace, r+1"
+ "Super+Alt, mouse_down, movetoworkspace, -1"
+ "Super+Alt, mouse_up, movetoworkspace, +1"
+ "Super+Shift, Page_Down, movetoworkspace, r+1"
+ "Super+Shift, Page_Up, movetoworkspace, r-1"
+ "Ctrl+Super+Shift, Right, movetoworkspace, r+1"
+ "Ctrl+Super+Shift, Left, movetoworkspace, r-1"
+ "Ctrl+Super, Right, workspace, r+1"
+ "Ctrl+Super, Left, workspace, r-1"
+ "Ctrl+Super+Alt, Right, workspace, m+1"
+ "Ctrl+Super+Alt, Left, workspace, m-1"
+ "Super, Page_Down, workspace, +1"
+ "Super, Page_Up, workspace, -1"
+ "Ctrl+Super, Page_Down, workspace, r+1"
+ "Ctrl+Super, Page_Up, workspace, r-1"
+ "Super, mouse_up, workspace, +1"
+ "Super, mouse_down, workspace, -1"
+ "Ctrl+Super, mouse_up, workspace, r+1"
+ "Ctrl+Super, mouse_down, workspace, r-1"
+
+ "Super+Alt, 0, exec, ~/.config/hypr/hyprland/scripts/workspace_action.sh movetoworkspacesilent 0"
+ "Super, 0, exec, ~/.config/hypr/hyprland/scripts/workspace_action.sh workspace 0"
+ ]
+ ++ (
+ builtins.concatLists (builtins.genList (
+ i: let
+ ws = i + 1;
+ in [
+ "Super+Alt, ${toString ws}, exec, ~/.config/hypr/hyprland/scripts/workspace_action.sh movetoworkspacesilent ${toString ws}"
+ "Super, ${toString ws}, exec, ~/.config/hypr/hyprland/scripts/workspace_action.sh workspace ${toString ws}"
+ ]
+ )
+ 9)
+ );
+
+ # The `bindm` list is used for mouse modifiers.
+ bindm = [
+ "Super, mouse:272, movewindow"
+ "Super, mouse:274, movewindow"
+ "Super, mouse:273, resizewindow"
+ ];
+
+ # The `bindl` list is for key release events.
+ bindl = [
+ ", XF86MonBrightnessUp, exec, qs -c $qsConfig ipc call brightness increment || brightnessctl s 5%+"
+ ", XF86MonBrightnessDown, exec, qs -c $qsConfig ipc call brightness decrement || brightnessctl s 5%-"
+ ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 2%+"
+ ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%-"
+ ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_SINK@ toggle"
+ "Super+Shift, M, exec, wpctl set-mute @DEFAULT_SINK@ toggle"
+ "Alt, XF86AudioMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle"
+ ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle"
+ "Super+Alt, M, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle"
+ ", Print, exec, grim - | wl-copy"
+ "Ctrl, Print, exec, mkdir -p $(xdg-user-dir PICTURES)/Screenshots && grim $(xdg-user-dir PICTURES)/Screenshots/Screenshot_\"$(date '+%Y-%m-%d_%H.%M.%S')\".png"
+ ", XF86AudioNext, exec, playerctl next || playerctl position `bc <<< \"100 * $(playerctl metadata mpris:length) / 1000000 / 100\"`"
+ ", XF86AudioPrev, exec, playerctl previous"
+ ", XF86AudioPlay, exec, playerctl play-pause"
+ ", XF86AudioPause, exec, playerctl play-pause"
+ ];
+
+ # The `binde` list is for continuous events.
+ binde = [
+ "Super, Semicolon, splitratio, -0.1"
+ "Super, Apostrophe, splitratio, +0.1"
+ "Super, Minus, exec, qs -c $qsConfig ipc call zoom zoomOut"
+ "Super, Equal, exec, qs -c $qsConfig ipc call zoom zoomIn"
+ "Super, Minus, exec, qs -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/hyprland/scripts/zoom.sh decrease 0.1"
+ "Super, Equal, exec, qs -c $qsConfig ipc call TEST_ALIVE || ~/.config/hypr/hyprland/scripts/zoom.sh increase 0.1"
+ ];
+ };
+}
diff --git a/modules/desktop/hyprland/rules.nix b/modules/desktop/hyprland/rules.nix
new file mode 100644
index 000000000..a707f5bbf
--- /dev/null
+++ b/modules/desktop/hyprland/rules.nix
@@ -0,0 +1,153 @@
+{
+ config,
+ pkgs,
+ ...
+}: {
+ wayland.windowManager.hyprland.settings = {
+ windowrulev2 = [
+ # Uncomment to apply global transparency to all windows:
+ # "opacity 0.89 override 0.89 override, class:.*"
+
+ # Disable blur for xwayland context menus
+ "noblur, class:^()$,title:^()$"
+ "noblur, xwayland:1"
+
+ # Floating
+ "float, class:^(blueberry\\.py)$"
+ "float, class:^(guifetch)$"
+ "float, class:^(pavucontrol)$"
+ "size 45%, class:^(pavucontrol)$"
+ "center, class:^(pavucontrol)$"
+ "float, class:^(org\\.pulseaudio\\.pavucontrol)$"
+ "size 45%, class:^(org\\.pulseaudio\\.pavucontrol)$"
+ "center, class:^(org\\.pulseaudio\\.pavucontrol)$"
+ "float, class:^(nm-connection-editor)$"
+ "size 45%, class:^(nm-connection-editor)$"
+ "center, class:^(nm-connection-editor)$"
+ "float, class:.*plasmawindowed.*"
+ "float, class:kcm_.*"
+ "float, class:.*bluedevilwizard"
+ "float, title:.*Welcome"
+ "float, title:^(illogical-impulse Settings)$"
+ "float, class:org.freedesktop.impl.portal.desktop.kde"
+ "float, class:^(Zotero)$"
+ "size 45%, class:^(Zotero)$"
+
+ # Move
+ "float, class:^(plasma-changeicons)$"
+ "noinitialfocus, class:^(plasma-changeicons)$"
+ "move 999999 999999, class:^(plasma-changeicons)$"
+ "move 40 80, title:^(Copying — Dolphin)$"
+
+ # Tiling
+ "tile, class:^dev\\.warp\\.Warp$"
+
+ # Picture-in-Picture
+ "float, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+ "keepaspectratio, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+ "move 73% 72%, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+ "size 25%, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+ "pin, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+ "float, title:^([Pp]icture[-\\s]?[Ii]n[-\\s]?[Pp]icture)(.*)$"
+
+ # Dialog windows
+ "center, title:^(Open File)(.*)$"
+ "center, title:^(Select a File)(.*)$"
+ "center, title:^(Choose wallpaper)(.*)$"
+ "center, title:^(Open Folder)(.*)$"
+ "center, title:^(Save As)(.*)$"
+ "center, title:^(Library)(.*)$"
+ "center, title:^(File Upload)(.*)$"
+ "center, title:^(.*)(wants to save)$"
+ "center, title:^(.*)(wants to open)$"
+ "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, title:^(File Upload)(.*)$"
+ "float, title:^(.*)(wants to save)$"
+ "float, title:^(.*)(wants to open)$"
+
+ # Tearing
+ "immediate, title:.*\\.exe"
+ "immediate, title:.*minecraft.*"
+ "immediate, class:^(steam_app).*"
+
+ # No shadow for tiled windows
+ "noshadow, floating:0"
+ ];
+
+ workspace = [
+ "special:special, gapsout:30"
+ ];
+
+ layerrule = [
+ "xray 1, .*"
+ # "noanim, .*"
+ "noanim, walker"
+ "noanim, selection"
+ "noanim, overview"
+ "noanim, anyrun"
+ "noanim, indicator.*"
+ "noanim, osk"
+ "noanim, hyprpicker"
+ "noanim, noanim"
+ "blur, gtk-layer-shell"
+ "ignorezero, gtk-layer-shell"
+ "blur, launcher"
+ "ignorealpha 0.5, launcher"
+ "blur, notifications"
+ "ignorealpha 0.69, notifications"
+ "blur, logout_dialog"
+ "animation slide left, sideleft.*"
+ "animation slide right, sideright.*"
+ "blur, session[0-9]*"
+ "blur, bar[0-9]*"
+ "ignorealpha 0.6, bar[0-9]*"
+ "blur, barcorner.*"
+ "ignorealpha 0.6, barcorner.*"
+ "blur, dock[0-9]*"
+ "ignorealpha 0.6, dock[0-9]*"
+ "blur, indicator.*"
+ "ignorealpha 0.6, indicator.*"
+ "blur, overview[0-9]*"
+ "ignorealpha 0.6, overview[0-9]*"
+ "blur, cheatsheet[0-9]*"
+ "ignorealpha 0.6, cheatsheet[0-9]*"
+ "blur, sideright[0-9]*"
+ "ignorealpha 0.6, sideright[0-9]*"
+ "blur, sideleft[0-9]*"
+ "ignorealpha 0.6, sideleft[0-9]*"
+ "blur, indicator.*"
+ "ignorealpha 0.6, indicator.*"
+ "blur, osk[0-9]*"
+ "ignorealpha 0.6, osk[0-9]*"
+ "blurpopups, quickshell:.*"
+ "blur, quickshell:.*"
+ "ignorealpha 0.79, quickshell:.*"
+ "animation slide top, quickshell:bar"
+ "animation fade, quickshell:screenCorners"
+ "animation slide right, quickshell:sidebarRight"
+ "animation slide left, quickshell:sidebarLeft"
+ "animation slide bottom, quickshell:osk"
+ "animation slide bottom, quickshell:dock"
+ "blur, quickshell:session"
+ "noanim, quickshell:session"
+ "ignorealpha 0, quickshell:session"
+ "animation fade, quickshell:notificationPopup"
+ "blur, quickshell:backgroundWidgets"
+ "ignorealpha 0.05, quickshell:backgroundWidgets"
+ "noanim, quickshell:screenshot"
+ "animation popin 120%, quickshell:screenCorners"
+ "noanim, quickshell:lockWindowPusher"
+ "noanim, quickshell:overview"
+ "noanim, gtk4-layer-shell"
+ "blur, shell:bar"
+ "ignorezero, shell:bar"
+ "blur, shell:notifications"
+ "ignorealpha 0.1, shell:notifications"
+ ];
+ };
+}
diff --git a/modules/options.nix b/modules/options.nix
index cd3d78c64..e10c6891e 100644
--- a/modules/options.nix
+++ b/modules/options.nix
@@ -17,6 +17,15 @@
description = "Uses a custom pure-like starship configuration.";
};
};
+ hyprland = {
+ useNixForConf = {
+ enable = lib.mkOption {
+ type = lib.types.bool;
+ default = false;
+ description = "Use .nix files for hyprland setup instead of exporting .config/hypr. Useful for modifiable configurations.";
+ };
+ };
+ };
};
};
}
diff --git a/modules/terminal/simpleStarship.nix b/modules/terminal/simpleStarship.nix
new file mode 100644
index 000000000..a7c4c8509
--- /dev/null
+++ b/modules/terminal/simpleStarship.nix
@@ -0,0 +1,49 @@
+{lib, ...}: {
+ format = lib.concatStrings [
+ "$username"
+ "$hostname"
+ "$directory"
+ "$git_branch"
+ "$git_state"
+ "$git_status"
+ "$cmd_duration"
+ "$line_break"
+ "$python"
+ "$character"
+ ];
+ directory = {
+ style = "blue";
+ };
+ character = {
+ success_symbol = "[→](purple)";
+ error_symbol = "[→](red)";
+ vimcmd_symbol = "[←](green)";
+ };
+ git_branch = {
+ format = "[$branch]($style)";
+ style = "bright-black";
+ };
+ git_status = {
+ format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) $ahead_behind$stashed]($style)";
+ style = "cyan";
+ conflicted = "";
+ untracked = "";
+ modified = "";
+ staged = "";
+ renamed = "";
+ deleted = "";
+ stashed = "≡";
+ };
+ git_state = {
+ format = "([$state( $progress_current/$progress_total)]($style)) ";
+ style = "bright-black";
+ };
+ cmd_duration = {
+ format = "[$duration]($style) ";
+ style = "yellow";
+ };
+ python = {
+ format = "[$virtualenv]($style) ";
+ style = "bright-black";
+ };
+}
diff --git a/modules/terminal/terminal.nix b/modules/terminal/terminal.nix
index f557cb3ee..3eca10092 100644
--- a/modules/terminal/terminal.nix
+++ b/modules/terminal/terminal.nix
@@ -4,6 +4,7 @@
...
}: let
cfg = config.programs.illogical-impulse;
+ simpleStarshipSettings = import ./simpleStarship.nix {inherit lib;};
in {
imports = [
../options.nix
@@ -12,55 +13,7 @@ in {
config = lib.mkIf cfg.enable {
programs.starship = lib.mkIf cfg.settings.simpleStarship.enable {
enable = true;
- settings = {
- format = lib.concatStrings [
- "$username"
- "$hostname"
- "$directory"
- "$git_branch"
- "$git_state"
- "$git_status"
- "$cmd_duration"
- "$line_break"
- "$python"
- "$character"
- ];
- directory = {
- style = "blue";
- };
- character = {
- success_symbol = "[→](purple)";
- error_symbol = "[→](red)";
- vimcmd_symbol = "[←](green)";
- };
- git_branch = {
- format = "[$branch]($style)";
- style = "bright-black";
- };
- git_status = {
- format = "[(*$conflicted$untracked$modified$staged$renamed$deleted) $ahead_behind$stashed]($style)";
- style = "cyan";
- conflicted = "";
- untracked = "";
- modified = "";
- staged = "";
- renamed = "";
- deleted = "";
- stashed = "≡";
- };
- git_state = {
- format = "([$state( $progress_current/$progress_total)]($style)) ";
- style = "bright-black";
- };
- cmd_duration = {
- format = "[$duration]($style) ";
- style = "yellow";
- };
- python = {
- format = "[$virtualenv]($style) ";
- style = "bright-black";
- };
- };
+ settings = simpleStarshipSettings;
};
home.file.".config/starship.toml" = lib.mkIf (!cfg.settings.simpleStarship.enable) {