Barium, the native Common Lisp X toolkit, has unveiled its substantial 0.2 release following ten weeks of intensive development. This iteration introduces critical GUI components and architectural enhancements that elevate its viability for building complex desktop applications entirely in Lisp—without relying on foreign toolkits.

Core Widgets Mature

The release debuts menu systems supporting hierarchical navigation, hotkeys, icons, and dynamic interaction models. Menus can be embedded in window bars or triggered contextually, defined via recursive descriptors.


alt="Article illustration 1"
loading="lazy">

Layout complexity is streamlined through panes (horizontally/vertically resizable subdivisions) and notebooks (tabbed container widgets). These enable intuitive UI organization, demonstrated in examples like nested pane structures


alt="Article illustration 3"
loading="lazy">

and customizable tab interfaces

alt="Article illustration 4"
loading="lazy">

.

Dialogs and Event-Driven Architecture

Prebuilt dialogs for messaging


alt="Article illustration 5"
loading="lazy">

and file selection reduce boilerplate. The file chooser supports filters, hidden-file toggling, and freeform path entry—critical for "Save As" workflows.

Most notably, Barium’s event loop is now a first-class object. Developers can register handlers for:
- File descriptor I/O events
- Periodic/deferred timers
- Idle tasks

This enables single-threaded, event-driven architectures—avoiding concurrency complexities while handling GUI and I/O events efficiently. A chatroom demo illustrates multiplexed socket handling within the main thread.

Shell Integration and Optimization

The new ba-ext:shell facility executes external processes with I/O streams integrated into the event loop via file descriptors. This allows asynchronous command interaction without blocking the UI.

Performance gains include:
- Cairo text-extents caching (reducing CPU load during text reflow)
- Scrollbar typematic repeat via timer events
- Focus model alignment with standard window managers

Breaking Changes and Refinements

Significant API shifts include:
1. Removal of the refresher class; refresh logic now uses event-loop timers.
2. Key handlers must return booleans indicating event consumption, enabling localized key overrides.

Grid widgets now support aspect ratio constraints for child elements, and double-click detection synthesizes temporal/positional button patterns into discrete events.

Forward Momentum

Barium’s evolution signals growing maturity for Common Lisp in GUI development. Creator Tomáš Čech emphasizes upcoming real-world applications, including ChessLab, to demonstrate toolkit scalability. The release strengthens Lisp’s position for native desktop development, prioritizing efficiency and developer control.

"Running all code in a single thread avoids the many traps and complexities of coordinating between threads and makes the program much easier to reason about. It is also the best design for high performance applications!" — Source blog post

Explore examples and installation via the Barium Gallery.

Source: Barium 0.2: What's new by Tomáš Čech