{"record":{"id":"40d9aa0bbe0942df","repo":"kovidgoyal/kitty","slug":"first-is-not-a-valid-pointer-shape-name","errorCode":null,"errorMessage":"{first} is not a valid pointer shape name","messagePattern":"(.+?) is not a valid pointer shape name","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"kitty/options/utils.py","lineNumber":1844,"sourceCode":"    'nesw-resize',\n    'nwse-resize',\n    'zoom-in',\n    'zoom-out',\n    'alias',\n    'copy',\n    'not-allowed',\n    'no-drop',\n    'grab',\n    'grabbing',\n    # end pointer shape names\n)\n\n\ndef pointer_shape_when_dragging(spec: str) -> tuple[str, str]:\n    parts = spec.split(maxsplit=1)\n    first = parts[0]\n    if first not in pointer_shape_names:\n        raise ValueError(f'{first} is not a valid pointer shape name')\n    second = parts[1] if len(parts) > 1 else first\n    if second not in pointer_shape_names:\n        raise ValueError(f'{second} is not a valid pointer shape name')\n    return first, second\n\n\ndef transparent_background_colors(spec: str) -> tuple[tuple[Color, float], ...]:\n    if not spec:\n        return ()\n    ans: list[tuple[Color, float]] = []\n    seen: dict[Color, int] = {}\n    for part in spec.split():\n        col, sep, alpha = part.partition('@')\n        c = to_color(col)\n        o = max(-1, min(float(alpha) if alpha else -1, 1))\n        if (idx := seen.get(c)) is not None:\n            ans[idx] = c, o\n            continue","sourceCodeStart":1826,"sourceCodeEnd":1862,"githubUrl":"https://github.com/kovidgoyal/kitty/blob/6d5d0c440603ad9bdf6dcd599f73f6dde21acb44/kitty/options/utils.py#L1826-L1862","documentation":"pointer_shape_when_dragging takes one or two pointer shape names from pointer_shape_names (e.g. default, text, pointer, grab...). The first token is validated here and rejected if unknown.","triggerScenarios":"Setting 'pointer_shape_when_dragging arrow2' or any name not in kitty's pointer shape list; also invalid second token (same message, raised a few lines below).","commonSituations":"Guessing CSS cursor names kitty doesn't implement, typos, or using shapes added in newer kitty versions on an older build.","solutions":["Use a valid pointer shape name (see kitty docs: default, text, pointer, grab, grabbing, crosshair, etc.)","If passing two shapes, validate both tokens"],"exampleFix":"# before\npointer_shape_when_dragging arrowhead\n# after\npointer_shape_when_dragging grab","handlingStrategy":"type-guard","validationCode":"from kitty.options.utils import pointer_shape_names\ndef valid_pointer_shape(spec: str) -> bool:\n    parts = spec.split()\n    return bool(parts) and all(p in pointer_shape_names for p in parts[:2])","typeGuard":"def is_pointer_shape(name: str, allowed: frozenset[str]) -> bool:\n    return name in allowed","tryCatchPattern":null,"preventionTips":["Check pointer_shape_names for your kitty version before setting the option"],"tags":["kitty","config","pointer","enum"],"backgroundTag":"enum-value-invalid","analyzedSha":"6d5d0c440603ad9bdf6dcd599f73f6dde21acb44","analyzedAt":"2026-08-27T14:20:20.142Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}