git.lucas.co / hou-control
SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git

commit6276bc17a8a3576804098f25b86446ae397b67c4
parent5cdc475212
authorLucas Galante <[email protected]>
date2026-09-15 21:13
netcursor: colour and scale settings, cursor picture painted on demand

The network cursor's box was one of 144 static PNGs, all the same gold, and
hou.NetworkImage can only brighten a picture, not tint it. hcnetcursorimage
now paints the outline into the session temp dir the first time a size and
colour are asked for, so hcnetcursor_color is a real setting. The static
asset set is removed; background images that still name it (hips saved with
the cursor showing) are matched on basename and dropped.

hcnetcursor_scale sizes the drawn box relative to the cells it covers,
about their centre; selection and movement keep using the whole cells.

The settings panel gets a Network Cursor group holding the enable switch
(relabelled from "hcnetcursor" to "Network Cursor"), the colour and the
scale. tools/check.py paints a picture to spec and checks the caching,
the stale-path filter and the schema.

Co-Authored-By: Claude Fable 5.1 <[email protected]>

 CLAUDE.md                                       |   1 +
 config/hcnetcursor_assets/hcnetcursor_10x1.png  | Bin 1108 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x10.png | Bin 9794 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x11.png | Bin 10709 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x12.png | Bin 11671 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x2.png  | Bin 2083 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x3.png  | Bin 3058 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x4.png  | Bin 4021 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x5.png  | Bin 4984 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x6.png  | Bin 5944 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x7.png  | Bin 6907 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x8.png  | Bin 7869 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_10x9.png  | Bin 8832 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x1.png  | Bin 1221 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x10.png | Bin 10879 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x11.png | Bin 11954 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x12.png | Bin 13029 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x2.png  | Bin 2308 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x3.png  | Bin 3396 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x4.png  | Bin 4475 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x5.png  | Bin 5547 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x6.png  | Bin 6622 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x7.png  | Bin 7697 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x8.png  | Bin 8772 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_11x9.png  | Bin 9847 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x1.png  | Bin 1311 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x10.png | Bin 11763 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x11.png | Bin 12926 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x12.png | Bin 14088 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x2.png  | Bin 2486 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x3.png  | Bin 3661 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x4.png  | Bin 4832 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x5.png  | Bin 5989 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x6.png  | Bin 7152 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x7.png  | Bin 8314 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x8.png  | Bin 9477 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_12x9.png  | Bin 10601 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x1.png   | Bin 307 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x10.png  | Bin 2171 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x11.png  | Bin 2380 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x12.png  | Bin 2585 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x2.png   | Bin 513 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x3.png   | Bin 721 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x4.png   | Bin 928 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x5.png   | Bin 1136 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x6.png   | Bin 1342 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x7.png   | Bin 1551 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x8.png   | Bin 1756 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_1x9.png   | Bin 1965 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x1.png   | Bin 409 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x10.png  | Bin 3110 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x11.png  | Bin 3407 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x12.png  | Bin 3709 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x2.png   | Bin 708 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x3.png   | Bin 1009 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x4.png   | Bin 1310 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x5.png   | Bin 1608 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x6.png   | Bin 1908 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x7.png   | Bin 2209 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x8.png   | Bin 2508 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_2x9.png   | Bin 2808 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x1.png   | Bin 508 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x10.png  | Bin 4036 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x11.png  | Bin 4428 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x12.png  | Bin 4818 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x2.png   | Bin 898 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x3.png   | Bin 1293 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x4.png   | Bin 1683 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x5.png   | Bin 2076 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x6.png   | Bin 2467 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x7.png   | Bin 2860 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x8.png   | Bin 3252 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_3x9.png   | Bin 3644 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x1.png   | Bin 591 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x10.png  | Bin 4808 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x11.png  | Bin 5277 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x12.png  | Bin 5743 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x2.png   | Bin 1063 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x3.png   | Bin 1530 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x4.png   | Bin 1998 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x5.png   | Bin 2467 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x6.png   | Bin 2935 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x7.png   | Bin 3403 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x8.png   | Bin 3871 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_4x9.png   | Bin 4341 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x1.png   | Bin 668 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x10.png  | Bin 5597 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x11.png  | Bin 6153 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x12.png  | Bin 6697 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x2.png   | Bin 1224 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x3.png   | Bin 1766 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x4.png   | Bin 2319 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x5.png   | Bin 2859 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x6.png   | Bin 3412 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x7.png   | Bin 3949 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x8.png   | Bin 4505 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_5x9.png   | Bin 5048 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x1.png   | Bin 823 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x10.png  | Bin 7138 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x11.png  | Bin 7838 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x12.png  | Bin 8538 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x2.png   | Bin 1533 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x3.png   | Bin 2233 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x4.png   | Bin 2933 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x5.png   | Bin 3633 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x6.png   | Bin 4333 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x7.png   | Bin 5033 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x8.png   | Bin 5733 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_6x9.png   | Bin 6438 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x1.png   | Bin 902 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x10.png  | Bin 7895 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x11.png  | Bin 8670 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x12.png  | Bin 9445 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x2.png   | Bin 1690 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x3.png   | Bin 2466 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x4.png   | Bin 3241 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x5.png   | Bin 4016 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x6.png   | Bin 4791 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x7.png   | Bin 5566 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x8.png   | Bin 6345 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_7x9.png   | Bin 7120 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x1.png   | Bin 983 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x10.png  | Bin 8652 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x11.png  | Bin 9502 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x12.png  | Bin 10352 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x2.png   | Bin 1845 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x3.png   | Bin 2701 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x4.png   | Bin 3551 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x5.png   | Bin 4401 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x6.png   | Bin 5251 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x7.png   | Bin 6102 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x8.png   | Bin 6952 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_8x9.png   | Bin 7802 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x1.png   | Bin 1060 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x10.png  | Bin 9405 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x11.png  | Bin 10330 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x12.png  | Bin 11197 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x2.png   | Bin 1997 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x3.png   | Bin 2932 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x4.png   | Bin 3857 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x5.png   | Bin 4782 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x6.png   | Bin 5705 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x7.png   | Bin 6630 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x8.png   | Bin 7555 -> 0 bytes
 config/hcnetcursor_assets/hcnetcursor_9x9.png   | Bin 8480 -> 0 bytes
 python3.13libs/hc/hcnetcursorimage.py           |  81 ++++++++++++++++++++++++
 python3.13libs/hc/hcnetworkeditor.py            |  53 ++++++----------
 python3.13libs/hc/hcschema.py                   |  18 ++++--
 python3.13libs/hc/hcsettings.py                 |  13 ++++
 tools/check.py                                  |  67 ++++++++++++++++++++
 150 files changed, 196 insertions(+), 37 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
