# Ann: SWI-Prolog 10.1.18

**URL:** <https://swi-prolog.discourse.group/t/ann-swi-prolog-10-1-18/9859>\
**Category:** Releases\
**Created:** [October 12, 2026, 4:03pm UTC](https://swi-prolog.discourse.group/t/ann-swi-prolog-10-1-18/9859 "2026-10-12T16:03:24Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![jan](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/jan/32/4_2.png) [@jan](https://swi-prolog.discourse.group/u/jan)\
**Post date:** [October 12, 2026, 4:03pm UTC](https://swi-prolog.discourse.group/t/ann-swi-prolog-10-1-18/9859/1 "2026-10-12T16:03:25Z")

</div>

Dear SWI-Prolog user,

SWI-Prolog 10.1.18 is ready for download. This version modernises the  
GUI: dialog items have a flat, themed look, everything can be operated  
from the keyboard and there are editors for the GUI preferences and  
themes. The core comes with a series of bug fixes. Highlights:

**Core**

- The Prolog flag `theme` selects the theme of the console, the online  
help and the GUI, e.g., `:- set_prolog_flag(theme, dark).` in the  
init file. A theme can be based on another using prolog:theme\_base/2.  
Added the create\_prolog\_flag/3 option shared(true) for a flag that has  
one value for all threads.
- MODIFIED: prolog:comment\_hook/3 is now prolog:comment\_hook/4, passing  
the variable names of the term. Used to document the members of xpce  
classes using PlDoc.
- Fixed issues #1535 - #1545, notably clause/2 returning a clause that  
is not equivalent, JIT indexing ignoring an argument after a sequence  
of void arguments, variant\_hash/2 ignoring the tail of long text,  
writeq/1 of ‘’(a) and Latin-1 atoms, incremental WFS re-evaluation  
and the locale for fi\_FI.UTF-8.
- Windows: split\_string/4, string\_code/3, format/2 and writing variable  
names now handle code points above 0xffff (UTF-16 surrogate pairs).
- Windows: cross-compilation for ARM64.
- Several other fixes, e.g., a crash on a static predicate whose first  
argument is a rational number (reported by Shivaji Gadde) and  
profiler/2 not sampling threads.

**Packages**

- clib: fixed alarm/4 using freed memory after a remove(true) alarm  
fired, which could crash or hang call\_with\_time\_limit/2.
- libedit: fixed slow pasting in swipl-win.
- PlDoc: hooks to document and show objects other than predicates.

**XPCE (GUI)**

- New look. Buttons, menus, entry fields, tabs, scroll bars, etc.  
are flat, rounded and use the theme colours. Menus show radio  
buttons, check boxes or segmented choices and popups have rounded  
corners and a drop shadow. Graphicals can have CSS-like drop shadows.

- Keyboard operation. Dialogs, menu bars and popups can be operated  
from the keyboard as on Windows, Gnome and MacOS: Alt-  
accelerators, F10, Tab, the cursor keys, Return, Escape and Space.  
Text fields use the native key bindings (`cua` or `apple`) over the  
Emacs ones.

- Editors for the preferences (Settings/Edit GUI preferences) and  
themes (Settings/Theme/Edit theme…), with new dialog items to edit  
colours, cursors and styles, a bool\_item switch and a colour wheel.

- Classes defined in Prolog can document their members using PlDoc.  
This documentation is shown by the manual, the preferences editor  
and the PlDoc web pages.

- The manual tools are modernised: the class browser and error browser  
filter as you type and documented entries are marked with a book.

- xpce uses `num` rather than `real`, so real numbers no longer lose  
precision; lines may have a fractional width.

- Epilog: confirm closing a tab if that ends Prolog, a terminal option  
to scroll the last line to the top and better multi-line input editing.

- chain\_list/2 is thread-safe and the new member\_chain/2 enumerates the  
elements of a chain.

- Many fixes, including several crashes.

# SWI-Prolog Changelog since version 10.1.17

- FIXED: Windows: format/2 with code points above 0xffff in the format On  
Windows such a code point is a UTF-16 surrogate pair. format/2 wrote  
the halves of a pair in the format text one by one, raising an I/O  
error, and truncated a ~`c column fill character to 16 bits.

- FIXED: Windows: writing variable names and numbers with code points  
above 0xffff On Windows such a code point is a UTF-16 surrogate pair.  
The check whether an atom is a valid variable name looked at the halves,  
so print(‘$VAR’(‘X\U0001D431’)) and variable\_names([‘X\U0001D431’=V])  
wrote the name quoted. Whether a number needs a space before it used  
the first half of a float\_format/integer\_format starting with such  
a character.

- FIXED: Windows: split\_string/4, string\_code/3 and get\_string\_code/3 on  
code points above 0xffff On Windows, where wchar\_t is 16 bits, such a  
code point is a UTF-16 surrogate pair. These predicates indexed the  
text by wchar\_t units while their indexes and PL\_unify\_text\_range()  
count code points, so split\_string(“a\t\U0001F4D6\tb”, “\t”, “”, L)  
put the separator in the wrong substring. text\_chr() could not find  
a separator or padding character above 0xffff.

- FIXED: ==/2 and ==/2 on a fresh variable did not mark the variable  
as initialised. This could cause + inside a branch of ;/2 to leave  
the variable uninitialised on the success path, while the code after  
the disjunction assumes it is initialised. Co-Authored-By: Claude  
Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- ADDED: dark theme values for the xpce ui\_danger colours Co-Authored-By:  
Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- TEST: theme\_hook:thread requires threads Co-Authored-By: Claude Opus  
5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- FIXED: #1545 incremental WFS re-evaluation leaving tnot/1 undefined  
Answers of the previous evaluation that are not re-derived remain in  
the trie until re-evaluation of the component completes. These made  
simplify\_component() believe the table had answers, so a tnot/1  
delay on a table that re-evaluated to false was never resolved and  
the depending answer remained undefined.

- ADDED: dark theme: values for ui\_tile\_gap, ui\_tile\_border  
and ui\_tile\_separator Co-Authored-By: Claude Opus 5.5  
[noreply@anthropic.com](mailto:noreply@anthropic.com)

- FIXED: profiler/2 did not sample a thread that never ran profile/1,2  
The sample period was only set by profile/1,2. Starting the profiler  
using profiler/2, as the IDE thread monitor does, used a period of 0,  
which disables the timer. The call graph was collected, but no time.

- ADDED: prolog:theme\_base/2 to base a theme on another theme A theme  
uses the console colours (prolog:console\_color/3) and online help styles  
(pldoc\_style:theme/4) of its base theme that it does not define itself.  
This allows for a theme that is a small variation of, e.g., the dark  
theme. Setting the flag `theme` no longer loads library(theme/Theme)  
if prolog:theme(Theme) is true, so a theme editor can define a theme  
in memory while editing it.

- FIXED: fatal error raising an occurs\_check error with a full global  
stack failed\_unify\_with\_occurs\_check() calls PL\_error() with GC and  
stack shifts blocked. If the global stack had no room for the error  
term, f\_ensureStackSpace() did not use the spare stack and PL\_error()  
died with “Cannot report error: no memory”. As growLocalSpace()  
and makeMoreStackSpace(), f\_ensureStackSpace() now uses the spare  
stacks while processing an exception.

- FIXED: syntax error context for EOF in a leading block comment If  
the input ends in a block comment before anything was read, the  
error context showed the first byte of the read buffer, which was  
not written by this read. Now the context text is empty.

- FIXED: str\_number(): 0’ at the end of the text read past the end For  
the text “0’”, str\_number() decoded the terminator as character and  
returned an end pointer beyond the text. atom\_number/2 then inspected  
the byte after the text. Now raise a syntax error.

- FIXED: read\_term/2,3: cycles(Bool) option could reset dotlists(true)  
The options cycles and dotlists were declared OPT\_BOOL, which writes  
an int, while the targets are bool fields. Writing cycles cleared  
the adjacent dotlists field. Use OPT\_STDBOOL.

- FIXED: double unlock of L\_FILE when using an unbound standard alias  
Accessing a standard stream alias that is not bound, e.g. `protocol` if  
protocol/1 is not active, unlocked L\_FILE twice, causing an assertion  
failure rather than an existence error.

- ENHANCED: select the theme using the Prolog flag `theme` The flag  
`theme` is now always defined and shared between threads. Setting  
it loads library(theme/Theme) through prolog:theme\_hook/1, e.g.,  
`:- set_prolog_flag(theme, dark).` in the init file. The hooks  
prolog:console\_color/3 and pldoc\_style:theme/4 take the theme as  
first argument, which removes active/0 from the theme files.

- ADDED: create\_prolog\_flag/3 option shared(true) and hook  
prolog:theme\_hook/1 A shared flag has one value for all threads:  
set\_prolog\_flag/2 never makes a thread-local copy. -Dtheme=Name  
creates the flag `theme` as a shared flag. Changing its value first  
calls all solutions of the multifile hook prolog:theme\_hook/1 in the  
calling thread. If the hook raises an exception the flag keeps its  
old value and set\_prolog\_flag/2 raises the exception.

- FIXED: set\_prolog\_flag/2 with flag user\_flags = warning With  
`user_flags` set to `warning`, setting an unknown flag crashed because  
the warning lacked the arity of its message term. Also, there was  
no message text, and the flag was not created as documented.

- CLEANUP: dark theme: remove setting the colours of the old Windows  
console win\_window\_color/2 belonged to the old Windows console and  
no longer exists, so this code was never loaded.

- FIXED: #1543 writeq(‘’(a)) wrote [a] and writeq(‘()’(a)) wrote  
(a) Only Unicode bracket pairs are read as ‘’(Arg).  
Do not write the ASCII pairs and () this way.

- FIXED: #1542 writing Latin-1 atoms used signed characters On platforms  
where char is signed, characters 128-255 of ISO Latin-1 atoms were  
passed as negative values to PutOpenToken(), omitting the space after a  
prefix operator such as in “dynamic é”, and to code\_requires\_quoted(),  
ignoring quote\_non\_ascii(true). The first character of an identifier  
atom was never subject to quote\_non\_ascii(true).

- FIXED: #1541 syntax errors mis-encoded non-ASCII characters The  
arguments of end\_of\_file\_in\_quoted/1 and undefined\_char\_escape/1  
were created from UTF-8 resp. a truncated code point using PL\_CHARS  
(ISO Latin-1). Both now use UTF-8.

- FIXED: #1540 clause/2 could return a clause that is not equivalent  
After moving X = Term into the head, the decompiler restores the  
unification only if X is used later in the body. Detection of such  
use only considered a few instructions (B\_VAR\*, B\_ARGVAR, H\_VAR and  
var-var B\_UNIFY\_\*), missing e.g. ==/2, unification against a constant,  
type tests and arithmetic. The clause is now flagged CL\_HEAD\_TERMS  
whenever a unification is moved and mark\_bvar\_access() uses the VM  
operand types to find all read access to argument variables.

- FIXED: #1539 optimise\_unify moved X = Term past a variable goal A  
variable at a goal position is a call/1, but did not clear head\_unify,  
so a subsequent X = Term against a head argument was moved into the  
head, before the call.

- FIXED: #1538 variant\_hash/2 ignored the tail of long atoms and strings  
hash\_compile() did not advance the data pointer when splitting input  
over multiple hash blocks, so data that crossed a block boundary was  
replaced by its own prefix. Note that this changes the hash values  
for such terms.

- FIXED: #1537 JIT indexing ignored an argument right after H\_VOID\_N  
When skipArgs() ended exactly at the end of a run of void arguments  
it returned the H\_VOID\_N instruction rather than the next one, so  
argKey() considered the target argument a void. In multi-argument  
assessments the remaining arguments were mis-read as well, and the  
result was cached, so e.g. p(_,_,a) was never indexed on argument 3.

- FIXED: #1544 Illegal locale string warning for fi\_FI.UTF-8 The  
default locale was created using newlocale() with only LC\_NUMERIC,  
leaving LC\_CTYPE at “C”. As a result, mbsrtowcs() failed to decode  
non-ASCII separators such as U+202F (NARROW NO-BREAK SPACE) used as  
thousands separator by fi\_FI.UTF-8.

- MODIFIED: dark theme: scroll bar trough is the dialog background  
Co-Authored-By: Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- FIXED: Stop acceptiong Ctrl-L as a trace command. This was skipped  
due to isBlank().

- MODIFIED: prolog:comment\_hook/3 is now prolog:comment\_hook/4 The  
additional argument is the list Name=Var of the variables of the  
term if read\_clause/3 is called with variable\_names(Bindings),  
so the hook can relate a comment to the argument names of the term.  
The cross-referencer stores object comments and signatures created by  
the PlDoc hook prolog:doc\_compile\_comment/6 (xref\_object\_comment/4,  
xref\_object\_signature/3) and only uses `<module>` sections as module  
comment.

- MODIFIED: dark theme: the margin background follows the window  
background On a dark desktop this makes the margin of the editor use  
the desktop window background, as in the light theme, rather than a  
fixed grey20.

- ENHANCED: dark theme colours for the cross-referencer and thread  
monitor Co-Authored-By: Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- FIXED: #1535 classify resource\_error(\_) exceptions as EXCEPT\_RESOURCE  
classify\_exception\_p() tested for error(resource\_error, \_), which is  
never raised. As a result, resource errors such as stack overflows  
were ranked as ordinary errors and could be replaced by a subsequent  
ordinary error.

- FIXED: assertion failure for a static predicate with two clauses whose  
first argument is a rational number arg1Key() did not handle H\_MPQ,  
causing an assertion failure when checking for the list supervisor.  
Reported by Shivaji Gadde.

- FIXED: unsetenv under Windows unsetenv was not redirected to  
GetEnvironmentVariable to test if the variable actually existed.  
Also, setting the variable to “” does not delete it on Windows.  
Added \_xos\_unsetenv(), which calls SetEnvironmentVariable() with a  
NULL value, and use it as unsetenv().

- PORT: Cross-compile for Windows on ARM64 - New toolchain file  
cmake/cross/linux\_win\_arm64.cmake for llvm-mingw  
(aarch64-w64-mingw32-clang) with dependencies from MSYS2 CLANGARM64  
in $MINGW\_ROOT and Wine as emulator. - Use SWIPL\_ARCH arm64-win64  
for ARM64 Windows. - Use the toolchain’s objdump to find indirect  
DLL dependencies rather  
than x86\_64-w64-mingw32-objdump. - With clang, ship libc++.dll  
and libunwind.dll instead of libstdc++. - C stack backtrace: add  
ARM64 support.

- ENHANCED: MinGW cross builds: install\_dll() also copies indirect  
DLL dependencies DLLs found in MINGW\_ROOT may depend on further DLLs  
from there. For example, MSYS2’s libarchive needs liblzma, libzstd,  
liblz4 and libb2. These must be next to the plugin, both in the  
build tree and in the installation.

- TEST: Only run compare\_cyclic:flag\_thread if threads are supported  
Co-Authored-By: Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- FIXED: Missing \<errno.h\> include in pl-cstack.c Broke the single  
threaded build.

## Package clib

- FIXED: alarm/4 remove(true): using the Id after the alarm fired accessed  
freed memory Calling remove\_alarm/1 (or install/uninstall) on the Id of  
a remove(true) alarm that had fired used freed memory, often silently  
acting on another alarm such as the one of call\_with\_time\_limit/2,  
leading to crashes, hangs or 100% CPU. Alarm Ids are now blobs and  
the event memory is reclaimed by atom-GC. remove\_alarm/1 on a removed  
alarm succeeds silently; install and uninstall raise an existence error.

## Package cpp

- ADDED: synchronized C++ API with changes to SWI-Prolog.h

## Package libedit

- FIXED: Windows: slow paste in swipl-win due to the electric caret The  
electric caret shows the matching open bracket until input arrives  
or its time out ends. Waiting for input used WaitForSingleObject()  
and PeekConsoleInput(), which only work for a console. The input  
of swipl-win (Epilog) is a pipe, so every closing bracket of a paste  
waited the full time out. For a pipe we now poll PeekNamedPipe().

## Package pldoc

- ADDED: PlDoc hooks to document and show non-predicate objects The hook  
prolog:doc\_compile\_comment/6 is tried before the default processing of  
a structured comment. It gets the term that follows the comment and  
its variable names (passed by prolog:comment\_hook/4) and may compile  
the comment into object(Object, Summary, Comment) and signature(Object,  
Signature) terms. The hook prolog:doc\_object//3 emits such objects on  
file pages, which used to skip them, also when the file is documented  
using the cross-referencer. Used for the members of xpce classes.  
Added doc\_signature/2, process\_comments/5, parse\_comment/5 and the  
xpce object kind `class`.

## Package xpce

- TEST: chain\_list: library(thread) only exists with threads  
Co-Authored-By: Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- ENHANCED: error browser filters as you type and explains its Kind  
menu The search field is a filter\_item, so the list updates on every  
key; the `apply` and `help` buttons are removed. The Kind menu,  
which changes how the selected error is reported, e.g., to raise a  
warning as an error while debugging, comes after the search field,  
has a tooltip and says on the status bar what it changed. The tab  
stops of the list are computed from the widest error id.

- FIXED: error browser passed the input focus to the selected error It  
kept the selected error in a slot `current`, which hid `tabbed_window <-current`, the window of its tab. `tabbed_window ->input_focus`  
hands the focus to that window. The slot is now `current_error`.  
Also removed the unused man\_class\_hierarchy -\>focus, which hid  
`window ->focus`.

- FIXED: visual hierarchy, card viewer and inspector showed a blank  
report bar These tools had a report\_dialog of their own from the time  
they were frames. As panes of the IDE they report on the status bar  
of the window they are in, so their own bar stayed blank and a report  
added a second bar.

- FIXED: manual summary browsers no longer suggest their entries can  
be dragged A mouse-down showed the drag cursor, but nothing in the  
manual accepts a dropped entry since the card editor of the .doc era  
was removed.

- FIXED: manual: class variables and methods without their own entry  
use the instance variable A class variable that is not documented  
itself had no manual entry, although the instance variable with the  
same name, which it provides the default for, is documented. It now  
falls back to this variable, as methods already did. The card says  
that the description is that of the variable.

- ENHANCED: manual summary lists show a book for documented entries  
-\>has\_help still looked for descriptions on the manual cards of the  
.doc era, which are no longer loaded, so the (+) tag after a documented  
summary no longer appeared. It now uses the index of the markdown  
manual through man\_documented/1 from library(pce\_html\_manual). The tag  
is replaced by a column with an open book just before the summary.

- ENHANCED: class browser always shows the class itself at the top  
The class used to be hidden if the filter does not classify it,  
e.g., bool\_item is not `basic`, or if the search does not match it.  
The `self` item of the Display menu is removed and Display gets an  
`all` item that works as the one of the Filter menu.

- FIXED: crash freeing a frame, display, text\_buffer, prolog\_term or  
class whose -\>initialise failed If -\>initialise fails, e.g., because  
an argument has the wrong type, the object is freed while its slots  
are not filled. The -\>unlink of these classes assumed they were.  
Found by creating every class with arguments of the wrong type.

- ADDED: button-\>danger for buttons that start a destructive action  
A danger button has a border and label in `button.danger_colour`  
(theme colour `ui_danger`) or, if it is also the default button,  
is filled with it, using `button.danger_foreground` for the label.  
pane\_frame -\>confirm\_danger asks for such an action with a danger  
button labelled with the action and `cancel` as default button. It is  
used to confirm closing several tabs or a tab that ends the application.

- FIXED: the main Epilog console was not called `main` epilog\_name/3  
only recognised @on, while boot/toplevel.pl asks for the main console  
using main(true).

- ENHANCED: confirm closing a tab if that ends Prolog When Epilog  
runs as the main program, Prolog halts as soon as no window keeps  
the application alive. Closing the tab holding the last terminal  
therefore ended Prolog, even if other tabs held, e.g., an editor,  
and the tab label may name another pane than the console it holds.  
Closing such a tab now asks for confirmation.

- BUILD: rebuild the xpce INDEX.pl and CLASSINDEX.pl when a library  
changes The targets only depended on other targets, which orders the  
build but does not make them out of date, so a new or changed export  
in an xpce library was not picked up by the autoloader until the index  
was removed by hand. They now depend on the files MKINDEX.pl scans.

- ENHANCED: chain\_list/2 is thread-safe; ADDED: member\_chain/2  
chain\_list/2 takes a snapshot of the chain in a single foreign call.  
member\_chain/2 enumerates a snapshot on backtracking, skipping elements  
freed in the meantime. The host interface has pceSnapshotChain(),  
pceSnapshotNext() and pceFreeSnapshot() for this. The libraries use  
member\_chain/2 instead of chain\_list/2 and member/2.

- ENHANCED: cursor demo shows SDL, X11 and image cursors A marked menu  
selects the standard (SDL) cursors, the X11 compatibility cursors or  
an image cursor made from @pce\_image. The browser uses the selected  
cursor, which follows the arrow keys, and shows the cursor \<-summary  
as a tooltip.

- ADDED: cursor \<-kind and \<-summary `cursor <-kind` tells whether  
a cursor is a `standard` (SDL) cursor, an `x11` cursor kept for  
compatibility or an `image` cursor. `cursor <-summary` describes  
the standard cursors. @cursor\_names lists the standard names first.  
cursor\_item uses \<-kind, and the manual no longer refers to the  
removed display\<-cursors.

- FIXED: list\_browser -\>cursor was only shown while holding a button The  
text image that covers the list kept its own (arrow) cursor, which  
hid the cursor of the list\_browser except while it had the focus.  
-\>cursor now also sets the cursor of the text image; browser -\>cursor  
uses it.

- FIXED: clicking a list\_browser in a dialog did not give it the  
keyboard focus The focus stayed on another item, so the arrow keys  
did not move the selection of the list\_browser. It now takes the  
focus on a button press, as other dialog items do.

- ADDED: list\_browser -\>selection\_changed hook The method is called once  
after an operation that changed the selection, whether by the mouse,  
the keyboard (e.g., the arrow keys) or a method such as -\>selection  
or -\>change\_selection. It is sent to the browser if the list\_browser  
is part of one, so subclasses of either class can redefine it to act  
on any change of the selection.

- FIXED: gap in the selection highlight between a text run and a tab  
When a highlighted text run was followed by a run with the same fill,  
such as the tab after a selected browser item, the fill stopped at  
the Pango advance of the text, which may be less than the stored  
start of the next run, leaving a thin unfilled bar.

- FIXED: class\_variable\_editor-\>show\_path was defined by two clauses  
XPCE methods are a single clause; loading reported the second as  
a redefinition. Merge them using if-then-else.

- FIXED: tab\_frame: window leaving a tab kept the destroyed tab as  
tile manager Taking the last window out of a tab destroys the tab,  
but the root tile of that window still named the tab as \<-manager,  
which checkpce/0 reported and which made window \<-tile\_manager answer  
a freed object.

- FIXED: theme checking and the cross-referencer without threads  
check\_theme/1 and load\_theme\_libraries/0 tried to load the profiler  
and thread monitor, which are only installed if Prolog has threads.  
The cross-referencer’s -\>update always created a thread; it now  
runs in the foreground without threads. Tests that need threads  
are conditional.

- TEST: profiler pane tests use a stored profile The tests profiled real  
code, so whether a callee survived pruning of the call graph depended  
on where the samples landed. This made the\_graph\_walks\_past\_methods  
fail occasionally. The tests are about the windows, so they now show  
a small stored profile.

- FIXED: library(pce\_theme\_samples): keep the clauses of build/2 together  
Co-Authored-By: Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- BUILD: bump the name database version for NAME\_slice Co-Authored-By:  
Claude Opus 5.5 [noreply@anthropic.com](mailto:noreply@anthropic.com)

- ADDED: theme colours ui\_tile\_gap, ui\_tile\_border and ui\_tile\_separator  
The class variables `gap_colour` and `separator_colour` of class  
tile default to new theme colours, and the new `tile <-border_colour`  
gives the border around the windows of a frame its own colour, which  
used to be the gap colour. The defaults are ui\_dialog\_background  
and ui\_window\_foreground, so a theme can set the gaps, the border  
and the separator lines apart from the dialog and window colours.

- MODIFIED: editor and list\_browser incremental search styles The  
class variables `isearch_style` of editor and list\_browser default to  
style(background := ui\_isearch\_background), as for terminal\_image.  
The editor’s `isearch_style` and `isearch_other_style` are of type  
style\*, where @nil for isearch\_style shows the hit as the selection,  
as for a terminal\_image. The global @\_isearch\_style is removed.  
A Defaults file that refers to it must use style(background :=  
ui\_isearch\_background) instead.

- TEST: keep the xpce tests out of the user’s configuration The  
tests emacs\_split, prolog\_mode, mixed\_panes and tool\_panes wrote the  
PceEmacs bookmarks of the user running them. They now use a temporary  
configuration, as the theme and class variable editor tests did.  
The new module tests/xpce\_test\_sandbox.pl provides this and removes  
the temporary directories after xpce has saved its state on exit.

- ADDED: theme editor, library(pce\_theme\_editor) Settings/Theme/Edit  
theme… creates a theme as a variation of another theme or edits a  
theme of the user. It edits the theme colours, the console colours  
and the online help styles. The theme is applied while editing,  
so each change is visible immediately. The editor shows how a  
colour gets its value and samples of the user interface that use it.  
Themes are saved to \<user\_app\_config\>/lib/theme/.pl by the new  
library(pce\_theme\_file), which updates an existing file in place.

- ENHANCED: colour editor: colour wheel, live changes and a palette The  
colour editor shows a colour wheel for hue and saturation. If it has  
a message, every change calls it, so the colour can be seen in place.  
OK keeps the colour; Cancel restores the initial colour or calls the  
new end message with `cancel`. The Apply button is gone. The editor  
can show a palette of colours, passing the index of a selected colour  
as second argument of the message. Clicking a named colour close to  
the current colour uses it.

- ADDED: chain\<-slice and vector\<-slice \<-slice(Start, Length) returns  
a new chain or vector with Length elements from Start, where Start is  
a 1-based chain index or an index of the vector. Length defaults to  
the remainder. The part of the range outside the receiver is left out.  
The result is of the class of the receiver; a vector slice is indexed  
from 1.

- FIXED: manual search tool: word list out of step after a rejected  
key The search tool passed the keys typed in its search field to  
the word list. After a character for which no word exists, which  
the list rejects, a backspace removed a character from both, so  
the list searched for a different word than the one in the field.  
The list now searches for the last word of the field after every change.

- FIXED: a click in a pane repeated its last warning on the status bar  
Every click sets the keyboard focus, which made the window clear  
the status bar and put back what the pane said last, repeating an  
old warning. The window now only does so if the current pane changed.

- FIXED: thread monitor: profiling wall time used CPU time The test for  
wall time support checked for ‘$profile’/2, which became ‘$profile’/4,  
so wall time profiling fell back to CPU time.

- FIXED: profiler: call graph raised a type error for xpce methods  
Walking the call graph looks up the data of each callee by comparing  
it with the predicates of the profile. For a callee that is an xpce  
method and a predicate in module `user`, this called pi\_head/2 with  
the method as head, raising “Type error: callable expected”.

- FIXED: terminal\_image painted outside its area if not at the top  
Clearing the part of the terminal below the text computed the height  
from the terminal height and a window coordinate. If the terminal  
was not at the top of its window, this cleared upwards, over the  
text and other graphicals. The terminal now also clips its drawing  
to its area and restores the background colour.

- ENHANCED: HTML renderer computes fonts from their properties Class vfont  
used to map to a few predefined fonts, so fixed-width text was always  
the 14pt `fixed` font, larger than the text around it and never bold,  
italic or of another size. The font is now computed from the family,  
slant, weight and size, relative to the size of the `normal` font.  
vfont:font\_map/7 can still map a virtual font.

- FIXED: HTML renderer lost the blank after an inline element If a  
paragraph started with an inline element such as ` or a link,
the blank after it was dropped, e.g., <p><code>a</code> = b</p>
was rendered as “a= b”.`

`

ENHANCED: xpce themes use the Prolog flag theme apply_theme/1 sets
the flag theme and a prolog:theme_hook/1 clause applies the colours,
so the console and xpce share the theme. A theme selected before xpce
is loaded, e.g., using -Dtheme=dark, is kept as the user’s selection.

FIXED: Epilog: a click ending a terminal search scrolled back to
the end A left click during an incremental search (Shift-Ctrl-F)
ended it as ^G does, giving back the view the search started from.
It now ends it as ESC does, so the user can select and copy from the
page the search found.

ENHANCED: dialog gallery: keyboard notes, labelled list browser,
cancel The gallery documents how it is operated from the keyboard,
has a `cancel’ button run by Escape, a labelled list browser and a
float_item that steps by 0.1.

FIXED: help balloon freed when its window closed; hide it on a key
Closing the window under a help balloon, e.g. from the keyboard,
freed the balloon, after which every mouse event raised “pce(object)
(freed) does not exist”. As other tooltips, a balloon now also
hides when a key is pressed.

ADDED: keyboard control of sliders, combo boxes, number items and tabs
Sliders, cycle menus (combo boxes), int_item and float_item and the
tabs of a tab_stack can be operated from the keyboard, as on Windows,
Gnome and MacOS.

FIXED: real numbers lost precision in xpce Text such as 0.123 was
converted inexactly, xpce printed a non-integral number as its integer
part (0.6 as 0) and passed 0.6 to Prolog as 0.5999999999999999.

FIXED: password_item did not show its selection and could copy
the password The password is edited in a hidden shadow item, so
Control-A (select all) or Shift with a cursor key selected text that
was never shown. The bullets now show the selection of the shadow.
Copy and cut, which put the password on the clipboard in clear text,
are refused, as by native password fields.

ADDED: keyboard operation of dialogs, menus and popups Dialogs, menu
bars and popups can be fully operated from the keyboard, following the
conventions of Windows, Gnome and MacOS: Alt- accelerators
that are underlined while Alt is held, F10 for the menu bar, the
cursor keys, Return, Escape and Space in menus, submenus and on buttons.

FIXED: Epilog: clicking and selection editing in multi-line input
Clicking to position the caret only worked on the logical line of
the caret, and deleting or typing over a selection only worked for a
selection inside that line. An input with embedded newlines, such as
a pasted or recalled multi-line query, spans several logical lines.
With OSC 133 prompt marks, the input now runs from the input mark to
the end of the text in the buffer (rlc_input_range()). Moving the
caret counts a hard line break as one step, as the line editor moves
over the newline with a single cursor key. <-input keeps the newlines.

BUILD: silence compiler and PlDoc warnings Initialise c
in insert_editor() and insertSelfFillEditor() to avoid a
-Wmaybe-uninitialized false positive and terminate the mode lines
of set_keybinding_style/1,2.

ADDED: native key bindings for text entry in dialogs, over Emacs The
new class variable key_binding.dialog_style sets the style of the
text_item, text_item_view and text tables: apple' on MacOS, cua’
on Windows and Unix. Keys a style does not bind keep their Emacs
function. cua' adds Control-A (select all), Control-X, Control-Left and Control-Right (by word) and Control-Backspace and Control-Delete; apple’ adds Command-C/X/V/A, Command-Left and Command-Right (line)
and Option-Left and Option-Right (word). Use `emacs’ for Emacs
keys only; @pce->dialog_key_binding_style switches at runtime.
PceEmacs and the other tables keep following key_binding.style,
and switching one style no longer resets the tables of the other.

FIXED: Tab and Shift-Tab move the keyboard focus through a dialog SDL
names the Tab key `TAB’, but dialog items only advanced on code 9,
so Tab did nothing on buttons, menus and the like. Shift-Tab now
moves backwards; text_item and list_browser have ->previous for it.

FIXED: PceEmacs: Spy and listing to resolve to the implementing module.

ADDED: bitmaps/pce.svg, a colourful vector version of the XPCE logo
It replaces pce.png: the window, arrow and blob in blue and green, and
the three St Andrew’s crosses of Amsterdam in red, carrying P, C and E,
in the U of the University of Amsterdam. The dialog gallery shows it.

MODIFIED: popups have a flat outline, rounded corners and a drop shadow
A popup no longer draws a 3D elevation. It has a flat outline in the
new class variable popup.border_colour (ui_separator) with corners
rounded by the new class variable popup.radius (6 on Unix, 8 on
Windows, 10 on MacOS), and the drop shadow of the new class variable
popup.shadow (@nil on MacOS, which adds its own). The popup window
is made larger for the shadow and is transparent outside the popup.
That needs a compositor: MacOS, Windows and Wayland always have one;
on X11 we check for a compositing manager and otherwise use square
corners and no shadow, as transparent pixels would show black.
popup.elevation is deleted.

MODIFIED: CSS-like drop shadows: class shadow for box, ellipse,
circle, figure The new class shadow describes a drop shadow as CSS
`box-shadow’ does: x and y offset, blur, spread and colour, which
normally has an alpha. The ->shadow of a box, ellipse, circle (new)
and figure takes one. The shadow is drawn outside the area of the
graphical, which keeps its size, and not under the graphical itself.
The blur is a Gaussian approximated by three box blurs of an alpha mask.

FIXED: classes with instances could be left unrealised after boot At
the end of the boot, the classes that have instances are realised
by scanning the class table. Realising a class may define new
classes and thus resize the table, which made the scan skip some.
Adding a single built-in class made it skip class class itself.
We now scan until a scan realises nothing.

FIXED: colours were drawn with at most 255/256 of their intensity
and alpha pce_cairo_set_source_color() divided the 0..255 components
by 256, so white was not quite white and no colour was fully opaque,
which shows in a transparent popup window.

ENHANCED: tab labels: tab<->icon, narrower closable tabs, larger new-tab
button A tab can show an image left of the text of its label, scaled
to the height of the text and dimmed with the label of a hidden tab.
It sits in the half circle at the left end of the pill, and the close
button now sits in the one at the right end, which makes a closable
label narrower. The new-tab button of a tabbed_window is a pill
with a plus, as high as the labels and as far from the last one as
the labels are from each other.

MODIFIED: list_browser scrolling stops with the last item at the bottom
A list_browser could be scrolled until only its last item was left
at the top, and ->scroll_to with @default (the end) did just that.
Now scrolling in any way stops when the last item is on the bottom
line, as for the terminal.

ADDED: terminal_image->scroll_past_end to scroll the last line to
the top With ->scroll_past_end @on (class variable scroll_past_end,
default @off), the terminal can be scrolled down until the last line is
at the top of the window, leaving the rest of it empty for the output
that follows, which some people like while tracing. Output fills
the window downwards and scrolls as usual once it reaches the bottom.
The scroll bar includes the room below the last line. The option is
in the Epilog preferences.

FIXED: Manual File/Demo programs menu item It called pce_demo:pcedemo/0,
which no longer exists. It now starts the demo browser as a manual
tool, as the GUI menu of the IDE does.

FIXED: the grip of a browser or view pane was drawn over its scroll
bar A split_handle places itself in the corner of the window’s
<-content_area, which is what is visible less the scroll bars the
window displays itself. The scroll bar of a view or browser belongs
to the editor or list_browser that fills it, so the grip went on top
of it, e.g., in the demo browser. <-content_area now also subtracts
that scroll bar; emacs_view no longer needs to do so itself.

ADDED: demo dialog_gallery: a gallery of the dialog items Tabs with
buttons (a split button and a menu button), text items and a labelled
editor, the kinds of menu, bool_item and tick_box, sliders and a list
browser, the colour, font, style and cursor items, and dialog groups.
The status line shows the value each item’s message or popup receives.

MODIFIED: menu layout in dialogs: vertical labels and choice widths
The label of a vertical menu is now left of its first item, as for
a horizontal menu, instead of on top, so a dialog puts it in the
label column and the items in the value column. A choice menu no
longer takes the value width of the menus above it, which stretched
its segments; its segments keep the width of their own labels.

MODIFIED: dialog items have a flat, themed look instead of 3D Buttons,
cycle menus, entry fields, dialog groups, editors, list browsers,
tabs and scroll bars no longer draw 3D elevations. They use flat,
anti-aliased rounded boxes in the theme colours, show the keyboard
focus by an accent border and ignore ->look. Elevation class variables
that selected the 3D style are deleted.

FIXED: frame<-position of a top-level frame could be 0,0 The position
was only recorded when the window system reports that the window moved.
A frame centred by xpce when its window is created gets no such event
without a window manager that moves it, e.g., on a bare X server.
The position is now read when the window is shown. Popups and other
transient windows keep their position relative to the parent.

FIXED: password_item: crash on a click, Return and the clear icon Mouse
events went to the invisible shadow text_item that holds the password,
which cannot locate them and crashed. Return also went to the shadow,
which inserted it, so the message was never sent, and the clear icon
cleared only the visible text. Now keys that edit the text go to the
shadow and the visible item handles the mouse, Return, Tab and ->clear.
The message belongs to the visible item, so a dialog with an apply
button handles it as any other item. The password shows as bullets
(U+25CF) instead of stars.

FIXED: dialog items in tabs and dialog groups had no accelerators
A dialog only assigned accelerators to its direct members. It now
also assigns them to the items in dialog groups and tabs. Each tab
gets its own set, which avoids the accelerators of the items around
the tab stack, so tabs may reuse each other’s letters. Dialog groups
pass an accelerator key to their items, a tab only while it is on top.

MODIFIED: a dialog laid out taller than its contents no longer
spreads its rows Only rows holding an item with <-ver_stretch grow;
otherwise the spare height is left below the last row. This applies
to the tabs of a tab_stack and to dialogs, dialog groups and label
boxes laid out to a given size.

FIXED: accelerator underlines in nested devices were drawn at the
wrong place str_label() translates the coordinates of the text lines,
and the underline went through r_line(), which translated them again.
Inside e.g. a tab, the underlines showed up as stray dashes away from
their labels.

CLEANUP: delete images, defaults and the system Defaults file made
redundant by the menu redesign Deleted @mark_image and @nomark_image,
the unused bitmaps mark, nomark, on_marked, off_marked, on_toggle,
off_toggle, toggle_on, toggle_off, ol_cycle, ol_pulldown, ol_pullright
and ms_*_arrow, and the system Defaults file, whose only entry
duplicated the built-in font.system_fonts. /Defaults is still
read if a site administrator creates it. Class variable defaults no
longer test the always-true @colour_display, and pce.initialise no
longer defines the unused @_mark_elevation.

FIXED: themes added as library(theme/Name) were not offered The
theme menu of the IDE and the preferences editor only offered a theme
if its file was a .pl file whose text mentions pce_theme:colour.
Now every Prolog source in a library(theme) directory is a theme,
except auto, which chooses between light and dark. Each theme is
listed once; the themes after light are sorted by name.

FIXED: font<-domain ignored fallback fonts after the 64th With many
fonts installed, a font late in the fallback chain may cover characters
beyond the reported domain, so font->member succeeded for characters
outside font<-domain. The envelope is now extended font by font,
only examining code points outside it, which is also faster.

TEST: class variable editor: * scope is only offered where it makes
sense Since 09d25fec3, colour has no * scope. Test that, and
test the * scope on a class variable that two test classes declare.

DOC: class menu: ->kind and ->multiple_selection, theme class variables,
keyboard Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

ENHANCED: marked and choice menus can be operated from the keyboard Such
menus accept the keyboard focus. The arrow keys move the selection of
a single selection menu. In a multiple selection menu they move the
new menu->focus_item, which Space or Return toggles. At the first or
last item, Left and Right move to the previous or next dialog item.
The focus item is shown with a ring in the accent colour.

MODIFIED: menus have one themed look: radio buttons, check boxes and
segmented choices A marked menu draws radio buttons, or check boxes
if it has multiple selection; a choice menu is a segmented control.
The indicators are vector drawings in the theme colours and scale
with the value font. Menus ignore ->look, so toggle menus now show
check boxes on all platforms. Popups highlight the previewed item
with the selection colour and mark selected items with a check mark.
New class variables: accent_colour, indicator_size, indicator_border,
indicator_background, segment_background, segment_border and
segment_pressed. Deleted: item_elevation, mark_elevation and
preview_elevation.

MODIFIED: menu->kind sets only the presentation; selection is
->multiple_selection ->kind is cycle, marked, choice or popup and
resets ->multiple_selection to @off. toggle remains as the name
for a marked menu with multiple selection, and <-kind answers toggle
for such a menu. ->feedback maps to ->kind. A cycle menu is always
a combo box: the class variable cycle_indicator and the internal kind
cycle_popup are deleted.

CLEANUP: share pill drawing and input-focus test between dialog items;
add r_smooth_box() r_smooth_box() draws an anti-aliased box with
rounded corners, for controls with a modern look.

ENHANCED: preferences editor: only offer * scope where it makes
sense The * scope is offered only if several classes declare the
class variable and it has a common meaning (not for e.g., colour
or background). Its tooltip lists the classes it applies to.

FIXED: tooltips of the items in the drop-down list of cycle menus
Moving over the list passes the focus of the window to the gesture of
the list_browser, after which the inspect handlers no longer looked
at the completer. Now use the completer if its client is in the window.

ADDED: PlDoc comments for the members of Prolog defined classes A
structured comment starting with ->Sel, <-Sel, <->Var, -Var
or .Var documents the member of the class being compiled and a block
comment starting with <class> Title documents the class. They become
PlDoc objects xpce(Class, Kind, Name) with a signature derived from the
definition. The new library(pce_class_doc) finds this documentation
from the PlDoc database or by cross-referencing the class source.
It is shown by the manual card for objects without a manual entry,
by the preferences editor (“?” help, value tooltips and the tooltip
of class variables without a summary) and on the PlDoc web pages.
Documented the class variables of the PceEmacs and Epilog preferences.

ENHANCED: horizontal scrolling with the wheel: Shift+wheel and
horizontal_wheel events Shift with the wheel scrolls horizontally,
as does the wheel on a horizontal scroll_bar. Horizontal scrolling
of a trackpad or tilt wheel is reported as a horizontal_wheel event.
If the receiver cannot scroll horizontally, Shift with the wheel
scrolls one line as before.

FIXED: navigator: edit callees defined elsewhere and do not hang showing
help A predicate that is not defined in the analysed file, such as a
built-in or library predicate, can now be edited. Showing its manual
used help/1 in the GUI thread, which could block on the console pager;
it now uses class prolog_predicate, which shows the manual in a window.

FIXED: navigator: loading files no longer scrolls the tree away
Expanding a file often loads files, which are added to the tree.
This moved the expanded node or scrolled to the directory of the
new file. The node the user expanded last, or else the top node of
the window, now keeps its position in the window.

FIXED: Wayland: tooltip of browser and menu items did not follow the
item Moving the pointer to another item changed the text of the tooltip,
but not its position. The tooltip is now reopened at the new position.

ENHANCED: theme colour chooser shows where each colour gets its value
A column shows whether the colour comes from the desktop, the theme
or a default, and the tooltip traces the value step by step, e.g.,
from ui_margin_background through ui_window_background to the GNOME
desktop setting for sys_window_background. Adds theme_colour_origin/2
to library(pce_theme) and @system_colour_origins, which tells whether
a sys_* colour comes from the desktop or is an xpce default.

MODIFIED: the xpce Prolog libraries use num rather than real Methods and
slots typed real, int|real, etc. now use num. A num arrives in Prolog
as an integer if it is integral. float_item keeps returning floats.
Also fixes integer division on a font ascent in the colour item,
scaled_bitmap with a numeric scale and float_item->increment beyond
the upper bound.

FIXED: saving a num that is not a 32-bit integer, e.g., a pen of 1.5
Such values were saved as a (truncated) integer or raised an assertion.
They are now saved as a double using the new ‘F’ tag.

ENHANCED: preferences editor: edit a class variable with a set of
values using a cycle menu E.g., text_cursor.fixed_font_style is now
edited using a cycle menu rather than a text item. The descriptions
of the values from the manual are shown as tooltips of the menu items.

FIXED: pane_frame: keep a tool’s status message when it moves and
activate a pane on a click A tool remembers its last inform, warning
or error message and shows it again when it becomes the current pane,
also after moving to another window. A window drops its status bar
only if none of its panes uses it. Clicking a window that does not
want the keyboard, such as the graph of the thread monitor, now makes
its pane current through the new frame hook ->window_clicked.

ENHANCED: string(Obj) creates a string holding a copy of the text of a
char_array Obj may be an object reference or a term that converts to
a char_array, e.g., string(string(foo)). The text is copied as is,
i.e., it is not used as a format.

MODIFIED: real ranges and most methods that took a real use num A
real range type such as 0.0..1.0 translates to a num rather than a
real object, as do the arguments of ->resize, ->layout, ->draw_arc,
<-angle, date<->posix_value, pce<-cpu_time, stream<-read_line and the
colour factors of <-hilite, <-reduce, <-fade and <-mix. The dispatch
timeout is a num in seconds rather than an int in milliseconds or a
real in seconds.

ENHANCED: class variable editor: general preferences and preferences of
the IDE tools The Text tab sets *.selection_style for all classes.
The Theme tab (was Colours) holds the theme and, under the heading
Bell, the visual and audible bell, edited using sliders that are
only active if the setting is used. The profiler, cross-referencer,
debugger, thread monitor and navigator declare their preferences,
so the editor shows them. The settings of the cross-referencer
and debugger are now class variables saved in the Defaults file;
an existing config(‘Tracer.cnf’) is migrated once. Colours of these
tools are theme colours.

FIXED: prolog_thread_monitor->update_interval did not store the value.

MODIFIED: graphical<->pen is a num, so lines can be drawn with a
fractional width This matches Cairo. The slot type is num' rather than 0.0..‘, as a real range converts the class variable default to a `real’
object, which the C code read as a pen of 0, so nothing was drawn.
Negative values are mapped to 0. line->pen accepts a num as well.

MODIFIED: an inactive slider fades, as an inactive bool_item Using
the inherited graphical.inactive_colour, the track was painted in
the background colour, leaving only a grey knob.

ENHANCED: the bell: pitch and duration are class variables; times
are in seconds display.bell_pitch and display.bell_duration define
the tone of display ->bell. graphical.visual_bell_duration and the
time of ->flash are in seconds, as all times in SWI-Prolog. BEL in
a terminal_image calls ->alert, so it respects graphical.visual_bell.

DOC: no longer describe xpce in terms of X-windows Class and method
summaries, comments and the reference manual refer to the window
system rather than X-windows. Class window is summarised as a
“Scrollable device with its own coordinate system”.

BUILD: install the reference manual Markdown files and rebuild
manindex.db Combines:

FIXED: persistent_frame: destroying a frame that was never opened
wiped the saved geometry of all other frames Co-Authored-By:
Claude Opus 5.5 noreply@anthropic.com Claude-Session:
https://claude.ai/code/session_011Ee9zPKoGDiUDoBz6rrguv

FIXED: the debugger saved its settings in every process that loaded
it Only save Tracer.cnf if a setting was changed. The tests that
load the debugger use a configuration file of their own.

MODIFIED: debugger settings are in Settings/Debugger The debugger adds
this item to the Settings menu of the window it is in. The dialog
uses bool_item, int_item and a cycle menu.

DELETED: display<->dpi and library(print_text) The DPI of a display
was no longer used. Printing text (PceEmacs Print and Print selection)
no longer worked.

MODIFIED: types, comments and classification of class variables
Numeric class variables with natural bounds use range types, class
variables have comments and are classified as basic or advanced for
the class variable editor. On Windows, PceEmacs saves files that
cannot be represented in the default encoding as UTF-8.

MODIFIED: class browser applies changes immediately The Apply button
is gone and search works as you type. Also fixes the class field
and the “All” filter.

ADDED: library(pce_class_variable_editor): edit GUI preferences Pick a
GUI object on the screen and edit the class variables of its component,
as declared by library(pce_preferences), or general preferences in the
tabs Text, Colours, Layout and IDE. Values are applied immediately
and can be saved to the Defaults file. Opened from Settings/Edit GUI
preferences of the IDE and from the manual. Also adds config_item/4
to library(pce_configeditor) and visual<-contained.

MODIFIED: tile appearance: separators, gap colour and borders
The class variables tile.separator_pen, tile.separator_colour and
tile.gap_colour define the space between the windows of frames and
tab_frames. tile.fixed_border is the width of gaps that cannot be
resized. frame<->background is removed; use tile<->gap_colour
of the root tile. Also fixes tile layout if space is short, a new
root tile taking over the appearance and loading library(tab_frame)
after subclassing tabbed_window.

ENHANCED: change fonts at runtime display_manager->fonts_changed
applies changes to font.scale and font.pango_families to the existing
fonts and windows. font.pango_families only maps mono, sans and serif.
New type mono_font, font<-font_families filters on monospace and the
characters covered and list_browser<-drop_unrenderable drops items
whose font cannot show them, so combo boxes can show font families in
their own font. Adds pango_families_item and fixes font<-fixed_width.

MODIFIED: text carets: styles bar, block, underline and xpce;
blinking The caret of editors, text items and terminals has the
styles bar, block, underline and xpce (the default), selected by
text_cursor.fixed_font_style and text_cursor.proportional_font_style.
The active caret blinks (text_cursor.blink).

ENHANCED: combo boxes, menus and list browsers Combo boxes show
tooltips for their values, work from the keyboard (up, down, return,
escape, search) and close on a click outside, also for cycle menus.
Items of a list_browser can have tooltips. Alt-click or double-click
selects only one item of a toggle menu. Also fixes sliders with real
bounds, scrolling back to the origin of a restricted window and the
frame of a loc_still event.

ADDED: dialog items to edit colours, cursors and styles New are
colour_editor, colour_item (a compact item to select a theme colour
or edit a colour), ansi_colours_item, cursor_item, style_item
and line_decoration_item. The old colour_item is renamed to
colour_palette_item. Compound dialog items record ->active.

ADDED: class bool_item: a switch to edit a boolean value
library(pce_config) uses it to edit booleans.

ADDED: text->style, strikethrough and textured underlines A style
overrules the font, colour, etc. of a text object. Styles support
strikethrough and textured (wavy, dotted, …) underlines. Also fixes
the position of underlines, underlines of multi-line text, style grey
in editors and the background of selected text in a translated window.

MODIFIED: colours no longer accept images (pixmaps) Colours and
backgrounds are colours. The remaining support for images as
colours is removed and graphical.inactive_colour is of type colour*.
Also fixes colour<-saturation (was misspelled as <-saturnation),
adds theme_colour<-summary describing the role of a theme colour and
fixes a crash after freeing @colour_names or @colour_list.

FIXED: class variables: subclass entries, inherited values and
summaries A Defaults entry for a subclass of the class that declares
a class variable is now used, class->class_variable_value on
an inherited class variable no longer changes the super class,
class_variable<-summary falls back to the instance variable,
#RRGGBB colours in Defaults are accepted without a warning and
use_class_template/1 keeps the summary of the class.

FIXED: xpce SDL: synthesize a lost mouse up-event If a motion event
shows that the button pressed in an xpce window is no longer held, but
no up-event was seen, the motion is turned into the missing up-event.
This terminates the gesture that handled the down.

FIXED: xpce SDL: deliver drag and up events to the window of the down
If SDL reported a drag or up event for another frame than the one
that received the down event, the event went to the window under the
pointer in that frame, leaving the gesture that handled the down active.

FIXED: xpce drag-scroll: vertical scrolling tested y against the width
The vertical cases compared the y coordinate instead of x against the
width, so dragging diagonally beyond the right edge scrolled vertically.

FIXED: xpce gestures: drag-scroll only while the gesture’s button
is held If a gesture remained active after missing its up-event,
the pointer leaving the window generated an area_exit just outside
the client, which started the drag-scroll timer. PceEmacs then kept
scrolling although no button was pressed.

FIXED: terminal: send NUL for Ctrl+Space, as xterm does SDL reports
Ctrl+Space as a space with Control held, which the terminal passed
on as a plain space, so e.g. emacs -nw never saw set-mark.
Alt+Ctrl+Space now sends ESC NUL rather than a lone ESC.

`

---

<div class="post-metadata">

**Author:** ![alanbur](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/alanbur/32/7166_2.png) [@alanbur](https://swi-prolog.discourse.group/u/alanbur)\
**Post date:** [October 12, 2026, 7:02pm UTC](https://swi-prolog.discourse.group/t/ann-swi-prolog-10-1-18/9859/2 "2026-10-12T19:02:02Z")

</div>

swipl-win is badly broken on Debian/xfce I’m afraid. Clicking on a menu item in the menu bar displays the menu but nothing in it is selectable and it disappears unless the mouse button is kept pressed. The only way of activating a menu item is to use keyboard accelerators to pop a menu up, then navigate with arrow keys etc/

I’ve also seen this, not sure what the trigger was:

```prolog
ERROR: Received fatal signal 11 (segv)
Time: Mon Oct 12 20:01:02 2026
Inferences: 469884
Thread: 1 (main)
C-stack trace labeled "crash":
  [0] save_backtrace() at /data2/tmp/swipl-devel-10.1.18/src/os/pl-cstack.c:334 [0x7ffa79784578]
  [1] sigCrashHandler() at /data2/tmp/swipl-devel-10.1.18/src/os/pl-cstack.c:850 [0x7ffa79714113]
  [2] __restore_rt() at libc_sigaction.c:? [0x7ffa7948bd70]
  [3] acceleratorCuesFrame() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/src/men/button.c:115 (discriminator 3) [0x7ffa78956eb3]
  [4] CtoEvent() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/src/sdl/sdlevent.c:896 [0x7ffa78a3d4ca]
  [5] dispatch_sdl_event() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/src/sdl/sdlevent.c:1236 [0x7ffa78a3d776]
  [6] ws_dispatch() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/src/sdl/sdlevent.c:1365 [0x7ffa78a3decd]
  [7] pceDispatch() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/src/itf/interface.c:772 [0x7ffa7891aeda]
  [8] pl_pce_dispatch_event() at /data2/tmp/swipl-devel-10.1.18/packages/xpce/swipl/interface.c:3249 [0x7ffa78a421c2]
  [9] PL_next_solution_guarded___LD() at /data2/tmp/swipl-devel-10.1.18/src/pl-vmi.c:4363 (discriminator 2) [0x7ffa797231ff]
  [10] PL_next_solution___LD() at /data2/tmp/swipl-devel-10.1.18/src/pl-wam.c:3574 [0x7ffa7971eb56]
  [11] query_loop() at /data2/tmp/swipl-devel-10.1.18/src/pl-pro.c:171 [0x7ffa79767cc3]
  [12] prologToplevel() at /data2/tmp/swipl-devel-10.1.18/src/pl-pro.c:661 [0x7ffa79767b5d]
  [13] ??? [0x5584045220ce]
  [14] __libc_start_call_main() at ./csu/../sysdeps/nptl/libc_start_call_main.h:74 [0x7ffa79475ca8]
  [15] call_init() at ./csu/../csu/libc-start.c:128 [0x7ffa79475d65]
  [16] ??? [0x558404522121]

```
