A GUI toolkit for Common Lisp


McCLIM 0.9.8 "Yule" release

Written by Daniel Kochmański on 2023-12-27 13:00

Dear All,

After over 5 years of development we've decided to make a release. The last release version "0.9.7 Imbolc" dates to 2018. Yule is a Germanic Midwinter festival that was later incorporated into Christmas.

This release is long overdue. The reason for that is because we've wanted to have too many things finished in it - I'll elaborate on these later. This release would not happen without contributions from many people who wrote code, reported bugs and provided guidance to beginners.

Changes

Here is the list of commiters and the number of commits since the last release:

Daniel Kochmański (1667), Jan Moringen (582), Elias Mårtenson (182), Nisar Ahmad (90), Andrea Demichele (89), Cyrus Harmon (62), José Ronquillo Rivera (18), Christoph Keßler (18), Eric Timmons (16), death (12), Robert Strandh (11), Phil Mueller (7), Henry Harrington (5), hes (5), chuchana (4), Karsten Poeck (4), Jingtao Xu (3), Pouar (3), bmansurov (3), contrapunctus-1 (3), Charles Zhang (2), Fred Gilham (2), contrapunctus (2), duuqnd (2), goose121 (2), Howard Shrobe (2), Alan Zimmerman (1), Dirk Eßer (1), Ingo Krabbe (1), Javier Olaechea (1), Jeremiah LaRocco (1), John Lorentzson (2), Knut Olav Bøhmer (1), Kyle Nusbaum (1), Mark Evenson (1), Nathan Shostek (1), Philipp Marek (1), Tarn W. Burton (1), William S. Annis (1), crunsk (1), luyiranl2010 (1), modula t. worm (1), ormf (1), rainthree (1), steiner (1), Неточка Незванова (1).

A few opinionated feature highlights that may be interesting to users:

  • The new inspector Clouseau written by Jan Moringen
  • Inclusion of the Freetype renderer by Elias Mårtenson
  • New extension "mcclim-dot" by Eric Timmons (graphviz layout for graphs)
  • Rewrite of the X11 renderer and a new SVG backend by Daniel Kochmański
  • Many important UX improvements by Nisar Ahmad and Andrea Demichele

