What's New in FWH 26.10
Highlights of FiveWin for Harbour/xHarbour version 26.10 (October 2026).
See also whatsnew.txt in the FWH root for the full day-by-day log.
QR code reading in pure Harbour
New sample samples\misc\qrread.prg decodes QR codes with no C code
and no FWH dependency: it is the counterpart of qrcode.prg, which
generates them.
QRReadFile( cBmp [, @aCorners ] )decodes a BMP image (1, 4, 8, 24 and 32 bit).QRDecodeGray( aGray, nW, nH [, @aCorners ] )andQRDecodeMatrix( aMat, nDim )decode from a gray array or from an already sampled module matrix, so webcam frames can be decoded without saving a file.
Each function returns NIL or a hash with the text, version, error correction
level and mask. Numeric, alphanumeric, byte and kanji modes are supported, and
damaged codes are repaired with Reed-Solomon error correction. The optional
@aCorners parameter receives the position of the decoded symbol:
{ TL, TR, BR, BL }, each { x, y } in image pixels
(outer corners, without quiet zone), so apps can draw a frame around the code.
User programs need #include "FiveWin.ch".
TOpenCode: local "opencode serve" backend with conversation history
TOpenCode (source/classes/topencode.prg) can now run
against a local opencode serve server
(o:SetServer( "http://127.0.0.1:4096" )): a persistent session with
memory of the whole conversation, any provider/model configured in opencode
(cProviderID + cModel), automatic session recovery
when the server loses the session and session cleanup on End().
Basic auth is supported (cServerUser/cServerPass).
This backend follows the approach of Charly 9000's TOpenCode class (MIT
license).
Send() now carries the conversation in aMessages
(lHistory, default .T.;
ClearMessages() starts a new conversation) and the request timeout
is configurable (nTimeout / SetTimeout()).
On the OpenCode Zen free tier (best effort): the default model is now
mimo-v2.6-flash-free and the fallback list was refreshed to the
models still alive. SSL certificates are now verified in every request
(opt out with o:lVerifySSL := .F.), and IsRunning()
no longer stays .T. forever when an async request fails without
leaving a result. See
TOpenCode.
Win64 fixes: SetTimer, AppendMenu and IsHIcon
SetTimer()read the timer id withhb_parnl, truncating ids above 32 bits; it now useshb_parnll(source\winapi\timers.c).AppendMenu()passed the item id / popup handle through a 32 bit conversion; it now usesUINT_PTRread withhb_parnll(source\winapi\menus.c).IsHIcon()leaked thehbmColorandhbmMaskbitmaps returned byGetIconInfo(); they are now released, so GDI object usage no longer grows when it is called repeatedly (source\winapi\icons.c).
TFolder: inherited backgrounds and page geometry fixed
Folder pages created without an explicit color now inherit the folder
background correctly, both themed and classic, and explicit per-page colors
survive Save()/cToChar()/CreateFromCode()
(legacy .ffm files keep their saved colors). Resize()
now adjusts the page area, so pages no longer leave a wrong strip at the
bottom (source\classes\folder.prg). See
TFolder.
VisualFW designer: palettes, build and form round-trip fixed
- Panel and horizontal/vertical ScrollBar palette tools fixed. Tabs, Meter, Icon and Timer now support creation, two save/load cycles and generated projects. Timer runs only when enabled and stays hidden outside the designer. Shell Explorer is unavailable until supported. Repeated form saves preserve default font properties.
- Project Build uses the compiler exit code, preserves warnings, quotes paths with spaces and selects matching FiveWin libs. Run uses only the executable from a successful current build; a failed build no longer launches a stale executable.
- VisualFW reopens the binary
.ffmformat produced by its Save command, restoring nested controls and designer event names. Invalid or truncated form files are rejected before loading.
PrinterKeepSetup
New: PrinterKeepSetup( lOn ) keeps the printer chosen in
PrinterSetup() or PageSetup() for the following print
jobs of the application (by default every job starts with the Windows default
printer, as always). If the kept printer is no longer available, FWH silently
falls back to the default printer. Cancelling the setup dialog changes
nothing, and PrinterResetSetup() forgets the kept printer. See
TPrinter.
More fixes
- TGet (
source\classes\tget.prg): password GETs no longer flicker when they are redrawn;DispText()now sets the window text only when it has changed. See TGet. - TRBtn (
source\classes\trbtn.prg) now releases the previous bitmap and palette whenLoadBitmaps()changes the button image, and gradient buttons release the temporary bitmap used to create their background brush: two GDI bitmap leaks gone. Thanks to Ubiratan for reporting both issues. - TSocket (
source\classes\tsocket.prg):SendData()stops retrying whenSocketSend()reports a broken socket, instead of staying in an endless send loop. Temporary WSAEWOULDBLOCK errors still retry. See TSocket.
New and enhanced samples
samples\whatsapp\wawebview.prg- WhatsApp Web inside a WebView2 on the left, a live MSG IN / MSG OUT / REACT log on the right (rich text, emoji drawn as real glyphs). JSScan()/SendToFWH()read the conversation and inject typed text into the composer.samples\whatsapp\waopencode.prg- WhatsApp Web as an AI model for opencode: the EXE runs an OpenAI-compatible server on localhost (port 8787, per-run Bearer token) that relays each prompt to the WhatsApp contact open in the WebView2 and returns the contact's reply as the completion, with tool_calls support. This is a supervised proof of concept, not a production integration: automating WhatsApp Web can lead to account restrictions. A 21-check offline test battery is included.samples\ai\opencode_mimo.prg- verifies TOpenCode against the OpenCode Zen free tier end to end (build_new.bat opencode_mimo hb32 mt).
Documentation
The TWebView2 documentation
(EN/ES/PT) now lists every class method with its signature and return, and
every bOn* callback with its arguments, including
bOnConsole JSON payloads and the limits of browsing-data cleanup,
host objects and context-menu filtering. Library behavior is unchanged.