# Canonical keybind list — the single source of truth for BOTH the
# Hyprland `bind` strings (hyprland.nix) and the SUPER+? cheatsheet
# rendered by nomarchy-menu (rofi.nix). One place, no second renderer to
# keep in sync — the same rule the theme pipeline follows.
#
#   mods   — modifier string, Hyprland syntax ("$mod", "$mod SHIFT", "")
#   key    — the key name
#   action — the Hyprland dispatcher (+args) that the bind runs
#   desc   — human label, shown in the cheatsheet
#
# `extra` holds cheatsheet-only rows for binds generated elsewhere
# (per-workspace numbers, mouse drags) so they still show up under SUPER+?.
{
  binds = [
    { mods = "$mod";        key = "Return"; action = "exec, $terminal";              desc = "Open terminal"; }
    { mods = "$mod";        key = "Space";  action = "exec, rofi -show drun -theme launcher"; desc = "Quick launch (apps)"; }
    { mods = "$mod";        key = "D";      action = "exec, rofi -show drun -theme launcher"; desc = "App launcher"; }
    { mods = "$mod";        key = "M";      action = "exec, nomarchy-menu";           desc = "Main menu"; }
    { mods = "$mod";        key = "E";      action = "exec, $terminal -e yazi";       desc = "File manager (yazi)"; }
    { mods = "$mod";        key = "Q";      action = "killactive";                    desc = "Close window"; }
    { mods = "$mod";        key = "F";      action = "fullscreen";                    desc = "Fullscreen"; }
    { mods = "$mod";        key = "V";      action = "togglefloating";                desc = "Toggle floating"; }
    { mods = "$mod SHIFT";  key = "E";      action = "exit";                          desc = "Exit Hyprland"; }

    # Theme picker (menu dispatcher): apply writes the state and runs
    # home-manager switch (progress via notify-send).
    { mods = "$mod";        key = "T";      action = "exec, nomarchy-menu theme";     desc = "Theme picker"; }
    # Cycle the current theme's wallpapers (instant, no rebuild).
    { mods = "$mod SHIFT";  key = "T";      action = "exec, nomarchy-theme-sync bg next"; desc = "Next wallpaper"; }

    # Power menu via the dispatcher. Not Escape: Super+Escape gets
    # swallowed before reaching the dispatcher on some setups.
    { mods = "$mod";        key = "X";      action = "exec, nomarchy-menu power";     desc = "Power menu"; }

    { mods = "$mod";        key = "N";      action = "exec, swaync-client -t";        desc = "Notification centre"; }
    # SUPER+? — ? is Shift+/. SHIFT stays in the modmask (you hold it), but
    # the keysym must be the BASE key `slash`, not `question`: Hyprland
    # resolves the sym with Shift consumed, so `question` never matches while
    # Shift is down — same as the `$mod SHIFT, 1` workspace binds. (item 26
    # fixed the modmask but kept the shifted keysym → still dead; item 32.)
    # The cheatsheet still renders this row as SUPER + ? (rofi.nix).
    { mods = "$mod SHIFT";  key = "slash";  action = "exec, nomarchy-menu keybinds"; desc = "Keybindings cheatsheet"; }

    # Menu functions — SUPER+CTRL+<mnemonic> jumps straight to a
    # nomarchy-menu module (all also reachable from the SUPER+M picker).
    { mods = "$mod CTRL";   key = "V";      action = "exec, nomarchy-menu clipboard"; desc = "Clipboard history"; }
    { mods = "$mod CTRL";   key = "C";      action = "exec, nomarchy-menu calc";      desc = "Calculator"; }
    { mods = "$mod CTRL";   key = "W";      action = "exec, nomarchy-menu web";       desc = "Web search"; }
    { mods = "$mod CTRL";   key = "F";      action = "exec, nomarchy-menu files";     desc = "File search"; }
    { mods = "$mod CTRL";   key = "E";      action = "exec, nomarchy-menu emoji";     desc = "Emoji picker"; }
    { mods = "$mod CTRL";   key = "N";      action = "exec, nomarchy-menu network";   desc = "Network (networkmanager_dmenu)"; }
    { mods = "$mod CTRL";   key = "B";      action = "exec, nomarchy-menu bluetooth"; desc = "Bluetooth"; }
    { mods = "$mod CTRL";   key = "S";      action = "exec, nomarchy-menu capture";   desc = "Screenshot / capture"; }
    { mods = "$mod CTRL";   key = "P";      action = "exec, nomarchy-menu colorpicker"; desc = "Color picker (→ clipboard)"; }
    { mods = "$mod CTRL";   key = "A";      action = "exec, nomarchy-menu ask";       desc = "Ask Claude"; }
    { mods = "$mod CTRL";   key = "D";      action = "exec, nomarchy-menu dnd";       desc = "Do Not Disturb toggle"; }
    { mods = "$mod SHIFT";  key = "C";      action = "exec, hyprpicker -a";           desc = "Color picker (→ clipboard)"; }

    # Focus — SUPER + arrow keys.
    { mods = "$mod";        key = "left";   action = "movefocus, l";                  desc = "Focus left"; }
    { mods = "$mod";        key = "right";  action = "movefocus, r";                  desc = "Focus right"; }
    { mods = "$mod";        key = "up";     action = "movefocus, u";                  desc = "Focus up"; }
    { mods = "$mod";        key = "down";   action = "movefocus, d";                  desc = "Focus down"; }

    # Multi-monitor workspace movement — SUPER + ALT + arrow keys.
    { mods = "$mod ALT";    key = "left";   action = "movecurrentworkspacetomonitor, l"; desc = "Move workspace to left monitor"; }
    { mods = "$mod ALT";    key = "right";  action = "movecurrentworkspacetomonitor, r"; desc = "Move workspace to right monitor"; }
    { mods = "$mod ALT";    key = "up";     action = "movecurrentworkspacetomonitor, u"; desc = "Move workspace to upper monitor"; }
    { mods = "$mod ALT";    key = "down";   action = "movecurrentworkspacetomonitor, d"; desc = "Move workspace to lower monitor"; }

    # Screenshots (the menu's Capture module has the rest: OCR, recording).
    # Bare Print → region to clipboard; the two → file binds save a
    # timestamped PNG under ~/Pictures/Screenshots and toast the path, the
    # same plumbing the Capture menu's "→ file" rows use.
    { mods = "";            key = "Print";  action = "exec, grim -g \"$(slurp)\" - | wl-copy"; desc = "Screenshot region → clipboard"; }
    { mods = "SHIFT";       key = "Print";  action = "exec, f=$HOME/Pictures/Screenshots/$(date +%Y%m%d-%H%M%S).png; mkdir -p $HOME/Pictures/Screenshots && grim -g \"$(slurp)\" \"$f\" && notify-send \"Screenshot saved\" \"$f\""; desc = "Screenshot region → file"; }
    { mods = "CTRL";        key = "Print";  action = "exec, f=$HOME/Pictures/Screenshots/$(date +%Y%m%d-%H%M%S).png; mkdir -p $HOME/Pictures/Screenshots && grim \"$f\" && notify-send \"Screenshot saved\" \"$f\""; desc = "Screenshot screen → file"; }
    { mods = "$mod SHIFT";  key = "Print";  action = "exec, f=$HOME/Pictures/Screenshots/$(date +%Y%m%d-%H%M%S).png; mkdir -p $HOME/Pictures/Screenshots && grim -g \"$(slurp)\" - | satty --filename - --fullscreen --output-filename \"$f\""; desc = "Annotate region"; }
  ];

  # Rendered only when the session has >1 layout (a comma in
  # nomarchy.keyboard.layout) — hyprland.nix and rofi.nix both gate on
  # that same condition, so the bind and its cheatsheet row stay in
  # step. `current` targets the focused keyboard, so a board with its
  # own per-device layout (a single one) is a no-op, never a leak.
  multiLayoutBinds = [
    { mods = "$mod SHIFT";  key = "K";      action = "exec, hyprctl switchxkblayout current next"; desc = "Cycle keyboard layout"; }
  ];

  extra = [
    { keys = "SUPER + 1-9";          desc = "Switch to workspace 1-9"; }
    { keys = "SUPER + SHIFT + 1-9";  desc = "Move window to workspace 1-9"; }
    { keys = "SUPER + drag";         desc = "Move (LMB) / resize (RMB) window"; }
    { keys = "Volume / Brightness";  desc = "Hardware keys, shown via the OSD"; }
    { keys = "Bar: 󰾪 click";         desc = "Caffeine — hold the screen awake (idle inhibitor)"; }
  ];
}
