Did you know ... Search Documentation:
Title for pldoc(default)
Branch: development (switch to stable),
version to version

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.