index 4837523..a059c14 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -46,6 +46,7 @@ Key hierarchy:
 - **`hccommands.py`** — the `@command("Label")` decorator and the registry that reads it. A command's panel label lives on the method itself. `tabs=(...)` restricts a command to certain tab `.type()` strings, needed for the few commands defined on `HCTab` that only make sense on some tabs.
 - **`HCMaps`** (`hcmaps.py`) — generated, not hand-written. `commands(session, pane, tab)` binds every `@command` reachable from those three objects, filtered by tab type. `HCSession.hcPanel()` calls it and hands the result to `SelectionDialog`.
 - **`hcstate.py`** — all per-pane and per-network state, in one place with one key scheme. Wrappers are stateless (Houdini hands out fresh SWIG wrappers per callback and holding one is a crash), so anything persisting between events goes in a `Store` here. Two scopes: `hcstate.PANE` and `hcstate.NETWORK` (`(pane id, network path)`). Entries for closed panes are swept periodically — pane ids get reused.
+- **`hcnetcursorimage.py`** — paints the network cursor's picture (a `hou.NetworkImage` outline) on demand into `$HOUDINI_TEMP_DIR/hc_hcnetcursor/`, one file per cell size and colour. Houdini cannot tint a background image, which is why the `hcnetcursor_color` setting needs a painted file; this replaced 144 static PNGs in `config/hcnetcursor_assets`, a path old hips may still carry in their background image lists (`is_cursor_image` matches on basename so they are filtered out).
 - **`hcschema.py`** — one `Setting` per configurable value: kind, default, label, range. `HCSettings.DEFAULTS` and every control in `HCSettingsPanel` are generated from it.
 - **`HCWidgets`** (`hcwidgets.py`) — PySide6 widgets, notably `SelectionDialog` used for the HC Panel.
 - **`HCSettingsPanel`** (`hcsettings.py`) — the settings form. It is a plain `QWidget`, not a dialog, because it is served as a Python Panel (see `python_panels/` below) and Houdini adopts it into a pane tab. Keep it a `QWidget`: a `QDialog` in a pane tab keeps dialog behaviour, and Houdini overwrites the `objectName` of a widget it adopts, so don't try to find it by object name.
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x1.png b/config/hcnetcursor_assets/hcnetcursor_10x1.png
deleted file mode 100644
index 80148d3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x10.png b/config/hcnetcursor_assets/hcnetcursor_10x10.png
deleted file mode 100644
index 03089ea..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x11.png b/config/hcnetcursor_assets/hcnetcursor_10x11.png
deleted file mode 100644
index 56e3407..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x12.png b/config/hcnetcursor_assets/hcnetcursor_10x12.png
deleted file mode 100644
index ad18510..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x2.png b/config/hcnetcursor_assets/hcnetcursor_10x2.png
deleted file mode 100644
index 85c257e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x3.png b/config/hcnetcursor_assets/hcnetcursor_10x3.png
deleted file mode 100644
index 0992444..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x4.png b/config/hcnetcursor_assets/hcnetcursor_10x4.png
deleted file mode 100644
index bfa9f1d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x5.png b/config/hcnetcursor_assets/hcnetcursor_10x5.png
deleted file mode 100644
index 75ab68c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x6.png b/config/hcnetcursor_assets/hcnetcursor_10x6.png
deleted file mode 100644
index 0a241da..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x7.png b/config/hcnetcursor_assets/hcnetcursor_10x7.png
deleted file mode 100644
index 14cf439..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x8.png b/config/hcnetcursor_assets/hcnetcursor_10x8.png
deleted file mode 100644
index ba0d06f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x9.png b/config/hcnetcursor_assets/hcnetcursor_10x9.png
deleted file mode 100644
index 7a506a8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x1.png b/config/hcnetcursor_assets/hcnetcursor_11x1.png
deleted file mode 100644
index 708ae0e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x10.png b/config/hcnetcursor_assets/hcnetcursor_11x10.png
deleted file mode 100644
index 28dee78..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x11.png b/config/hcnetcursor_assets/hcnetcursor_11x11.png
deleted file mode 100644
index d6ca30e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x12.png b/config/hcnetcursor_assets/hcnetcursor_11x12.png
deleted file mode 100644
index d437b06..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x2.png b/config/hcnetcursor_assets/hcnetcursor_11x2.png
deleted file mode 100644
index 38ecbeb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x3.png b/config/hcnetcursor_assets/hcnetcursor_11x3.png
deleted file mode 100644
index 0c729ea..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x4.png b/config/hcnetcursor_assets/hcnetcursor_11x4.png
deleted file mode 100644
index d15c2f4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x5.png b/config/hcnetcursor_assets/hcnetcursor_11x5.png
deleted file mode 100644
index 1bd2173..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x6.png b/config/hcnetcursor_assets/hcnetcursor_11x6.png
deleted file mode 100644
index 72d7bcf..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x7.png b/config/hcnetcursor_assets/hcnetcursor_11x7.png
deleted file mode 100644
index 523dd46..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x8.png b/config/hcnetcursor_assets/hcnetcursor_11x8.png
deleted file mode 100644
index 74c6b9a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x9.png b/config/hcnetcursor_assets/hcnetcursor_11x9.png
deleted file mode 100644
index 21ee4f9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x1.png b/config/hcnetcursor_assets/hcnetcursor_12x1.png
deleted file mode 100644
index f704803..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x10.png b/config/hcnetcursor_assets/hcnetcursor_12x10.png
deleted file mode 100644
index d632a89..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x11.png b/config/hcnetcursor_assets/hcnetcursor_12x11.png
deleted file mode 100644
index 5add66b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x12.png b/config/hcnetcursor_assets/hcnetcursor_12x12.png
deleted file mode 100644
index b29ce39..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x2.png b/config/hcnetcursor_assets/hcnetcursor_12x2.png
deleted file mode 100644
index 08868c4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x3.png b/config/hcnetcursor_assets/hcnetcursor_12x3.png
deleted file mode 100644
index 7bd9ddc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x4.png b/config/hcnetcursor_assets/hcnetcursor_12x4.png
deleted file mode 100644
index f678392..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x5.png b/config/hcnetcursor_assets/hcnetcursor_12x5.png
deleted file mode 100644
index 0b2d7d9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x6.png b/config/hcnetcursor_assets/hcnetcursor_12x6.png
deleted file mode 100644
index d621798..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x7.png b/config/hcnetcursor_assets/hcnetcursor_12x7.png
deleted file mode 100644
index 4bbcdb3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x8.png b/config/hcnetcursor_assets/hcnetcursor_12x8.png
deleted file mode 100644
index ca50fb9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x9.png b/config/hcnetcursor_assets/hcnetcursor_12x9.png
deleted file mode 100644
index 332138c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x1.png b/config/hcnetcursor_assets/hcnetcursor_1x1.png
deleted file mode 100644
index 6a90f95..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x10.png b/config/hcnetcursor_assets/hcnetcursor_1x10.png
deleted file mode 100644
index 96097dd..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x11.png b/config/hcnetcursor_assets/hcnetcursor_1x11.png
deleted file mode 100644
index bc7f7fb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x12.png b/config/hcnetcursor_assets/hcnetcursor_1x12.png
deleted file mode 100644
index be02c85..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x2.png b/config/hcnetcursor_assets/hcnetcursor_1x2.png
deleted file mode 100644
index 5c64bcc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x3.png b/config/hcnetcursor_assets/hcnetcursor_1x3.png
deleted file mode 100644
index 46e8f0b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x4.png b/config/hcnetcursor_assets/hcnetcursor_1x4.png
deleted file mode 100644
index 74ff20c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x5.png b/config/hcnetcursor_assets/hcnetcursor_1x5.png
deleted file mode 100644
index 43de33a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x6.png b/config/hcnetcursor_assets/hcnetcursor_1x6.png
deleted file mode 100644
index 827cf82..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x7.png b/config/hcnetcursor_assets/hcnetcursor_1x7.png
deleted file mode 100644
index 2358d12..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x8.png b/config/hcnetcursor_assets/hcnetcursor_1x8.png
deleted file mode 100644
index 57b4dfb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x9.png b/config/hcnetcursor_assets/hcnetcursor_1x9.png
deleted file mode 100644
index dfbe00b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x1.png b/config/hcnetcursor_assets/hcnetcursor_2x1.png
deleted file mode 100644
index 85432ca..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x10.png b/config/hcnetcursor_assets/hcnetcursor_2x10.png
deleted file mode 100644
index 9cecd47..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x11.png b/config/hcnetcursor_assets/hcnetcursor_2x11.png
deleted file mode 100644
index 77b950d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x12.png b/config/hcnetcursor_assets/hcnetcursor_2x12.png
deleted file mode 100644
index 355a9a1..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x2.png b/config/hcnetcursor_assets/hcnetcursor_2x2.png
deleted file mode 100644
index 3f92ac5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x3.png b/config/hcnetcursor_assets/hcnetcursor_2x3.png
deleted file mode 100644
index bbd4cb5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x4.png b/config/hcnetcursor_assets/hcnetcursor_2x4.png
deleted file mode 100644
index c1f23f6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x5.png b/config/hcnetcursor_assets/hcnetcursor_2x5.png
deleted file mode 100644
index 15cc0c6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x6.png b/config/hcnetcursor_assets/hcnetcursor_2x6.png
deleted file mode 100644
index 2b366b0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x7.png b/config/hcnetcursor_assets/hcnetcursor_2x7.png
deleted file mode 100644
index 54e872b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x8.png b/config/hcnetcursor_assets/hcnetcursor_2x8.png
deleted file mode 100644
index dd03913..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x9.png b/config/hcnetcursor_assets/hcnetcursor_2x9.png
deleted file mode 100644
index 9a80c36..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x1.png b/config/hcnetcursor_assets/hcnetcursor_3x1.png
deleted file mode 100644
index e981767..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x10.png b/config/hcnetcursor_assets/hcnetcursor_3x10.png
deleted file mode 100644
index fca83a8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x11.png b/config/hcnetcursor_assets/hcnetcursor_3x11.png
deleted file mode 100644
index 8b1db3d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x12.png b/config/hcnetcursor_assets/hcnetcursor_3x12.png
deleted file mode 100644
index 071fd94..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x2.png b/config/hcnetcursor_assets/hcnetcursor_3x2.png
deleted file mode 100644
index a744007..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x3.png b/config/hcnetcursor_assets/hcnetcursor_3x3.png
deleted file mode 100644
index 592ec22..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x4.png b/config/hcnetcursor_assets/hcnetcursor_3x4.png
deleted file mode 100644
index 99f91b0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x5.png b/config/hcnetcursor_assets/hcnetcursor_3x5.png
deleted file mode 100644
index a737e81..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x6.png b/config/hcnetcursor_assets/hcnetcursor_3x6.png
deleted file mode 100644
index d9af65b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x7.png b/config/hcnetcursor_assets/hcnetcursor_3x7.png
deleted file mode 100644
index 7a9e27a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x8.png b/config/hcnetcursor_assets/hcnetcursor_3x8.png
deleted file mode 100644
index 6747c57..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x9.png b/config/hcnetcursor_assets/hcnetcursor_3x9.png
deleted file mode 100644
index 41a9582..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x1.png b/config/hcnetcursor_assets/hcnetcursor_4x1.png
deleted file mode 100644
index 3335b6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x10.png b/config/hcnetcursor_assets/hcnetcursor_4x10.png
deleted file mode 100644
index a98931d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x11.png b/config/hcnetcursor_assets/hcnetcursor_4x11.png
deleted file mode 100644
index 6a5bc79..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x12.png b/config/hcnetcursor_assets/hcnetcursor_4x12.png
deleted file mode 100644
index 0f3cf02..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x2.png b/config/hcnetcursor_assets/hcnetcursor_4x2.png
deleted file mode 100644
index f9b086f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x3.png b/config/hcnetcursor_assets/hcnetcursor_4x3.png
deleted file mode 100644
index 7d4723f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x4.png b/config/hcnetcursor_assets/hcnetcursor_4x4.png
deleted file mode 100644
index 8731417..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x5.png b/config/hcnetcursor_assets/hcnetcursor_4x5.png
deleted file mode 100644
index 61f923d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x6.png b/config/hcnetcursor_assets/hcnetcursor_4x6.png
deleted file mode 100644
index 2989737..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x7.png b/config/hcnetcursor_assets/hcnetcursor_4x7.png
deleted file mode 100644
index 022ef2e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x8.png b/config/hcnetcursor_assets/hcnetcursor_4x8.png
deleted file mode 100644
index 20585a6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x9.png b/config/hcnetcursor_assets/hcnetcursor_4x9.png
deleted file mode 100644
index f6bd879..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x1.png b/config/hcnetcursor_assets/hcnetcursor_5x1.png
deleted file mode 100644
index f71014e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x10.png b/config/hcnetcursor_assets/hcnetcursor_5x10.png
deleted file mode 100644
index 0aa7910..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x11.png b/config/hcnetcursor_assets/hcnetcursor_5x11.png
deleted file mode 100644
index a2cbb3d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x12.png b/config/hcnetcursor_assets/hcnetcursor_5x12.png
deleted file mode 100644
index ddda85e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x2.png b/config/hcnetcursor_assets/hcnetcursor_5x2.png
deleted file mode 100644
index 7de2a1f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x3.png b/config/hcnetcursor_assets/hcnetcursor_5x3.png
deleted file mode 100644
index 6308826..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x4.png b/config/hcnetcursor_assets/hcnetcursor_5x4.png
deleted file mode 100644
index 96b90f0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x5.png b/config/hcnetcursor_assets/hcnetcursor_5x5.png
deleted file mode 100644
index dbffaa4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x6.png b/config/hcnetcursor_assets/hcnetcursor_5x6.png
deleted file mode 100644
index 04de009..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x7.png b/config/hcnetcursor_assets/hcnetcursor_5x7.png
deleted file mode 100644
index 3c0bbc2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x8.png b/config/hcnetcursor_assets/hcnetcursor_5x8.png
deleted file mode 100644
index f05354b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x9.png b/config/hcnetcursor_assets/hcnetcursor_5x9.png
deleted file mode 100644
index 44891b2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x1.png b/config/hcnetcursor_assets/hcnetcursor_6x1.png
deleted file mode 100644
index 85313ee..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x10.png b/config/hcnetcursor_assets/hcnetcursor_6x10.png
deleted file mode 100644
index 6f1790c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x11.png b/config/hcnetcursor_assets/hcnetcursor_6x11.png
deleted file mode 100644
index 38756c9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x12.png b/config/hcnetcursor_assets/hcnetcursor_6x12.png
deleted file mode 100644
index 808905d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x2.png b/config/hcnetcursor_assets/hcnetcursor_6x2.png
deleted file mode 100644
index 1929584..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x3.png b/config/hcnetcursor_assets/hcnetcursor_6x3.png
deleted file mode 100644
index 5bea3c7..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x4.png b/config/hcnetcursor_assets/hcnetcursor_6x4.png
deleted file mode 100644
index 6cda597..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x5.png b/config/hcnetcursor_assets/hcnetcursor_6x5.png
deleted file mode 100644
index ec82922..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x6.png b/config/hcnetcursor_assets/hcnetcursor_6x6.png
deleted file mode 100644
index a88c7dd..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x7.png b/config/hcnetcursor_assets/hcnetcursor_6x7.png
deleted file mode 100644
index 85e5777..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x8.png b/config/hcnetcursor_assets/hcnetcursor_6x8.png
deleted file mode 100644
index a276f84..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x9.png b/config/hcnetcursor_assets/hcnetcursor_6x9.png
deleted file mode 100644
index b5594fe..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x1.png b/config/hcnetcursor_assets/hcnetcursor_7x1.png
deleted file mode 100644
index 2b45822..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x10.png b/config/hcnetcursor_assets/hcnetcursor_7x10.png
deleted file mode 100644
index d32ca6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x11.png b/config/hcnetcursor_assets/hcnetcursor_7x11.png
deleted file mode 100644
index f7a91d3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x12.png b/config/hcnetcursor_assets/hcnetcursor_7x12.png
deleted file mode 100644
index e5d1364..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x2.png b/config/hcnetcursor_assets/hcnetcursor_7x2.png
deleted file mode 100644
index 4467645..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x3.png b/config/hcnetcursor_assets/hcnetcursor_7x3.png
deleted file mode 100644
index 07fa672..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x4.png b/config/hcnetcursor_assets/hcnetcursor_7x4.png
deleted file mode 100644
index e531370..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x5.png b/config/hcnetcursor_assets/hcnetcursor_7x5.png
deleted file mode 100644
index b6c6c81..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x6.png b/config/hcnetcursor_assets/hcnetcursor_7x6.png
deleted file mode 100644
index faa1ff4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x7.png b/config/hcnetcursor_assets/hcnetcursor_7x7.png
deleted file mode 100644
index a8edcb5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x8.png b/config/hcnetcursor_assets/hcnetcursor_7x8.png
deleted file mode 100644
index 73fb9d4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x9.png b/config/hcnetcursor_assets/hcnetcursor_7x9.png
deleted file mode 100644
index bcb3c1e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x1.png b/config/hcnetcursor_assets/hcnetcursor_8x1.png
deleted file mode 100644
index 1a9bd78..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x10.png b/config/hcnetcursor_assets/hcnetcursor_8x10.png
deleted file mode 100644
index f292faf..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x11.png b/config/hcnetcursor_assets/hcnetcursor_8x11.png
deleted file mode 100644
index 9f52977..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x12.png b/config/hcnetcursor_assets/hcnetcursor_8x12.png
deleted file mode 100644
index 5783df3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x2.png b/config/hcnetcursor_assets/hcnetcursor_8x2.png
deleted file mode 100644
index 8983603..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x3.png b/config/hcnetcursor_assets/hcnetcursor_8x3.png
deleted file mode 100644
index 268d08c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x4.png b/config/hcnetcursor_assets/hcnetcursor_8x4.png
deleted file mode 100644
index 20ce809..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x5.png b/config/hcnetcursor_assets/hcnetcursor_8x5.png
deleted file mode 100644
index 5816095..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x6.png b/config/hcnetcursor_assets/hcnetcursor_8x6.png
deleted file mode 100644
index 6b1184e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x7.png b/config/hcnetcursor_assets/hcnetcursor_8x7.png
deleted file mode 100644
index 03eb669..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x8.png b/config/hcnetcursor_assets/hcnetcursor_8x8.png
deleted file mode 100644
index 2042f43..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x9.png b/config/hcnetcursor_assets/hcnetcursor_8x9.png
deleted file mode 100644
index 23cf7b8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x1.png b/config/hcnetcursor_assets/hcnetcursor_9x1.png
deleted file mode 100644
index 92ce1e5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x10.png b/config/hcnetcursor_assets/hcnetcursor_9x10.png
deleted file mode 100644
index 0825986..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x11.png b/config/hcnetcursor_assets/hcnetcursor_9x11.png
deleted file mode 100644
index 7f00afc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x12.png b/config/hcnetcursor_assets/hcnetcursor_9x12.png
deleted file mode 100644
index f16bd0a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x2.png b/config/hcnetcursor_assets/hcnetcursor_9x2.png
deleted file mode 100644
index 3c0831a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x3.png b/config/hcnetcursor_assets/hcnetcursor_9x3.png
deleted file mode 100644
index 0c5b766..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x4.png b/config/hcnetcursor_assets/hcnetcursor_9x4.png
deleted file mode 100644
index b765d6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x5.png b/config/hcnetcursor_assets/hcnetcursor_9x5.png
deleted file mode 100644
index a3e2537..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x6.png b/config/hcnetcursor_assets/hcnetcursor_9x6.png
deleted file mode 100644
index 0cb5cd2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x7.png b/config/hcnetcursor_assets/hcnetcursor_9x7.png
deleted file mode 100644
index 4b89cd7..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x8.png b/config/hcnetcursor_assets/hcnetcursor_9x8.png
deleted file mode 100644
index 7d4b75d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x9.png b/config/hcnetcursor_assets/hcnetcursor_9x9.png
deleted file mode 100644
index 0462859..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x9.png and /dev/null differ
diff --git a/python3.13libs/hc/hcnetcursorimage.py b/python3.13libs/hc/hcnetcursorimage.py
new file mode 100644
index 0000000..5419fef
--- /dev/null
+++ b/python3.13libs/hc/hcnetcursorimage.py
@@ -0,0 +1,81 @@
+"""The network cursor's picture, drawn on demand.
+
+The cursor is a hou.NetworkImage stretched over the cells it covers. Houdini
+can only brighten a background image, not tint it, so a configurable colour
+means a differently coloured file. This used to be 144 static PNGs in
+config/hcnetcursor_assets, one per cell size, all the same gold; now the
+picture is painted the first time a (cells, colour) pair is asked for and
+cached in the session's temp dir.
+
+The look is the old asset set's: CELL_PIXELS per grid cell, transparent
+inside, a BORDER-pixel outline. The outline is a fixed pixel width in the
+image, and the image is stretched over the rect, so on screen it stays the
+same fraction of a cell whatever the cursor's size.
+"""
+
+import os
+import tempfile
+
+import hou
+
+CELL_PIXELS = (200, 100)   # image pixels per grid cell, x and y
+BORDER = 5                 # outline width, in image pixels
+MAX_CELLS = 12             # the old asset set stopped here; larger cursors reuse it
+
+_generated = {}
+
+
+def cache_dir():
+    base = hou.getenv("HOUDINI_TEMP_DIR") or tempfile.gettempdir()
+    return os.path.join(base, "hc_hcnetcursor")
+
+
+def is_cursor_image(path):
+    """Whether a background image path is one of ours, from any session.
+
+    Matched on the basename only: a hip saved with the cursor showing keeps
+    the image in the network's background list, and the directory in that
+    path may be an old temp dir or the retired config/hcnetcursor_assets.
+    """
+    return os.path.basename(path).startswith("hcnetcursor_")
+
+
+def image_file(width_cells, height_cells, color_hex):
+    """Path of the cursor picture for this many cells in this colour."""
+    width_cells = max(1, min(int(width_cells), MAX_CELLS))
+    height_cells = max(1, min(int(height_cells), MAX_CELLS))
+    color_hex = color_hex.lstrip("#").lower()
+    path = os.path.join(cache_dir(),
+                        f"hcnetcursor_{width_cells}x{height_cells}_{color_hex}.png")
+    # Asked on every network editor event; paint once per session.
+    if _generated.get(path) or os.path.exists(path):
+        _generated[path] = True
+        return path
+    paint(path, width_cells, height_cells, "#" + color_hex)
+    _generated[path] = True
+    return path
+
+
+def paint(path, width_cells, height_cells, color_hex):
+    from PySide6.QtCore import Qt
+    from PySide6.QtGui import QColor, QImage, QPainter, QPen
+
+    width = CELL_PIXELS[0] * width_cells
+    height = CELL_PIXELS[1] * height_cells
+    image = QImage(width, height, QImage.Format_ARGB32)
+    image.fill(Qt.transparent)
+    painter = QPainter(image)
+    pen = QPen(QColor(color_hex), BORDER)
+    pen.setJoinStyle(Qt.MiterJoin)
+    painter.setPen(pen)
+    painter.setBrush(Qt.NoBrush)
+    # A pen is centred on the path; inset by half so the outline sits fully
+    # inside the image, as the old assets did.
+    half = BORDER / 2.0
+    painter.drawRect(half, half, width - BORDER, height - BORDER)
+    painter.end()
+
+    os.makedirs(os.path.dirname(path), exist_ok=True)
+    if not image.save(path):
+        raise RuntimeError(f"could not write cursor image {path}")
+    return path
diff --git a/python3.13libs/hc/hcnetworkeditor.py b/python3.13libs/hc/hcnetworkeditor.py
index 4d367bd..ce11003 100644
--- a/python3.13libs/hc/hcnetworkeditor.py
+++ b/python3.13libs/hc/hcnetworkeditor.py
@@ -1,5 +1,5 @@
 import hou, math, os, types
