{ modules, ... }: { modules.hyprland = { provides = { doloro-settings = { includes = [ modules.dunst ]; homeManager = { pkgs, home, ... }: let tofiCfg = pkgs.writeTextFile { name = "hyprland-tofi-config"; text = '' width = 100% height = 100% border-width = 0 outline-width = 0 padding-left = 35% padding-top = 35% result-spacing = 25 num-results = 5 font = monospace background-color = #000A ''; }; meowScript = pkgs.writeShellScript "meow" '' fish -c 'grim -g $(slurp) -t png - &| wl-copy -t image/png; killall wayfreeze' ''; mreowScript = pkgs.writeShellScript "mreow" '' exec $(tofi-drun -c ${tofiCfg}) ''; mainMod = "SUPER"; hlBind = key: dispatcher: "hl.bind(\"${key}\", ${dispatcher})"; workspaceLines = pkgs.lib.concatLists ( builtins.genList ( i: let ws = toString (i + 1); in [ (hlBind "${mainMod} + ${ws}" "hl.dsp.focus({ workspace = ${ws} })") (hlBind "${mainMod} + SHIFT + ${ws}" "hl.dsp.window.move({ workspace = ${ws} })") ] ) 9 ); hlBindCode = pkgs.lib.concatStringsSep "\n" ( [ "-- Hyprland configuration" "" "local mainMod = \"${mainMod}\"" "" "-- Config" "hl.config({" " general = {" " gaps_in = 1," " gaps_out = 1," " border_size = 1," " resize_on_border = false," " allow_tearing = true," " layout = \"dwindle\"," " }," " input = {" " follow_mouse = 2," " kb_layout = \"gb\"," " }," " decoration = {" " rounding = 4," " rounding_power = 1," " active_opacity = 1.0," " inactive_opacity = 1.0," " shadow = {" " enabled = false," " }," " blur = {" " enabled = true," " passes = 1," " new_optimizations = true," " ignore_opacity = false," " }," " }," " cursor = {" " no_hardware_cursors = false," " }," " dwindle = {" " preserve_split = true," " }," " misc = {" " force_default_wallpaper = -1," " disable_hyprland_logo = false," " enable_anr_dialog = false," " }," "})" "" "-- Monitors" "hl.monitor({ output = \"HDMI-A-1\", mode = \"1920x1080@60\", position = \"0x0\", scale = \"1\" })" "hl.monitor({ output = \"DP-2\", mode = \"1920x1080@120\", position = \"1920x0\", scale = \"1\" })" "" "-- Input" "hl.device({ name = \"default\", kb_layout = \"gb\", sensitivity = -0.5 })" "" "-- Curves" "hl.curve(\"easeOutQuint\", { type = \"bezier\", points = { {0.23, 1}, {0.32, 1} } })" "hl.curve(\"easeInOutCubic\", { type = \"bezier\", points = { {0.65, 0.05}, {0.36, 1} } })" "hl.curve(\"linear\", { type = \"bezier\", points = { {0, 0}, {1, 1} } })" "hl.curve(\"almostLinear\", { type = \"bezier\", points = { {0.5, 0.5}, {0.75, 1} } })" "hl.curve(\"quick\", { type = \"bezier\", points = { {0.15, 0}, {0.1, 1} } })" "" "-- Animations" "hl.animation({ leaf = \"global\", enabled = true, speed = 10, bezier = \"default\" })" "hl.animation({ leaf = \"border\", enabled = true, speed = 5.39, bezier = \"easeOutQuint\" })" "hl.animation({ leaf = \"windows\", enabled = true, speed = 2.79, bezier = \"easeOutQuint\" })" "hl.animation({ leaf = \"windowsIn\", enabled = true, speed = 1, bezier = \"easeOutQuint\", style = \"popin 87%\" })" "hl.animation({ leaf = \"windowsOut\", enabled = true, speed = 1, bezier = \"linear\", style = \"popin 87%\" })" "hl.animation({ leaf = \"windowsMove\", enabled = true, speed = 1, bezier = \"easeInOutCubic\" })" "hl.animation({ leaf = \"fadeIn\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })" "hl.animation({ leaf = \"fadeOut\", enabled = true, speed = 0.5, bezier = \"almostLinear\" })" "hl.animation({ leaf = \"fade\", enabled = true, speed = 1, bezier = \"quick\" })" "hl.animation({ leaf = \"layers\", enabled = true, speed = 3.81, bezier = \"easeOutQuint\" })" "hl.animation({ leaf = \"layersIn\", enabled = true, speed = 4, bezier = \"easeOutQuint\", style = \"fade\" })" "hl.animation({ leaf = \"layersOut\", enabled = true, speed = 1.5, bezier = \"linear\", style = \"fade\" })" "hl.animation({ leaf = \"fadeLayersIn\", enabled = true, speed = 1.79, bezier = \"almostLinear\" })" "hl.animation({ leaf = \"fadeLayersOut\", enabled = true, speed = 1.39, bezier = \"almostLinear\" })" "hl.animation({ leaf = \"workspaces\", enabled = true, speed = 1, bezier = \"almostLinear\", style = \"slide\" })" "hl.animation({ leaf = \"workspacesIn\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })" "hl.animation({ leaf = \"workspacesOut\", enabled = true, speed = 1, bezier = \"easeInOutCubic\", style = \"slide\" })" "hl.animation({ leaf = \"zoomFactor\", enabled = true, speed = 7, bezier = \"quick\" })" "" "-- Binds" (hlBind "${mainMod} + R" "hl.dsp.exec_cmd(\"${mreowScript}\")") (hlBind "${mainMod} + C" "hl.dsp.window.close()") (hlBind "${mainMod} + M" "hl.dsp.exec_cmd(\"uwsm stop\")") (hlBind "${mainMod} + Q" "hl.dsp.exec_cmd(\"kitty\")") (hlBind "${mainMod} + V" "hl.dsp.window.float({ action = \"toggle\" })") (hlBind "${mainMod} + left" "hl.dsp.focus({ direction = \"left\" })") (hlBind "${mainMod} + right" "hl.dsp.focus({ direction = \"right\" })") (hlBind "${mainMod} + up" "hl.dsp.focus({ direction = \"up\" })") (hlBind "${mainMod} + down" "hl.dsp.focus({ direction = \"down\" })") (hlBind "${mainMod} + L" "hl.dsp.exec_cmd(\"wlogout\")") (hlBind "${mainMod} + S" "hl.dsp.exec_cmd(\"wayfreeze --after-freeze-cmd '${meowScript}'\")") (hlBind "${mainMod} + F" "hl.dsp.window.fullscreen({ action = \"toggle\" })") (hlBind "${mainMod} + SHIFT + Q" "hl.dsp.window.close()") (hlBind "${mainMod} + mouse_down" "hl.dsp.focus({ workspace = \"e+1\" })") (hlBind "${mainMod} + mouse_up" "hl.dsp.focus({ workspace = \"e-1\" })") "" "-- Mouse binds" (hlBind "${mainMod} + mouse:272" "hl.dsp.window.drag()") (hlBind "${mainMod} + mouse:273" "hl.dsp.window.resize()") "" "-- Media keys" (hlBind "XF86AudioLowerVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-\")") (hlBind "XF86AudioRaiseVolume" "hl.dsp.exec_cmd(\"wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+\")") (hlBind "XF86AudioMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")") (hlBind "XF86AudioPlay" "hl.dsp.exec_cmd(\"playerctl play-pause\")") (hlBind "XF86AudioNext" "hl.dsp.exec_cmd(\"playerctl next\")") (hlBind "XF86AudioPrev" "hl.dsp.exec_cmd(\"playerctl previous\")") (hlBind "XF86AudioMicMute" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")") (hlBind "home" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle\")") (hlBind "end" "hl.dsp.exec_cmd(\"wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle\")") (hlBind "F8" "hl.dsp.pass({ window = [[match:class:^(com.obsproject.Studio)$]] })") "" "-- Workspaces" (hlBind "${mainMod} + 0" "hl.dsp.focus({ workspace = 10 })") (hlBind "${mainMod} + SHIFT + 0" "hl.dsp.window.move({ workspace = 10 })") ] ++ workspaceLines ++ [ "" "-- Window rules" "hl.window_rule({ suppress_event = \"maximize\" })" "hl.window_rule({ match = { class = \"gamescope\" }, workspace = \"5\", immediate = true, confine_pointer = true })" "hl.window_rule({ match = { initial_title = \"OBS Studio Crash Detected\" }, pin = true })" "hl.window_rule({ match = { initial_title = \"Discord Popout\" }, workspace = \"1 silent\" })" "" "-- Layer rules" "hl.layer_rule({ match = { namespace = \"notifications\" }, no_screen_share = true })" "" "-- Host-specific overrides: load ~/.config/hypr/hyprland-local.lua if present (must be valid Lua)" "local home = os.getenv(\"HOME\")" "if home then" " local localPath = home .. '/.config/hypr/hyprland-local.lua'" " local f = io.open(localPath, 'r')" " if f then" " f:close()" " local chunk, err = loadfile(localPath)" " if chunk then chunk() else io.stderr:write('hyprland-local.lua error: ' .. err .. '\\n') end" " end" "end" ] ); in { home.packages = [ pkgs.hyprcursor pkgs.wlogout pkgs.tofi pkgs.killall pkgs.grim pkgs.slurp pkgs.wayclip ]; home.pointerCursor = { enable = true; name = "rose-pine-hyprcursor"; package = pkgs.rose-pine-hyprcursor; hyprcursor.enable = true; }; services.hyprpaper = { enable = true; settings = { splash = true; wallpaper = [ { monitor = "HDMI-A-1"; path = "/home/doloro/Wallpaper.jpg"; } { monitor = "DP-2"; path = "/home/doloro/Wallpaper.jpg"; } ]; }; }; # systemd.user.services.hyprpaper = { # partOf = [ "hyprland-session.target" ]; # after = [ "hyprland-session.target" ]; # }; # Hand-written config as extraLuaFile so Home Manager still # generates hypr/hyprland.lua itself, including the systemd # session activation hooks (hyprland-session.target start/stop # + dbus-update-activation-environment --systemd --all). wayland.windowManager.hyprland.extraLuaFiles."hl-main.lua" = { autoLoad = true; content = hlBindCode; }; }; }; }; }; }