JigSawed (Win16, Entertainment Pack, VB1)

Registry id wep16_jigsawed: test/binaries/wep16/WEP2/JIGSAWED.EXE with VBRUN100.DLL, picture files BRICKS.BMP, FISH.BMP, RUG.BMP, TANKER.BMP and TREES.BMP. It is a Visual Basic 1 program, so every control is a Thunder* class with a guest wndproc. ThunderCommandButton and ThunderLabel are shadowed onto the native BUTTON and STATIC wndprocs ($win16_shadow_command_button, 09e2-win16-dialog.wat).

Headless route (test/test-win16-jigsawed.js)

node test/run.js --app=wep16_jigsawed --max-batches=1500 --quiet-blocks --input=205:dlg-click:1,\
215:click:20:31,240:click:80:52,300:click:150:150,330:click:475:180,800:png:/tmp/board.png

Window layout after loading

Fixed 2026-10-10

  1. Thunder OK did nothing (f4f937b3f). The picker form is owned by the main window, so $button_wndproc's VCL heuristic posted CN_COMMAND (0xBD11) back to the button instead of WM_COMMAND to the form. That heuristic came in with 312d48941 (2026-08-26) and is now skipped under $is_win16.
  2. USER.59 SetActiveWindow trapped (f4f937b3f). The form calls it on its owner after hiding. It now runs the Win16 focus/activation path and returns the previously active window.
  3. The board covered the caption, menu and scrollbars (a00df147f). $gdi_win16_autopresent_child_bitmap attaches the 640x480 AutoRedraw bitmap as 0x10007's own surface, which is correct. But _clipRectForChildSurface in lib/renderer.js clipped a child surface only to the top-level frame. It now intersects every ancestor's client area.

Measured

Open