-from . import hcstate
+from . import hcnetcursorimage, hcstate
 from .hcpathtab import HCPathTab
 from .hcsettings import HCSettings
 from .hccommands import command
@@ -12,8 +12,6 @@ _overlays = hcstate.Store("hcnetcursor_overlay", hcstate.NETWORK)
 _grid_prefs = hcstate.Store("grid_pref_sync", hcstate.PANE)
 # Per-pane: the snapping prefs last written (see _syncSnapPrefs).
 _snap_prefs = hcstate.Store("snap_pref_sync", hcstate.PANE)
-# Not per-tab at all: hcnetcursor_NxN.png presence, resolved once per path.
-_cursor_asset_exists = {}
 
 # The network editor's `gridmode` pref, labelled as Houdini's own Show Grid
 # radio in NetworkViewMenu.xml labels it.
@@ -443,12 +441,6 @@ class HCNetworkEditor(HCPathTab):
     def _hcnetcursorOverlayShapes(self):
         return []
 
-    def _hcnetcursorImagePath(self):
-        hc_path = hou.getenv("HC_PATH")
-        if not hc_path:
-            hc_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
-        return os.path.join(hc_path, "config", "hcnetcursor_assets")
-
     def _hcnetcursorCellSize(self):
         state = self._hcnetcursorState()
         width_cells = 1 + abs(int(state.get("grow_x", 0)))
