Dear SWI-Prolog user,
SWI-Prolog 10.1.17 is ready for download. This version is mostly about
the GUI, which now supports switching between light and dark themes while
running and follows the desktop settings. Highlights:
Core
- Loading a .qlf file now notices changes to included, consulted and
dependency files rather than only the main source file. This notably
affects aggregates such as pce.qlf. Also fixes a memory and atom leak
in ‘$qlf_module’/2. - Incremental subsumptive tabling raised a tabling dependency error when
re-evaluating the general table and did not record dependencies for calls
that reuse an existing table. - The flags
color_termandhyperlink_termare no longer saved in a
saved state, so a state determines them from the terminal it runs on.
CLP(Q,R)
- Faster Fourier-Motzkin elimination in dump/3 and projection.
XPCE (GUI)
-
Themes. The colours of xpce are now theme colours that follow the
active theme without restarting. Highlights:- Use Settings/Theme to select “Follow the desktop” or a specific theme.
- The system colours follow the desktop’s light/dark mode and accent
colour on Windows, MacOS, KDE and GNOME, and are reloaded if the
desktop settings change. - The development tools, PceEmacs syntax highlighting and Epilog use
theme colours. The dark theme has been rewritten to define these. - Applications can declare their own theme colours and use
adaptive_colour/3 to make a colour chosen by the user adapt to the
theme. - Documented in the XPCE User Guide and reference manual.
-
The profiler GUI shows a call graph of the current predicate (using
graphviz) and allows filtering the predicates as you type. -
@display now evaluates to the display of the last event, and frames
survive removing the last display, e.g., a MacBook in clamshell mode
whose external monitor goes to sleep. -
Tabs give clear feedback on the active tab, also in dark themes.
-
Fixed dropping files on the console and PceEmacs using SDL on X11.
-
Ported to older MacOS versions (10.15 - 12): fixed crash creating
the menu bar and pasting from other applications. -
Several crash and bug fixes, many reported by Mike Elston.
Enjoy — Jan
SWI-Prolog Changelog since version 10.1.16
-
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 prolog_colour:style/2 hook is replaced by pce_theme: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. -
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
raisedTabling 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. -
FIXED: compile_aux_clauses/1: attribute predicates to the owner
of an included file. -
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. -
ENHANCED: derive
color_termandhyperlink_termfrom 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
-
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
- 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 theoptimiseflag 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
-
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.
-
DOC: Updated XPCE UserGuide frontpage
-
DOC: describe precisely when themes use the system colours Only
the roles, the ui_ colours that have a sys_, 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 variablevaluehid 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. -
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 incurrentColoris 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_
now has a theme colour ui_ 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
pce_theme: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
pce_theme: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. -
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_ (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 tomax_widthpercent
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
\nrather than a line break Graphviz
passes the escapes of its escString type through to the tooltip.
Translate\n,\l,\rand\\. 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. -
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) asksprolog_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 10000Major+100Minor+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. -
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. -
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). -
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.