Branch: development (switch to
stable),
SWI-Prolog Changelog from version 10.1.16 to 10.1.17
[Oct 2 2026]
- DOC: UI themes: theme colours, switching themes and the Settings/Theme
menu Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ENHANCED: dark theme: lighter scroll bar trough Co-Authored-By:
Claude Opus 5.5 <noreply@anthropic.com>
- ENHANCED: theme files: switch console colours with the xpce theme
The console and online help colours of library(theme/light) and
library(theme/dark) now only apply while their theme is active, so
the Prolog console follows selecting a theme in xpce. Without xpce,
a loaded theme is active as before. The dark theme defines a complete
dark palette for the basic xpce colours, which is used if the desktop
is light.
- ENHANCED: dark theme: only define theme colours for xpce The remaining
class variable settings and the debugger port styles are replaced by
values for the theme colours of the development tools. The dark theme
no longer changes xpce class variables, so loading it has no effect
on xpce until it is applied and switching back to light restores
all colours. The debugger port colours are dark backgrounds, such
that the syntax colours remain readable.
- ENHANCED: dark theme: define xpce's ui_* and ansi_* theme colours
Replaces the class variable settings for the basic xpce classes
by values for the ui_* and ansi_* theme colours, so these follow
switching between light and dark. If the system colours are dark,
the basic window colours are the system colours. Text selection
and search highlights now use dark backgrounds, such that the syntax
colours remain readable.
- ENHANCED: dark theme: define the PceEmacs syntax colours as
theme colours The style/2 hook is replaced by
colour/3 facts for the syntax_* theme colours, so switching
between light and dark no longer requires restarting PceEmacs.
Adds dark values for the syntax classes that were added after the
dark theme was written:
head(test,_), rational(_), known_flag_name(_),
macro(_) and domain_error(_). Drops the unused table_option(_) style.
- ENHANCED: dark theme: leave basic xpce colours to dark system colours
on all platforms The dark theme now tests sys_window_background
rather than the Windows specific win_window. This makes windows,
dialogs and menus follow switching between light and dark while xpce
is running on Windows, MacOS, KDE and GNOME.
[Oct 1 2026]
- FIXED: incremental subsumptive tabling raised a tabling dependency
error Using
:- table p/2 as (subsumptive,incremental), re-evaluating
the general table after an update of the underlying incremental
predicate raised `Tabling dependency error`. Also, calls that reused
an existing (variant or more general) table did not record an IDG
dependency, so incremental tables depending on them were not updated.
- FIXED: '$qlf_module'/2 leaked memory and atoms on every call
qlfInfo()
never popped the XR table or the path translation pushed for the
module info. The XR table owns the atoms it loads, so qlfModuleInfo()
must not unregister them; it did so for the module name, class and
super module, which kept the counts balanced only because the table
was never popped.
- FIXED: loading a .qlf file did not notice changed consulted, included
or dependency files '$qlf_out_of_date'/3 only checked the main source
file, so editing a member of an aggregate such as pce.qlf or emacs.qlf
kept loading the old code until the next build. It now checks all
sources recorded in the .qlf file, reading them in the same open as
the compatibility check. A file that is both incompatible and out
of date is reported as incompatible.
- ENHANCED: dark theme: keep the system window colours if they are
dark On Windows using a contrast theme such as Night sky, the xpce
defaults derive from the system colours. Overruling the window and
dialog colours made the menus black on grey.
[Sep 30 2026]
[Sep 26 2026]
- ENHANCED: profile/1: handle interrupts while collecting data.
- PORT: macOS fat .pkg installer refused to install on Intel Macs The
installer's hostArchitectures was set from CMAKE_SYSTEM_PROCESSOR,
i.e., the build host, so the universal package built on Apple Silicon
only accepted arm64. Use x86_64,arm64 for universal builds.
[Sep 25 2026]
- ENHANCED: derive
color_term and hyperlink_term from the terminal
we run on qsave_program/2 saved both flags, and as library(ansi_term)
creates them using keep(true), a saved state kept the values of
the process that built it. A state built without a terminal, e.g.,
by make(1) writing to a pipe, never used colours. Both flags are
no longer saved, so the library computes their defaults when the
state starts.
Package clpqr
[Oct 1 2026]
- ENHANCED: CLP(Q,R): prefilter/2 and the occurrences of the variable
eliminated Two more walks over the whole class that Fourier-Motzkin
elimination did per variable:
- ENHANCED: CLP(Q,R): Fourier-Motzkin elimination in dump/3 and
projection Two costs that grew with the size of a class rather than
with the projection:
Package plunit
[Oct 3 2026]
- FIXED: make/0 after enabling optimise: unknown procedure 'unit
test'/4 If a test unit was loaded and the file is reloaded while
the tests are not loaded, e.g., because the
optimise flag is now
set, the unit stayed registered while its clauses were wiped by the
reload. Running the tests on make/0 then raised an existence error.
Reported by Mike Elston.
Package xpce
[Oct 4 2026]
- FIXED: macOS x86_64 link: undefined ___isPlatformVersionAtLeast
@
available() below a macOS 11 deployment target calls into clang's
compiler-rt, which is not linked when GCC links the library. Use a
respondsToSelector: test instead.
- DOC: Fixed EXTENDING.md Markdown and updated some of the content.
[Oct 3 2026]
- DOC: Updated XPCE UserGuide frontpage
- DOC: describe precisely when themes use the system colours Only
the roles, the ui_<role> colours that have a sys_<role>, follow the
system colours. Document how a theme is matched against the desktop
and that a role a theme does not define remains the system colour.
- MODIFIED: text selection uses a theme colour derived from the desktop
The editor, terminal and parbox show the selection using the background
ui_text_selection_background on all platforms. This used to be
yellow, except on Windows, which used the system highlight. It now
derives from the new system colour sys_text_selection_background:
selectedTextBackgroundColor on MacOS and a tint of the accent colour
on the window background elsewhere. Selected text keeps its colour.
- ENHANCED: profiler: the browser selection follows the current node
Making a node current from the details or the call graph selects it
in the browser. If the filter hides it, nothing is selected, and it
is selected again when the filter shows it.
- ENHANCED: xdot->load explains why graphviz could not draw the graph
If the graphviz program is not installed or fails, the figure shows
why instead of the graph, and keeps the text in xdot<-problem.
- FIXED: frames and @display survive removing the last display SDL may
report the removal of every display, e.g., a MacBook in clamshell
mode whose external monitor goes to sleep. The last display is now
kept as a parking place for its frames, so @display no longer fails,
and the frames move to a display that is attached again. Frames of
a removed display move to the display SDL reports for their window,
and removed displays are never returned by <-primary or <-current if
there is a live display.
- FIXED: colour<-hue and colour->initialise using HSV were inaccurate The
RGB/HSV conversion approximated the hue sextants by 0.17, 0.33, etc.,
so blue had hue 241.2 instead of 240. Now use the exact conversion.
- MODIFIED: theme_colour<-value renamed to theme_colour<-derived_from
The instance variable
value hid colour<-value, the value of the
HSV model, so a theme colour returned its source colour name rather
than a number. This broke e.g. the HSV Colours demo, which uses the
display foreground. Reported by Mike Elston.
- FIXED: crash redrawing a slider after the colour grey50 was freed
The colours that C code keeps in global variables (BLACK_COLOUR,
GREY50_COLOUR, ...) were not locked, so they could be garbage collected
when user code used and released the same named colour, e.g., the
Constraints demo destroying a text coloured grey50. Now lock them,
as well as the 3D grey of
ws_3d_grey(). Reported by Mike Elston.
[Oct 2 2026]
- MODIFIED: @display is the function ?(@display_manager, current)
@display used to name the display that was primary at startup,
which went stale or disappeared when monitors were hotplugged.
It now evaluates on each use to the display of the last event or,
if there was none, the primary display. Application-wide state
moved to @display_manager: shared inspect handlers, ->busy_cursor
for all displays, <-frames of all displays and the armed object of
library(pce_arm).
- FIXED: MacOS dark mode: label of a disabled button was invisible
disabledControlTextColor and controlColor are both white at 25%,
so composed over the dialog background sys_inactive equalled
sys_button_background. sys_inactive is now composed over the dialog
or the button background, whichever remains most visible on both.
- ENHANCED: MacOS: distinguish dialogs from content windows Since MacOS
26, windowBackgroundColor equals textBackgroundColor, so xpce dialogs
were indistinguishable from content windows. If both are the same,
sys_dialog_background is now secondarySystemFillColor composed over
the window background (#ebebeb light, #303030 dark), about the sidebar
colour used on GNOME. The translucent sys_* colours are composed
over the dialog background.
- ENHANCED: icon_button: symbolic SVG icons follow the theme An SVG
icon that draws in
currentColor is drawn in the colour of the class
variable icon_button.symbolic_colour, by default the text colour of
dialogs, and drawn again when the theme changes. The close and new
tab icons are now symbolic, so they are visible in dark themes.
- ENHANCED: tab: clear feedback for the tab on top, also in dark themes
The hidden tabs darkened their background by 15%, which is hardly
visible on a dark background. Their background now moves a little
towards the text colour and their labels are dimmed, which works
for light and dark themes alike. The tab on top gets a line in the
accent colour on top of its label, as many current applications do.
See the class variables tab.indicator_colour and tab.indicator_width.
Adds colour<-mix to move a colour towards another colour.
- ENHANCED: kangaroo demo: coloured kangaroos with a smoother hop,
generated on the fly The kangaroos come in four colours with a light
belly and a dark outline, so they show on light and dark backgrounds.
A hop has 12 frames: crouch, push off, fly with trailing legs and
reach for the ground. The frames compensate the constant step of the
demo, so the feet stay on the ground while crouching and all forward
motion happens in the air. The demo generates the frames as SVG,
loads them from a text_buffer and shares them between kangaroos of
the same colour. This removes the kangaroo_*.svg files.
- ADDED: display_manager->colours_changed notifies frames and
graphicals; dark theme fixes ->colours_changed, which runs when
the theme changes, first sends ->colours_changed to each frame and
graphical whose class defines it. This allows applications to update
colours that do not follow the theme by themselves, such as images
drawn using image->draw_in. PceDraw uses this to repaint its icons
and the profiler to draw its call graph again.
- FIXED: PceDraw: changing an attribute of a prototype icon called
the undefined ->repaint_proto Co-Authored-By: Claude Opus 5.5
<noreply@anthropic.com>
- ENHANCED: GNOME: use the libadwaita sidebar colour for the dialog
background The libadwaita window background is almost white,
so xpce dialogs were indistinguishable from content windows.
sys_dialog_background is now the sidebar background (#ebebed light,
#2e2e32 dark), which libadwaita uses for panels next to the content.
The button, separator, etc. colours are derived from it.
- DOC: manual scope classification for theme_colour
and the colour changes Adds class theme_colour,
display_manager ->system_colours_changed, ->colours_changed and
<->system_colours_message, colour.dark_hilite_factor, and the missing
colour <-fade and colour.fade_factor.
- DOC: reference manual: class theme_colour, system colours and themes
Adds class theme_colour, display_manager ->system_colours_changed,
->colours_changed and <->system_colours_message, the globals
@colour_names, @theme_colours and @theme_colour_defaults, and
colour.dark_hilite_factor. Updates the defaults of display and
terminal_image that are now theme colours and the description of
display.theme.
- DOC: userguide section on themes and theme colours Describes selecting
a theme, the theme colours and their naming, how themes replace the
system colours if they do not match the desktop, writing a theme,
declaring theme colours of an application and colours chosen by
the user. Also fixes the captions of the system colour tables,
which stopped pdflatex.
- FIXED: Epilog new window (Shift-Ctrl-I) raised an error for a terminal
with a profile colour The new window copies the background of the
terminal, which is a colour object. Anonymous object references
are blobs rather than @/1 terms, so this was taken for a colour
specification. Use is_object_reference/1.
- ENHANCED: Epilog profile and set_epilog/1 colours adapt to the theme
The
background(Colour) option of a profile, the new foreground(Colour)
option and the colours of set_epilog/1 are theme colours. A single
colour is adapted to the active theme, e.g., a light yellow
background becomes dark olive in the dark theme. A list such as
[light=lightgoldenrodyellow, dark='#33301e'] gives a colour per theme.
- ADDED: adaptive_colour/3: theme colours from user colours that
adapt to the theme
adaptive_colour(Name, Spec, Reference) defines a
theme colour from a colour chosen by the user. Spec is a colour or
a list Theme=Colour. A theme without a colour of its own uses the
light colour if it is as dark or as light as Reference in that theme,
and otherwise mirrors its lightness, keeping its hue.
- FIXED: <-hilite of a dark colour was almost white With the default
factor, colour<-hilite moves the colour 90% towards white. On a dark
background this made, e.g., the preview of menu items almost white,
so the white text was unreadable. Dark colours now use the class
variable colour.dark_hilite_factor, default 0.2.
- ADDED: select a theme from the IDE Settings menu, also against the
desktop Settings/Theme selects "Follow the desktop" or one of the
available themes for this session. Each system colour sys_<role>
now has a theme colour ui_<role> and xpce only uses these. If the
brightness of the theme does not match the desktop, e.g., a dark theme
on a light desktop, the theme replaces the system colours by its own.
library(pce_theme) defines these for the light theme. On Windows,
buttons and scroll bars no longer use the win_* colours, so they
follow the theme as well.
- FIXED: display_manager->colours_changed did not redraw windows
inside tabs Windows nested in other devices, such as the tabs of a
tab_stack, were not redrawn, so they kept their old colours after
switching themes. Walk all devices of each frame using an agenda.
- ENHANCED: development tools use theme colours The graphical debugger,
profiler, debug monitor, cross referencer, PceEmacs bookmarks and
the help viewer declare their colours using the new theme_colours/1
directive of
library(pce_theme) or use the basic ui_* window colours,
so they follow switching themes. The debugger port colours are the
debug_port_* theme colours. check_theme/1 loads the libraries that
declare theme colours.
- ENHANCED: xpce class variable defaults use theme colours xpce
defines the theme colours ui_* for the basic user interface elements
and ansi_* for the terminal colours, with their light values in
@theme_colour_defaults. The class variable defaults of windows,
dialogs, editors, terminals, list browsers, menus, text items, the
text cursor, scroll bars and the display refer to these, so they
follow switching themes while xpce is running. The light values are
unchanged, except that list_browser and text selections on Unix and
MacOS now use the system selection colours on all platforms.
- ENHANCED: PceEmacs syntax highlighting uses theme colours The colours
of the PceEmacs syntax styles now refer to the theme colour of their
class, e.g., syntax_goal_built_in for
goal(built_in,_), so they follow
switching themes while the editor is open. The classes are those
of syntax_colour/2, including the classes added by language modes.
library(pce_theme) now initialises itself when it is loaded, which
fixes loading it before library(pce).
- ADDED: class theme_colour: colours whose value follows the theme
theme_colour(Name, Value) is a colour whose value is the name of
another colour, possibly another theme colour or a system colour.
The RGB value is computed on first use and reset for all theme
colours if a value changes or the system colours are reloaded, so
theme colours may refer to each other in any order. Theme colours are
locked and never returned when looking up a colour from its RGB values.
library(pce_theme) now uses this class. This replaces colour->access
and colour->rgba.
- ADDED:
library(pce_theme): semantic colours and themes that
switch at runtime A semantic colour is a read/write, locked
colour object whose name describes its role. Libraries declare
semantic colours with their value in the light theme using
semantic_colour/3. The PceEmacs syntax colours are derived
from def_style/2 in library(prolog_colour), e.g., goal(built_in,_)
becomes syntax_goal_built_in. A theme maps names to values using
colour/3. apply_theme/1 switches themes in place and the
theme follows the system light/dark setting unless the user fixed it.
check_theme/1 reports missing, unknown, duplicate and invalid entries
of a theme.
- ENHANCED: colour->access to distinguish read-only and read/write
colours Colours are read-only by default and only colours with access
`both' accept ->rgba. A read/write colour is never returned when
looking up a colour from its RGB values. Read-only colours, including
colours created with a name and RGB values, are again entered in this
reverse table as before.
- ADDED: colour->rgba and display_manager<-system_colours_message
for theme colours colour->rgba changes the value of a
colour in place. After a change of the system colours,
display_manager->system_colours_changed sends <-system_colours_message,
so the application can update its own colours, and redraws all windows.
display_manager->colours_changed redraws all windows. These are
the basis for switching between light and dark themes while xpce
is running.
- ENHANCED: Windows: sys_* system colours follow dark mode and the
accent colour Windows dark mode does not change GetSysColor().
If applications use dark mode and no contrast theme is active, the
sys_* colours now use a Windows 11 dark palette with the user's accent
colour for the selection. The system colours are also reloaded when
the user selects another contrast theme or accent colour, which SDL
does not report.
[Oct 1 2026]
- ADDED: reload the system colours when the desktop settings change
display_manager->system_colours_changed reloads the sys_* and platform
system colours, updates the named colour objects in place and redraws
all windows. It is sent when the user switches between light and
dark mode and, on MacOS, also when the accent or highlight colour or
the contrast changes.
- ADDED: sys_* system colours follow GNOME's style and accent colour
Under GNOME, the sys_* colours are taken from a built-in libadwaita
palette. The XDG Desktop Portal tells us whether to use the dark
style, high contrast and the accent colour (GNOME 47+). The portal
is read using GIO, which is optional.
- ADDED: sys_* system colours follow the KDE colour scheme When running
under KDE, the colours of the scheme in kdeglobals are available as
kde_<group>_<key> (e.g., kde_view_background_normal) and define the
sys_* colours, so xpce follows light and dark KDE schemes.
- ADDED: portable sys_* system colours and MacOS mac_* colours The
colour names sys_window_background, sys_selection_background, etc.
are defined on all platforms and follow the desktop settings on Windows
and MacOS. On MacOS, the AppKit named colours are available as mac_*.
xpce's defaults now use the sys_* names, so on MacOS the GUI follows
light/dark mode and the accent colour.
- ENHANCED: profiler GUI: make the flat profile as wide as its predicates
When loading a profile, the column with the flat profile is made as
wide as the longest predicate and a time, up to
max_width percent
of the profiler.
- ADDED: profiler GUI: filter the predicates as you type A filter_item
above the flat profile shows only the predicates whose label matches.
The details and the call graph still reach predicates the filter hides.
- ADDED:
library(pce_filter_item): filter as you type Class filter_item
calls its message with a regex or @nil as the text changes. Used by
the cross-referencer and the navigator, whose filters did not react
to the clear button of the text item.
- FIXED: text_image ->tab_stops did not lay out the text again Lines laid
out before the tab stops changed kept the old stops, so a browser that
sets its tab stops when it is resized showed its columns misaligned.
Also check the type of the last tab stop.
- ADDED: profiler GUI: call graph of the current predicate The right
of the profiler holds the details and a kcachegrind-style call
graph as tabs. The graph, laid out by graphviz using
library(xdot),
shows the callers above and the callees below the current predicate,
marked by a star. Boxes are tinted by their time and arrows are as
thick as the time that flows along them. Clicking a box makes it
the current predicate.
- ENHANCED: pane_stack <-window also finds windows in a nested
tabbed_window Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ENHANCED: xdot_window: <-natural_zoom defaults to a class variable
This allows subclasses and the Defaults file to set the preferred
zoom for ->fit.
- FIXED: xdot: tooltips showed
\n rather than a line break Graphviz
passes the escapes of its escString type through to the tooltip.
Translate \n, \l, \r and \\. Also, the tooltip was used as
a format string, which garbled a tooltip holding a `%`.
- ENHANCED: Windows: report a dark system theme for dark system colours
Contrast themes such as Night sky have a dark window colour but do
not set dark mode. @display<-system_theme now also returns dark if
the luminance of win_window is low.
- FIXED: Windows: make xpce follow the system colours, e.g., contrast
themes Contrast themes such as Night sky change the system colours
without setting dark mode. Dialogs took their background from
win_btnface but kept a black foreground, making menus unreadable.
The display, dialogs, button elevations, editors, list browsers,
text margins and the terminal now use the matching win_* colours.
Added win_menubar and win_menuhilight.
[Sep 30 2026]
- MODIFIED: tracer: the terminal button opens a terminal below the
debugger The IDE no longer has ->open_interactor. The tracer's button
(and its method, now ->terminal) asks
prolog_ide ->new_terminal
for a low pane below the debugger, for which ->new_terminal accepts
a side, the pane to put it beside and the share of the room it takes.
- FIXED: SDL/X11: dropping files did nothing with SDL < 3.4.4 if the
source offers text before text/uri-list SDL before 3.4.4 on X11 uses
the first type the drag source offers. If a file manager lists text
before text/uri-list, the files arrive as drop_text events holding a
file name or file:// URI. For these SDL versions, treat a drop_text
whose lines are all existing files as dropped files.
- MODIFIED: pce<-window_system_version is 10000*Major+100*Minor+Patch
This is consistent with pce<-version: number and allows testing for
a specific SDL release. pce<-window_system_revision is removed.
The banner and pce->info now print the full SDL version.
[Sep 29 2026]
- FIXED: SDL/X11: dropping files on the console or PceEmacs did nothing
Using X11, SDL reports XdndLeave, which is sent before the drop, as
drop_complete. The files follow as a separate drop_begin, drop_file,
drop_complete sequence without a position. We lost the target window
at the first drop_complete and sent the files to the frame. Keep the
window and its last drop position until the next drop_position.
[Sep 27 2026]
- PORT: macOS 10.15: paste from other applications pasted nothing SDL3
asks the pasteboard for text/plain;charset=utf-8, which macOS 10.15
does not map to the type other applications provide (SDL issue #13737).
If that yields "", ask for public.utf8-plain-text directly.
- FIXED: SDL: deliver a file drop to the window that showed the drop hint
SDL gives drop_file, drop_text and drop_complete no position of their
own; they reuse the last drop_position, which a drop_complete resets to
(0,0). Route them to the window that received the last drop_position
instead of looking the window up by position, so dropping files on
PceEmacs no longer sometimes does nothing. When a drag moves to
another window of the same frame, e.g. from PceEmacs to a terminal,
send the old window a drop_complete without files, so it removes its
drop hint.
- FIXED: tab_frame<-members, compatible with frame<-members
@prolog_ide<-current_epilog asked the tab of the current event for
its members, raising a warning and falling back to the last used
terminal when compiling from PceEmacs (C-c C-m, C-c C-b).
[Sep 26 2026]
- PORT: macOS <= 12: crash creating the native menu bar (take two)
-setWindowsMenu: indexes into the Window menu it is given and asserts
if the menu is empty. Fill it with the standard items (Minimize,
Zoom, Bring All to Front) before registering it.
- PORT: macOS 10.15: crash creating the native menu bar -setWindowsMenu:
asserts the menu is part of the main menu on older macOS versions.
Add the Window item before registering it.