@@ -456,32 +448,27 @@ class HCNetworkEditor(HCPathTab):
         return width_cells, height_cells
 
     def _hcnetcursorImageFile(self):
-        asset_dir = self._hcnetcursorImagePath()
         width_cells, height_cells = self._hcnetcursorCellSize()
-        width_cells = min(width_cells, 12)
-        height_cells = min(height_cells, 12)
-        candidate = os.path.join(
-            asset_dir,
-            f"hcnetcursor_{width_cells}x{height_cells}.png",
-        )
-        # Runs per UI event; the asset set does not change while Houdini is up.
-        exists = _cursor_asset_exists.get(candidate)
-        if exists is None:
-            exists = os.path.exists(candidate)
-            _cursor_asset_exists[candidate] = exists
-        if exists:
-            return candidate
-
-        return os.path.join(asset_dir, "hcnetcursor_1x1.png")
+        return hcnetcursorimage.image_file(
+            width_cells, height_cells, HCSettings().hcnetcursorColorHex())
+
+    def _hcnetcursorDrawRect(self, rect):
+        """The rect the picture is stretched over: the cursor's cells, scaled
+        about their centre by the hcnetcursor_scale setting. Selection and
+        movement keep using the unscaled cells."""
+        scale = HCSettings().hcnetcursorScale()
+        if scale == 1.0:
+            return rect
+        center = rect.center()
+        size = rect.size()
+        half_w = size[0] * scale * 0.5
+        half_h = size[1] * scale * 0.5
+        return hou.BoundingRect(center[0] - half_w, center[1] - half_h,
+                                center[0] + half_w, center[1] + half_h)
 
     def _backgroundImagesWithoutHcnetcursor(self):