Here is a more complete (yet still incomplete and more noisy) list of changes. For more details please consult the repository history log.

  • Listener UX improvements
  • Refactor command tables and commands parsing
  • Refactor of the sheet and the mirror implementation
  • Numerous new examples
  • Unification of CLX backends into a single system
  • bugfix: TTF font caches do not overlap between backends
  • Add an alternative (not default) TTF renderer based on FFI to FreeType
  • bugfix: address numerous issues in tab-layout
  • Improved support for text transformations
  • Bundle cl-dejavu fonts as a dependency
  • Portability fixes for CL implementations
  • Better separation of responsibilities between sheets and mediums
  • TABLE-FORMATTING improvements
  • Support for system clipboard and for internal selection
  • Remove invalid assumptions about the sheet coordinates while scrolling
  • Full rewrite of CLX renderer to use XRender (transparency, transformations, clipping)
  • Incremental redisplay partial rewrite and bug fixes
  • UX imrovements for gadget states with regard to pointer events
  • Bug fixes and conformity improvements for PS and PDF backends
  • Pull bezier curve and bezier area extensions as core regions
  • Improved set of colors for MAKE-CONTRASTING-INKS
  • Improved set of patterns for MAKE-CONTRASTING-DASH-PATTERNS
  • A new protocol for handling patterns, transformations and arbitrary designs
  • Rewrite mcclim-render extension
  • Enable rendering directly to the pattern or a raster file
  • Flesh out the protocol to implement indirect inks
  • Remove obsolete backend "beagle"
  • Rewrite of the demo DRAWING-TESTS
  • Improved support for arcs, angles and ellipses
  • Geometry module partial rewrite - conformance and performance improvements
  • Improved class hierarchy for input events
  • Space requirements rewrite to allow specification of padding and margins
  • Menu bar rewrite to handle keyboard accelerators and arrows
  • Remove runtime overhead from protocol classes
  • More conforming handling of line style unit
  • Introduce the concept of a page with four margins
  • Implement word wrap and extend FILLING-OUTPUT and INDENTING-OUTPUT macros
  • Rewrite PRESENTATION-SUBTYPEP and PRESENTATION-TYPEP for conformance
  • Much faster TTF renderer, implement kerning and tracking, thread safe rendering
  • Pixel-perfect FONT-TEXT-EXTENT implementation for the TTF renderer, transformations
  • Gadgets UX improvements for both space composition and event handling
  • Better PRINT-OBJECT methods for numerous internal objects
  • Rewrite EVENT-QUEUE for thread safety and performance, extend TIMEOUT interface
  • Fix McCLIM regression to work on non-SMP systems
  • Improved parsing for space requirements
  • Rewrite the implementation of mapping between text styles and fonts
  • Refactor of the EXTENDED-INPUT-STREAM
  • Add numerous missing ACCEPT-PRESENT-DEFAULT methods for dialog-views
  • Improved repaint-sheet handling (less repaints, more performant)
  • Improvements to numerous presentation methods in functions ACCEPT and PRESENT
  • Presentation translator lookup rewrite
  • Selection API can carry arbitrary presentations with "paste" translators
  • Extensions documentation in manual, various fixups and improvements
  • Specification clarifications in the bundled latex source code
  • Implement double buffering in the CLX backend
  • New protocols to set the frame (and sheet) pretty name and icon
  • Refactor mirrored/non-mirrored event distribution and add synthetic events
  • Rewrite pointer tracking, pointer grabbing and drag&drop support
  • Include the new inspector "Clouseau" with bundled applications, remove old the inspector
  • Put Franz-specific extensions to the system "mcclim-franz"
  • A new command parameter OUTPUT-DESTINATION to redirect the command output
  • Improve frame and panes definitions to allow dynamic reinitialization
  • Improve PROCESS-NEXT-EVENT specification and implementations for clarity and completness
  • It is possible to define a presentation to command translator with the argument
  • Rework accepting values to remove a few kludges
  • Refactor FORMAT-GRAPH-FROM-ROOT and the layout algorithm for correctness
  • Numerous cleanups to avoid accessing internal symbols and have a clean file structure
  • Introduce the presentation BLANK-AREA (similar to NULL-PRESENTATION) that allows parameters
  • Provide an uniform interface for mapping over command table menu items and keystrokes
  • Improve the protocol for defining new ports (backends)
  • Allow for existence of ungrafted mediums
  • Allow runtime replacement of the menu bar in the frame
  • Better separation of responsibilities between frames and frame managers
  • Improved gesture and event matching that allows wildcards
  • Minor integrations between CLIM-DEBUGGER and Clouseau
  • Removal of numerous internal obsolete interfaces
  • Thread-safe implementation of the function EXECUTE-FRAME-COMMAND
  • Better support for repeated grafting and degrafting sheets (migrating frames between backends)
  • Implement a new backend that creates SVG documents
  • Introduce a new macro for drawing backends CLIME:WITH-OUTPUT-TO-DRAWING-STREAM
  • Include a new extension "mcclim-tooltips"
  • Include a new extension "mcclim-dot"
  • Write new implementation of text-field and text-editor gadgets (with pointer selection etc)
  • Allow for preloaded fonts in the application image
  • Flesh out important protocols useful for writing new backends
  • Add a new gesture types :TIMER, :INDIRECT, :POINTER-MOTION and :POINTER-SCROLL
  • TTF renderer consults the graft DPI to decide on the font scaling

Work-in-progress features

I've mentioned some features that I've wanted to include in this release - that delayed it by over two years. I'll elaborate on them now, because they are all in a quite advanced "work in progress" state:

SDL2 backend

The SDL2 backend is an alternative backend that is meant to work on platforms that do not feature X11. It is mostly complete, but since SDL2 text input has a bad protocol, we need to rely only on keyboard events. To handle text correctly we need to transform them to text.

The current version of the backend features the software renderer. Hardware acceleration will come after that. In parallel I'm also writing a manual for developers that explains how to write new backends.

Keyboard layouts

CLX does not implement the XKB protocol. That means that McCLIM applications don't benefit from keyboard layouts. To address that I'm writing a library that parses xkb definitions and implements layouts like the project xkbcommon does. Such library will also enable the SDL2 backend (see above).

Input editing streams rewrite

McCLIM implements interactive stream handling with help of Drei. I've already written the new input editor that is better integrated with the system and it is used to implement gadgets. Integrating this editor with streams will enable improvements to the command line processor and accepting values streams.

Separate repaint queue

I've already made a few prototypes that implement animations using a separate repaint queue. They show a nice performance of 400 FPS. The biggest win will be that the input processing and the sheet repaint will not block each other.

Closing remarks

McCLIM improves on daily basis and we hope that this trend will continue. I'm sorry for dragging the release - I'll try to make releases more often so that changes may be fleshed out in more details and on more timely basis. I'd like to thank all contributors and people who supported us along the way.

I'd like to wish you all a Happy New Year :-)

download

Best regards,
Daniel Kochmański