diff --git a/modules/user/hyprland.nix b/modules/user/hyprland.nix index 247cec9..4c9f961 100644 --- a/modules/user/hyprland.nix +++ b/modules/user/hyprland.nix @@ -28,6 +28,13 @@ in { optImport ../../host/${hostname}/modules/hyprland.nix ++ optImport ../../user/${username}/modules/hyprland.nix; + options.lucidHyprlandBinds = lib.mkOption { + type = lib.types.listOf lib.types.attrs; + default = []; + internal = true; + }; + + config = { home.packages = with pkgs; [ ghostty pamixer @@ -154,7 +161,11 @@ in { ]) ]; - bind = [ + bind = lib.mkIf (username != "chest") config.lucidHyprlandBinds; + }; + }; + + lucidHyprlandBinds = [ (bind "SUPER + V" (exec "ghostty --title=clipse -e clipse")) (hyprLua.bind "SUPER + SHIFT + V" (hyprLua.execLauncher "qs ipc call launcher clipboard")) (bind "Print" (exec "qs ipc call screenshot full")) @@ -213,7 +224,5 @@ in { (bindWithFlags "SUPER + mouse:272" "hl.dsp.window.drag()" { mouse = true; }) (bindWithFlags "SUPER + mouse:273" "hl.dsp.window.resize()" { mouse = true; }) ]; - }; }; - } diff --git a/modules/user/hyprland/zoom.nix b/modules/user/hyprland/zoom.nix index 99f8deb..1c17696 100644 --- a/modules/user/hyprland/zoom.nix +++ b/modules/user/hyprland/zoom.nix @@ -17,7 +17,7 @@ let hl.config({ cursor = { zoom_factor = math.max(1, current * 0.9) } }) end''; in { - wayland.windowManager.hyprland.settings.bind = [ + lucidHyprlandBinds = [ (bind "SUPER + SHIFT + mouse_up" resetZoom) (bind "SUPER + SHIFT + mouse_down" resetZoom) (bind "SUPER + SHIFT + minus" resetZoom) diff --git a/modules/user/lucid/default.nix b/modules/user/lucid/default.nix index 92dda84..8f0cccb 100644 --- a/modules/user/lucid/default.nix +++ b/modules/user/lucid/default.nix @@ -3,6 +3,188 @@ let host = osConfig.networking.hostName; isChest = config.home.username == "chest"; isRias = host == "Rias"; + specialBindIds = [ "scratchpad" "scratchpad-stash" "special-music" "special-comms" "special-todo" "special-sysmon" "daemons-workspace" ]; + specialSeed = pkgs.writeText "lucid-special-bindings.json" (builtins.toJSON { + version = 1; + binds = builtins.filter (entry: builtins.elem entry.id specialBindIds) + (builtins.fromJSON (builtins.readFile ./lucid-keybinds-rias.json)).binds; + }); + chestBindingsScript = pkgs.writeText "lucid-chest-bindings.py" '' +import hashlib +import json +import re +import sys +from collections import Counter + +source, reference, special, output = sys.argv[1:] +binds = json.loads(source) +refs = json.load(open(reference))["binds"] +specials = json.load(open(special))["binds"] +counts = Counter() +result = [] +for entry in binds: + args = entry["_args"] + if not 2 <= len(args) <= 3 or args[1].get("_type") != "lua-inline": + raise ValueError(f"Unsupported Hyprland binding: {entry}") + keys, expr = args[0], args[1]["expr"] + opts = args[2] if len(args) == 3 else {} + signature = json.dumps([keys.upper().replace(" ", ""), opts], sort_keys=True) + counts[signature] += 1 + identifier = hashlib.sha256(signature.encode()).hexdigest()[:12] + b = {"id": f"chest-{identifier}-{counts[signature]}", "keys": keys} + match = next((r for r in refs if r.get("keys", "").upper().replace(" ", "") == keys.upper().replace(" ", "") and r.get("opts", {}) == opts), None) + b["desc"] = match.get("desc", keys) if match else keys + b["category"] = match.get("category", "Other") if match else "Other" + workspace = re.search(r"workspace = (\d+)", expr) + if workspace and expr.startswith("hl.dsp.focus("): + b.update(desc=f"Focus workspace {workspace.group(1)}", category="Workspaces") + elif workspace and expr.startswith("hl.dsp.window.move("): + b.update(desc=f"Move window to workspace {workspace.group(1)}", category="Workspaces") + if keys.upper().replace(" ", "") == "SUPER+SHIFT+S": + b.update(desc="Region screenshot and edit", category="Screenshots") + m = re.fullmatch(r'hl\.dsp\.exec_cmd\(("(?:\\.|[^"\\])*")\)\s*', expr, re.S) + if m: + cmd = json.loads(m.group(1)) + cmd = re.sub(r'/nix/store/[0-9a-z]{32}-[^/\s"\\]+/bin/([A-Za-z0-9_.+-]+)', r'\1', cmd) + b.update(type="exec", cmd=cmd) + else: + b.update(type="lua", lua=expr) + if opts: + b["opts"] = opts + result.append(b) +json.dump({"version": 1, "binds": result + specials}, open(output, "w"), indent=2) + ''; + chestSeed = pkgs.runCommand "lucid-chest-bindings.json" { nativeBuildInputs = [ pkgs.python3 ]; } '' + python3 ${chestBindingsScript} ${lib.escapeShellArg (builtins.toJSON config.lucidHyprlandBinds)} \ + ${./lucid-keybinds-rias.json} ${specialSeed} "$out" + ''; + mergeChestBinds = pkgs.writeText "lucid-merge-chest-bindings.jq" '' +def normlua: (. // "") | gsub("\\s+"; "") | gsub("\u0027"; "\""); +def normkeys: (. // "") | ascii_upcase | gsub("\\s+"; "") | split("+") + | map(if . == "WIN" or . == "LOGO" or . == "MOD4" then "SUPER" + elif . == "CONTROL" then "CTRL" else . end) | sort | join("+"); +def combos: + if .each == "workspace" then .keys as $k | [range(1;11) as $i | ($k | gsub("\\{key\\}"; (($i % 10) | tostring)) | normkeys)] + else [(.keys | normkeys)] end; +def trigger: {click: (.opts.click // false), long_press: (.opts.long_press // false), release: (.opts.release // false), mouse: (.opts.mouse // false)}; +if (.binds | type) != "array" then error("keybinds.json has no binds array") else . end +| . as $old +| .binds += [$seed[0].binds[] as $b + | select([$old.binds[] | select( + .id == $b.id + or ((["scratchpad", "scratchpad-stash", "special-music", "special-comms", "special-todo", "special-sysmon", "daemons-workspace"] | index($b.id)) != null and .type == "lua" and $b.type == "lua" and ((.lua | normlua) == ($b.lua | normlua))) + or ((trigger == ($b | trigger)) and ((combos - ($b | combos) | length) < (combos | length))) + )] | length == 0) | $b] + ''; + mergeSpecialBinds = pkgs.writeText "lucid-merge-special-binds.jq" '' + def normlua: (. // "") | gsub("\\s+"; "") | gsub("\u0027"; "\""); + def normkeys: (. // "") | ascii_upcase | gsub("\\s+"; "") | split("+") + | map(if . == "WIN" or . == "LOGO" or . == "MOD4" then "SUPER" + elif . == "CONTROL" then "CTRL" else . end) | sort | join("+"); + if (.binds | type) != "array" then error("keybinds.json has no binds array") else . end + | . as $old + | .binds += [ $seed[0].binds[] as $b + | select([$old.binds[] | select(.id == $b.id or (.type == "lua" and ((.lua | normlua) == ($b.lua | normlua))))] | length == 0) + | if ([$old.binds[] | select(.enabled != false and ((.keys | normkeys) == ($b.keys | normkeys)))] | length) > 0 + then $b + { enabled: false } else $b end ] + ''; + mergeSpecialPrefs = pkgs.writeText "lucid-merge-special-prefs.jq" '' + .specialCustom = ((.specialCustom // "[]" | fromjson) + | if type != "array" then error("specialCustom is not an array") else . end + | if any(.[]; .key == "daemons") then . + else . + [{key: "daemons", label: "Daemons", glyph: "build", on: true, apps: ""}] end + | tojson) + ''; + staticBindKeys = map (entry: builtins.elemAt entry._args 0) config.wayland.windowManager.hyprland.settings.bind; + nonRiasBinds = pkgs.runCommand "lucid-nix-binds.lua" { nativeBuildInputs = [ pkgs.python3 ]; } '' + python3 - ${source}/support/hypr/modules/binds.lua "$out" ${lib.escapeShellArg (builtins.toJSON staticBindKeys)} <<'PY' +import json +import pathlib +import sys + +source = pathlib.Path(sys.argv[1]).read_text() +keys = json.loads(sys.argv[3]) +lua_keys = "{ " + ", ".join(json.dumps(key, ensure_ascii=True) for key in keys) + " }" +guard = r""" +local function normalize_nix_bind(keys) + local mods, key = {}, "" + for part in tostring(keys or ""):gmatch("[^+]+") do + local token = (part:match("^%s*(.-)%s*$") or ""):upper() + if token == "CONTROL" then token = "CTRL" end + if token == "WIN" or token == "LOGO" or token == "MOD4" then token = "SUPER" end + if token == "SUPER" or token == "CTRL" or token == "ALT" or token == "SHIFT" then + mods[token] = true + else + key = token + end + end + local out = {} + for _, mod in ipairs({"ALT", "CTRL", "SHIFT", "SUPER"}) do + if mods[mod] then out[#out + 1] = mod end + end + return table.concat(out, "+") .. "+" .. key +end +local nix_binds = {} +for _, key in ipairs(NIX_BIND_KEYS) do nix_binds[normalize_nix_bind(key)] = true end +""".replace("NIX_BIND_KEYS", lua_keys) +marker = "-- several dispatchers on one key, in order" +binding = ' if type(keys) ~= "string" or keys == "" then error("no keys", 0) end' +fallback = ' for _, entry in ipairs(EMERGENCY) do apply(entry) end' +fallback_source = ' status.source = "emergency"' +fallback_text = 'Emergency binds are active - SUPER+S opens Settings.' +for needle in (marker, binding, fallback, fallback_source, fallback_text): + if source.count(needle) != 1: + raise SystemExit("Lucid bind loader changed; refusing to skip conflict protection") +source = source.replace(marker, guard + "\n" + marker, 1) +source = source.replace(binding, binding + '\n if nix_binds[normalize_nix_bind(keys)] then error("Already bound by Nix: " .. keys, 0) end', 1) +source = source.replace(fallback, ' -- Nix supplies the fallback keys on these hosts.', 1) +source = source.replace(fallback_source, ' status.source = "nix"', 1) +source = source.replace(fallback_text, 'Nix bindings remain active.', 1) +pathlib.Path(sys.argv[2]).write_text(source) +PY + ''; + chestBinds = pkgs.runCommand "lucid-chest-loader.lua" { nativeBuildInputs = [ pkgs.python3 ]; } '' + python3 - ${source}/support/hypr/modules/binds.lua "$out" <<'PYCODE' +import pathlib +import sys +source = pathlib.Path(sys.argv[1]).read_text() +old = '{ id = "terminal", keys = "F9", type = "exec", cmd = "kitty" }' +new = '{ id = "terminal", keys = "SUPER + RETURN", type = "exec", cmd = "ghostty" }' +if source.count(old) != 1: + raise SystemExit("Lucid emergency bindings changed") +pathlib.Path(sys.argv[2]).write_text(source.replace(old, new, 1)) +PYCODE + ''; + chestMonitors = pkgs.runCommand "lucid-chest-monitors.lua" { nativeBuildInputs = [ pkgs.python3 ]; } '' + python3 - ${source}/support/hypr/modules/monitors.lua "$out" <<'PY' +import pathlib +import sys + +source = pathlib.Path(sys.argv[1]).read_text() +default_rule = """hl.monitor({ + output = "", + mode = M.defaults.mode, + position = M.defaults.position, + scale = M.defaults.scale, +}) +""" +if source.count(default_rule) != 1: + raise SystemExit("Lucid monitor defaults changed; refusing to replace host monitor rules") +pathlib.Path(sys.argv[2]).write_text(source.replace(default_rule, "", 1)) +PY + ''; + chestBorders = pkgs.runCommand "lucid-chest-decorations.lua" { nativeBuildInputs = [ pkgs.python3 ]; } '' + python3 - ${source}/support/hypr/modules/decorations.lua "$out" <<'PY' +import pathlib +import sys + +source = pathlib.Path(sys.argv[1]).read_text() +marker = "local active_border, inactive_border = borders()" +if source.count(marker) != 1: + raise SystemExit("Lucid border module changed; refusing to replace host appearance settings") +pathlib.Path(sys.argv[2]).write_text(source.split(marker, 1)[0]) +PY + ''; liveDecoder = if builtins.elem osConfig.networking.hostName [ "Rias" "Eclipse" ] then "cuda" else "vaapi"; source = pkgs.applyPatches { src = pkgs.fetchgit { @@ -263,19 +445,15 @@ PY tesseract = pkgs.tesseract4.override { enableLanguages = [ "eng" "rus" ]; }; shellFile = if isChest then pkgs.writeText "lucid-chest-shell.qml" (builtins.replaceStrings [ ''import "./lucidlock"'' - " WidgetLayer {\n }\n" - " WidgetIpc {\n }\n" " Lock {\n }\n" " void Clip.probed;" ] [ "" "" - "" - "" - " void Notifs.count;\n void KdeConnect.installed;\n void Clip.probed;" + " void Notifs.count;\n void KdeConnect.installed;\n void HyprConfig.moduleProbed;\n void Monitors.moduleProbed;\n void Glass.moduleProbed;\n void Startup.moduleProbed;\n void Clip.probed;" ] (builtins.readFile ./lucid-shell.qml)) else ./lucid-shell.qml; prefsFilter = if isChest then - ''.barEnabled = true | .fontFamily = $font | .liveWallpapers = false | .idleLock = false | .idleLockBeforeSleep = false | .launcherPowerButtons = "suspend,reboot,shutdown" | .powerModuleActions = "suspend,hibernate,logout,reboot,shutdown"'' + ''.barEnabled = true | .widgetOnTop = false | .widgetHideFullscreen = true | .fontFamily = $font | .liveWallpapers = false | .idleLock = false | .idleLockBeforeSleep = false | .launcherPowerButtons = "suspend,reboot,shutdown" | .powerModuleActions = "suspend,hibernate,logout,reboot,shutdown"'' else ''.barEnabled = true | .widgetOnTop = false | .widgetHideFullscreen = true | .fontFamily = $font | .wallpaperFolder = $wallpaperDir | .liveDecoder = $decoder''; lucid = pkgs.writeShellScript "lucid" '' @@ -308,7 +486,8 @@ PY in { programs.waybar.enable = lib.mkForce false; services.mako.enable = lib.mkForce false; - home.packages = with pkgs; [ cliphist ffmpeg grim imagemagick libnotify pywal16 wf-recorder tesseract ]; + home.packages = with pkgs; [ cliphist ffmpeg grim imagemagick libnotify pywal16 wf-recorder tesseract ] + ++ lib.optionals isChest [ brightnessctl playerctl slurp swappy ]; home.activation.installLucid = lib.hm.dag.entryAfter [ "writeBoundary" ] '' target="${config.home.homeDirectory}/.config/quickshell" @@ -412,6 +591,52 @@ in { if [ "${host}" = Rias ] && [ ! -s "$lucid_dir/keybinds.json" ]; then $DRY_RUN_CMD install -m644 ${./lucid-keybinds-rias.json} "$lucid_dir/keybinds.json" fi + ${lib.optionalString (!isRias) '' + special_migration="$lucid_dir/special-workspaces-v1" + if [ -z "''${DRY_RUN_CMD:-}" ] && [ ! -e "$special_migration" ]; then + if [ -f "${config.home.homeDirectory}/.config/hypr/lucid-specials.lua" ] && \ + [ ! -e "${config.home.homeDirectory}/.config/hypr/lucid-specials.before-special-workspaces-v1.lua" ]; then + cp -p "${config.home.homeDirectory}/.config/hypr/lucid-specials.lua" \ + "${config.home.homeDirectory}/.config/hypr/lucid-specials.before-special-workspaces-v1.lua" + fi + if [ ! -s "$lucid_dir/keybinds.json" ]; then + install -m644 ${specialSeed} "$lucid_dir/keybinds.json" + else + binds_tmp=$(${pkgs.coreutils}/bin/mktemp "$lucid_dir/keybinds.json.XXXXXX") + if ${pkgs.jq}/bin/jq --slurpfile seed ${specialSeed} -f ${mergeSpecialBinds} \ + "$lucid_dir/keybinds.json" > "$binds_tmp"; then + chmod 644 "$binds_tmp" + mv "$binds_tmp" "$lucid_dir/keybinds.json" + else + rm -f "$binds_tmp" + echo "Could not merge Lucid special workspace bindings" >&2 + exit 1 + fi + fi + fi + ''} + ${lib.optionalString isChest '' + chest_migration="$lucid_dir/chest-keybinds-v1" + if [ -z "''${DRY_RUN_CMD:-}" ] && [ ! -e "$chest_migration" ]; then + if [ ! -s "$lucid_dir/keybinds.json" ]; then + install -m644 ${chestSeed} "$lucid_dir/keybinds.json" + else + if [ ! -e "$lucid_dir/keybinds.before-chest-migration.json" ]; then + cp -p "$lucid_dir/keybinds.json" "$lucid_dir/keybinds.before-chest-migration.json" + fi + binds_tmp=$(${pkgs.coreutils}/bin/mktemp "$lucid_dir/keybinds.json.XXXXXX") + if ${pkgs.jq}/bin/jq --slurpfile seed ${chestSeed} -f ${mergeChestBinds} "$lucid_dir/keybinds.json" > "$binds_tmp"; then + chmod 644 "$binds_tmp" + mv "$binds_tmp" "$lucid_dir/keybinds.json" + else + rm -f "$binds_tmp" + echo "Could not migrate chest keybindings to Lucid" >&2 + exit 1 + fi + fi + touch "$chest_migration" + fi + ''} monitor_file="${config.home.homeDirectory}/.config/hypr/lucid-monitors.lua" if [ "${host}" = Rias ] && { [ ! -s "$monitor_file" ] || ! grep -qE 'output[[:space:]]*=' "$monitor_file"; } && \ ! grep -qE 'workspace[[:space:]]*=' "$monitor_file" 2>/dev/null; then @@ -447,10 +672,24 @@ in { exit 1 fi fi + ${lib.optionalString (!isRias) '' + if [ -z "''${DRY_RUN_CMD:-}" ] && [ ! -e "$special_migration" ]; then + prefs_tmp=$(${pkgs.coreutils}/bin/mktemp "$target/lucidprefs/prefs.json.XXXXXX") + if ${pkgs.jq}/bin/jq -f ${mergeSpecialPrefs} "$target/lucidprefs/prefs.json" > "$prefs_tmp"; then + chmod 644 "$prefs_tmp" + mv "$prefs_tmp" "$target/lucidprefs/prefs.json" + touch "$special_migration" + else + rm -f "$prefs_tmp" + echo "Could not merge Lucid special workspace settings" >&2 + exit 1 + fi + fi + ''} if [ ! -e "$target/luciddocks/pinned.json" ]; then $DRY_RUN_CMD install -m644 ${./lucid-pinned.json} "$target/luciddocks/pinned.json" fi - if [ "${if isChest then "false" else "true"}" = true ] && [ ! -e "$target/lucidwidgets/widgets.json" ]; then + if [ ! -e "$target/lucidwidgets/widgets.json" ]; then $DRY_RUN_CMD install -m644 ${widgetLayout} "$target/lucidwidgets/widgets.json" fi @@ -503,14 +742,37 @@ in { wayland.windowManager.hyprland = { settings = { on = [ (hyprLua.onStart [ "systemctl --user start lucid.service" ]) ]; - bind = lib.mkIf isRias (lib.mkForce []); + bind = lib.mkIf (isRias || isChest) (lib.mkForce []); + window_rule = lib.mkIf isChest [ + { + name = "float-lucid-settings"; + match = { class = "org.quickshell"; title = "Lucid Settings"; }; + float = true; + size = [ 1180 800 ]; + center = true; + } + { + name = "float-lucid-choosers"; + match = { + class = "^(org\\.gnome\\.Nautilus|xdg-desktop-portal-gtk|xdg-desktop-portal-gnome|zenity|org\\.kde\\.kdialog|kdialog)$"; + title = "^(Choose an account picture|Choose a template|Choose a colour scheme|Export the palette|Save received files to|Send files|Send to .+)$"; + }; + float = true; + center = true; + } + ]; }; # Home Manager autoloads these before its generated settings. Lucid's # stateful UI modules are installed too, then required after the Nix base # config below so saved UI choices take effect without losing that base. - extraLuaFiles = lib.mkIf isRias { - "modules/binds.lua" = builtins.toPath "${source}/support/hypr/modules/binds.lua"; + extraLuaFiles = { + "modules/binds.lua" = builtins.toPath (if isRias then "${source}/support/hypr/modules/binds.lua" else if isChest then "${chestBinds}" else "${nonRiasBinds}"); "modules/json.lua" = builtins.toPath "${source}/support/hypr/modules/json.lua"; + "modules/specials.lua" = { + content = builtins.toPath "${source}/support/hypr/modules/specials.lua"; + autoLoad = false; + }; + } // lib.optionalAttrs isRias { "modules/decorations.lua" = builtins.toPath "${source}/support/hypr/modules/decorations.lua"; "modules/gestures.lua" = builtins.toPath "${source}/support/hypr/modules/gestures.lua"; "modules/input.lua" = builtins.toPath "${source}/support/hypr/modules/input.lua"; @@ -520,22 +782,21 @@ in { "modules/misc.lua" = builtins.toPath "${source}/support/hypr/modules/misc.lua"; "modules/plugins.lua" = builtins.toPath "${source}/support/hypr/modules/plugins.lua"; "modules/windowrules.lua" = builtins.toPath "${source}/support/hypr/modules/windowrules.lua"; + } // lib.optionalAttrs isChest { + "modules/decorations.lua" = builtins.toPath "${chestBorders}"; + } // lib.optionalAttrs (isRias || isChest) { "modules/glass.lua" = { content = builtins.toPath "${source}/support/hypr/modules/glass.lua"; autoLoad = false; }; "modules/monitors.lua" = { - content = builtins.toPath "${source}/support/hypr/modules/monitors.lua"; + content = builtins.toPath (if isChest then "${chestMonitors}" else "${source}/support/hypr/modules/monitors.lua"); autoLoad = false; }; "modules/settings.lua" = { content = builtins.toPath "${source}/support/hypr/modules/settings.lua"; autoLoad = false; }; - "modules/specials.lua" = { - content = builtins.toPath "${source}/support/hypr/modules/specials.lua"; - autoLoad = false; - }; "modules/startup.lua" = { content = builtins.toPath "${source}/support/hypr/modules/startup.lua"; autoLoad = false; @@ -543,11 +804,14 @@ in { }; # Nix owns session startup and environment exports; don't load Lucid's # generic autostart/env defaults on top of the existing host setup. - extraConfig = lib.mkIf isRias '' + extraConfig = '' local config_home = os.getenv("XDG_CONFIG_HOME") or ${builtins.toJSON config.xdg.configHome} package.path = config_home .. "/hypr/?.lua;" .. config_home .. "/hypr/?/init.lua;" .. package.path require("modules.specials") + LucidSpecials.apply() + '' + lib.optionalString (isRias || isChest) '' require("modules.monitors") + '' + lib.optionalString isRias '' local lucid_monitor_apply = LucidMonitors.apply LucidMonitors.apply = function(...) lucid_monitor_apply(...) @@ -560,6 +824,7 @@ in { for _, workspace in ipairs({ "3", "4", "5", "6" }) do hl.workspace_rule({ workspace = workspace, persistent = false }) end + '' + lib.optionalString (isRias || isChest) '' require("modules.settings") require("modules.glass") require("modules.startup") diff --git a/modules/user/lucid/lucid-shell.qml b/modules/user/lucid/lucid-shell.qml index f05bb7b..aed1e70 100644 --- a/modules/user/lucid/lucid-shell.qml +++ b/modules/user/lucid/lucid-shell.qml @@ -13,6 +13,7 @@ ShellRoot { id: root Component.onCompleted: { + void Specials.moduleProbed; void Clip.probed; void Capture.state; } diff --git a/modules/user/walker.nix b/modules/user/walker.nix index fdccbd9..6b22f20 100644 --- a/modules/user/walker.nix +++ b/modules/user/walker.nix @@ -188,7 +188,7 @@ in { ''; }; - wayland.windowManager.hyprland.settings.bind = [ + lucidHyprlandBinds = [ (hyprLua.bind "SUPER + D" (hyprLua.execLauncher "qs ipc call launcher toggle")) ]; } diff --git a/user/chest/modules/hyprland.nix b/user/chest/modules/hyprland.nix index 239e0ee..bb834e8 100644 --- a/user/chest/modules/hyprland.nix +++ b/user/chest/modules/hyprland.nix @@ -71,9 +71,9 @@ in { { leaf = "fade"; enabled = true; speed = 7; bezier = "default"; } { leaf = "workspaces"; enabled = true; speed = 6; bezier = "default"; } ]; - - bind = [ - (hyprLua.bind "SUPER + SHIFT + S" (hyprLua.exec ''${lib.getExe pkgs.grim} -g "$(${lib.getExe pkgs.slurp})" - | ${lib.getExe pkgs.swappy} -f -'')) - ]; }; + + lucidHyprlandBinds = [ + (hyprLua.bind "SUPER + SHIFT + S" (hyprLua.exec ''${lib.getExe pkgs.grim} -g "$(${lib.getExe pkgs.slurp})" - | ${lib.getExe pkgs.swappy} -f -'')) + ]; }