-        asset_dir = self._hcnetcursorImagePath()
-        images = []
-        for image in self.hou_tab.backgroundImages():
-            path = image.path()
-            if not (path.startswith(asset_dir) and os.path.basename(path).startswith("hcnetcursor_")):
-                images.append(image)
-        return images
+        return [image for image in self.hou_tab.backgroundImages()
+                if not hcnetcursorimage.is_cursor_image(image.path())]
 
     def _updateHcnetcursorBackground(self, rect, cursor_path):
         images = self._backgroundImagesWithoutHcnetcursor()
@@ -530,7 +517,7 @@ class HCNetworkEditor(HCPathTab):
         the work when the resulting picture would be identical.
         """
         enabled = HCSettings().hcnetcursorEnabled()
-        rect = self.hcnetcursorRect() if enabled else None
+        rect = self._hcnetcursorDrawRect(self.hcnetcursorRect()) if enabled else None
         cursor_path = self._hcnetcursorImageFile() if enabled else None
 
         signature = self._overlaySignature(rect, cursor_path)
diff --git a/python3.13libs/hc/hcschema.py b/python3.13libs/hc/hcschema.py
index 045d1ea..85bee79 100644
--- a/python3.13libs/hc/hcschema.py
+++ b/python3.13libs/hc/hcschema.py
@@ -136,14 +136,24 @@ SCHEMA = {
         "node_color":  Setting("color", "#607070", group="Nodes"),
         "zoom_center": Setting("choice", "mouse_cursor", choices=ZOOM_CENTERS,
                                group="Navigation"),
+        "current_node_arrow_color": Setting(
+            "color", "#618f8f", label="Current Node Arrow Color", group="Navigation",
+            help="The off-screen current-node arrow drawn over the network editor.",
+        ),
         "hcnetcursor": Setting(
-            "bool", True, label="hcnetcursor", group="Navigation",
+            "bool", True, label="Network Cursor", group="Network Cursor",
             help="The grid cursor in the network editor. Off also returns the "
                  "unmodified f key to Houdini's own frame-selection.",
         ),
-        "current_node_arrow_color": Setting(
-            "color", "#618f8f", label="Current Node Arrow Color", group="Navigation",
-            help="The off-screen current-node arrow drawn over the network editor.",
+        "hcnetcursor_color": Setting(
+            "color", "#d8b34b", label="Cursor Color", group="Network Cursor",
+            help="The cursor's outline. The picture is painted on demand, so "
+                 "a change shows on the next network editor event.",
+        ),
+        "hcnetcursor_scale": Setting(
+            "slider", 1.0, range=(0.25, 2.0), label="Cursor Scale", group="Network Cursor",
+            help="Size of the drawn box relative to the grid cells it covers. "
+                 "Selection and movement always use the whole cells.",
         ),
         "grid_snap": Setting(
             "bool", True, label="Hard Grid Snap", group="Grid",
diff --git a/python3.13libs/hc/hcsettings.py b/python3.13libs/hc/hcsettings.py
index 5354730..a40a173 100644
--- a/python3.13libs/hc/hcsettings.py
+++ b/python3.13libs/hc/hcsettings.py
@@ -220,6 +220,19 @@ class HCSettings:
     def hcnetcursorEnabled(self):
         return bool(self.nodeGraph().get("hcnetcursor"))
 
+    def hcnetcursorColorHex(self):
+        return self.colorHex("node_graph", "hcnetcursor_color")
+
+    def hcnetcursorScale(self):
+        """Size of the drawn cursor box relative to the cells it covers."""
+        setting = hcschema.lookup(("node_graph", "hcnetcursor_scale"))
+        try:
+            scale = float(self.nodeGraph().get("hcnetcursor_scale", setting.default))
+        except (TypeError, ValueError):
+            scale = setting.default
+        low, high = setting.range
+        return min(max(scale, low), high)
+
     def dropSwapEnabled(self):
         """Dropping a node on another node's cell swaps their positions."""
         return bool(self.nodeGraph().get("drop_swap", True))
diff --git a/tools/check.py b/tools/check.py
index 7af4c1b..f278b97 100644
--- a/tools/check.py
+++ b/tools/check.py
@@ -1724,6 +1724,72 @@ def check_disable_switches():
     check("accessors", accessors_read_the_file)
 
 
+def check_cursor_image():
+    """The network cursor picture is painted on demand, in the set colour."""
+    print("network cursor image")
+    import tempfile
+    from hc import hcnetcursorimage
+
+    def painted_to_spec():
+        from PySide6.QtGui import QImage
+        with tempfile.TemporaryDirectory() as tmp:
+            path = os.path.join(tmp, "hcnetcursor_3x2_a1b2c3.png")
+            hcnetcursorimage.paint(path, 3, 2, "#a1b2c3")
+            image = QImage(path)
+            assert (image.width(), image.height()) == (600, 200), \
+                f"{image.width()}x{image.height()}"
+            edge = image.pixelColor(2, 100)
+            assert edge.name() == "#a1b2c3" and edge.alpha() == 255, \
+                f"edge {edge.name()} a={edge.alpha()}"
+            inside = image.pixelColor(300, 100)
+            assert inside.alpha() == 0, f"centre alpha {inside.alpha()}"
+            just_in = image.pixelColor(hcnetcursorimage.BORDER, 100)
+            assert just_in.alpha() == 0, "outline wider than BORDER"
+        return "600x200, 5px outline, transparent inside"
+
+    check("painted to spec", painted_to_spec)
+
+    def cached_per_colour():
+        a = hcnetcursorimage.image_file(1, 1, "#d8b34b")
+        b = hcnetcursorimage.image_file(1, 1, "#D8B34B")
+        c = hcnetcursorimage.image_file(1, 1, "#000000")
+        assert a == b, "colour case made a second file"
+        assert a != c, "different colours share a file"
+        assert os.path.exists(a) and os.path.exists(c)
+        assert hcnetcursorimage.image_file(40, 1, "#d8b34b").endswith("_12x1_d8b34b.png"), \
+            "oversize cursor not clamped"
+        return os.path.dirname(a)
+
+    check("one file per size and colour", cached_per_colour)
+
+    def old_paths_recognised():
+        """Hips saved with the cursor showing still name the retired asset dir."""
+        assert hcnetcursorimage.is_cursor_image(
+            "/x/hou-control/config/hcnetcursor_assets/hcnetcursor_2x1.png")
+        assert hcnetcursorimage.is_cursor_image(
+            hcnetcursorimage.image_file(1, 1, "#d8b34b"))
+        assert not hcnetcursorimage.is_cursor_image("/x/backdrop.png")
+        assert not (ROOT / "config" / "hcnetcursor_assets").exists(), \
+            "static asset set is still checked in"
+        return "old and new paths both filtered out"
+
+    check("stale cursor images are filtered", old_paths_recognised)
+
+    def settings_declared():
+        for key in ("hcnetcursor", "hcnetcursor_color", "hcnetcursor_scale"):
+            setting = hcschema.lookup(("node_graph", key))
+            assert setting is not None, f"{key} missing"
+            assert setting.group == "Network Cursor", f"{key} in {setting.group!r}"
+        assert hcschema.lookup(("node_graph", "hcnetcursor")).label == "Network Cursor"
+        settings = HCSettings()
+        assert settings.hcnetcursorColorHex().startswith("#")
+        low, high = hcschema.lookup(("node_graph", "hcnetcursor_scale")).range
+        assert low <= settings.hcnetcursorScale() <= high
+        return f"colour {settings.hcnetcursorColorHex()}, scale {settings.hcnetcursorScale()}"
+
+    check("cursor settings", settings_declared)
+
+
 def check_startup_script():
     """scripts/123.py reads hc_settings.json without importing hc.
 
@@ -1812,6 +1878,7 @@ def main():
     check_node_colors()
     check_current_node()
     check_disable_switches()
+    check_cursor_image()
     check_startup_script()
     print(f"\n{passed} passed, {failed} failed")
     return 1 if failed else 0