Copyright © 2015-2019,2022 by Thomas E. Dickey
This page discusses the variations of Athena Widgets which I have used in xterm and vile.
The original Xaw library, developed by Ralph Swick and Chris D. Peterson, dates back to the late-1980s . The first X release with this library was X.V11R2 in March 1988. It is not as old as xterm (part of X.V10R3 in early 1986).
At Xaw's first release, xterm was linked to Xaw for the scrollbar widget; the header files were still found directly under the X11 directory.
With X11R4 (December 1989), Xaw's header files were installed as a subdirectory of X11. At that point, there were only a few X libraries:
CLX oldX X Xau Xaw Xdmcp Xmu Xt
As one can see from the table, Xaw grew with development until X11R6. In 2004, the improvements and extensions done by the XFree86 project were released as X11R6.7. After that, minor improvements were made. The current version is in Xorg's git.
Although xterm and xvile (the X version of vi like emacs) are different applications (terminal emulator and text editor), they use the same features from Xaw:
Xterm's scrollbar is optional: it can be turned on and off at runtime. A feature of X.V10R4 (December 1986), it predates Xaw. When turning it on or off, xterm resizes its
VT100widget, and shows (or hides) the scrollbar on top of the the
- Popup menus
In xterm, these are actuated by the mouse using shift and control modifiers. The first release with X.V11R2 did not make this configurable with the translations resource. Instead, xterm contained its own state table for mouse clicks. The translations resource, which was introduced in X.V11R3, was short:<KeyPress>: insert() \n\ Ctrl ~Meta <Btn1Down>: mode-menu() \n\ ~Meta <Btn1Down>: select-start() \n\ ~Meta <Btn1Motion>: select-extend() \n\ Ctrl ~Meta <Btn2Down>: mode-menu() \n\ ~Ctrl ~Meta <Btn2Down>: ignore() \n\ ~Meta <Btn2Up>: insert-selection(PRIMARY, CUT_BUFFER0) \n\ ~Ctrl ~Meta <Btn3Down>: start-extend() \n\ ~Meta <Btn3Motion>: select-extend() \n\ ~Meta <BtnUp>: select-end(PRIMARY, CUT_BUFFER0) \n\ <BtnDown>: bell(0) \
- Menu bar
I added optional support to xterm for a menu bar (referred to as a “toolbar” in patch #113) late in 1999. To do this, I changed the widget hierarchy in xterm, adding a level so that the menu bar could be in a form widget.
While it works for me, there are some corner cases in dynamic layout that can break the program. For that reason, I advised against using in Debian #406169 Some packagers (Cygwin, Gentoo and OpenSUSE) offer this feature.
The Xaw3d (three-dimensional) library dates to the 1990s. It is the most well-known fork of Xaw. The current version (starting from an import of Xaw3d 1.5 and 1.5E in 2011) is in Xorg's git. Xaw3d 1.5 was released in May 1998. Following a beta (November 1992), the initial release was 0.6 (March 1993). A few of those older versions could be found here:
but that is defunct, likewise most of the sites listed in X.org's mirrors.
provide only the newer releases. There are a few mirrors which are reasonably complete in 2022, e.g.,
The gitlab repository begins with the last of those snapshots.
The developer's page for XawPlus is long gone, without an archival copy (perhaps since 2010, given the hint in FreeBSD ports, which confirmed that it was not available in September 2011):
Like ftp.x.org, the sources are hard to find. I have collected the sources from the mirror of ftp.x.org mentioned above:
There is a developer's site for neXtaw:
neXtaw is a replacement library for the Athena (libXaw) widget set. It is based on Xaw3d, by Kaleb Keithley and is almost 100% backward compatible with it. Its goal is to try to emulate the look and feel of the N*XTSTEP GUI.
neXtaw was created by Alfredo Kojima, before he started working on -- and became totally absorbed by -- Window Maker. neXtaw was maintained by Carlos A M dos Santos from 1999 to 2001, when I (Ulric) took over.
However it has not been updated since 2003:
I have collected those sources, adding an older version (from the Debian archive):
Support for Xaw in xterm predates my involvement (see above).
I added support for Xaw menus to vile in April 1997.
That was prompted by Philippe Chassany's introduction of Motif menus.
I added support for Xaw3d and neXtaw to xterm in September 1997.
Because they share autoconf macros, this was available shortly after in vile (October 1997).
As a long-term user of Xaw and its variants, I have an interest in keeping those working. One aspect of that entails cleaning up compiler warnings as discussed in my “Lint Tools” page.
In addition to test-builds with different compilers, as outlined in the section on Build-Scripts, I have used scripts build-lib-xterm (since 2003) and build-lib-vile (since 2010) to test xterm and vile with these libraries. The latter also tests building vile with termcap, curses, etc., which is a different topic.
Initially, I found it sufficient to just make a custom build of whatever flavor of Xaw my machine lacked, but after a while realized that a couple (XawPlus and neXtaw) were not generally available via packages. That became more of an issue beginning in 2010 when I switched to development using virtual machines (increasing the number of machines to install and upgrade). Because I was developing test packages for my other programs to ease the installation of machines that I use for checking ports, I did the same for these.
These four libraries are not all the same source:
Xaw started from X Consortium sources, (e.g., X11R6), which provided for compiling with K&R or standard C via ifdef's. That approach led to source code which relied heavily on C's legacy mode (where K&R code sufficed).
Xaw was adopted and improved in XFree86, e.g., ANSIfication (eliminating the K&R ifdef's) in 1998. X.Org uses that version.
For development, I need more than that. I spent the time in 2019 to cleanup stricter warnings dealing with mismatched types (as of December 2022, there are still 480 warnings about const).
Xaw3d also started from X Consortium sources, but while David J. Hawkey, Jr. used the updated version (from XFree86) as a basis for improving Xaw3d, incorporating both ideas and source code for 1.5E (for example Tip.c,), he did not eliminate the K&R ifdef's. That was done by Yaakov Selkowitz in 2011.
As of December 2022, I have not gotten around to fixing the stricter compiler warnings in Xaw3d (there are about 1700).
XawPlus is based on the X Consortium sources.
In December 2022, I spent the time to ensure that all of the functions are prototyped. That cut the stricter warnings from 2500 to 700.
neXtaw is based on Xaw3d.
I spent some time to clean this up in 2015, leaving 85 warnings.
In addition to cleaning up compiler warnings, there are chunks of obsolete code in the libraries which are due to having forked at different points without resyncing from the original code. For instance, a large part of the difference in XawPlus versus the X Consortium releases is due to AsciiSrc.c and MultiSrc.c not having been updated to reflect a newer release.
Though they started from the same point, the layout and configuration of the programs has changed:
Xaw originally had all of the C code in the same directory, e.g., lib/Xaw. While there was documentation in another part of the X source tree, the parts that would be built and installed were in the same place.
Like Xaw, Xaw3d and neXtaw used imake for building. Unlike xterm (which has many optional features), these libraries require only the basic platform-specific configuration details which imake provides.
Since these were not part of the X source tree, they were built using xmkmf to generate a Makefile from the included Imakefile.
Later (beginning in 2001), neXtaw 0.10 replaced the imake configuration with an autoconf script (like xterm — but providing no options).
XawPlus diverged from this pattern. It did not provide an Imakefile. Nor did it provide a configure script. The developer did not use imake, providing only a Linux-specific makefile.
XawPlus moved the header files into a subdirectory, imitating the layout of the installed headers. While this simplified the makefile, it required changing all of the C files to adjust the #include statements. In more than half of those files, XawPlus's developer made no other change than adding a comment stating that it was modified for XawPlus.
Later, other developers provided simple configuration scripts for Xaw (2005) and Xaw3d (2011) to replace imake. Unlike the one in neXtaw, these provided a few options.
Like XawPlus, those developers separated the headers from the C files, putting those in an include-directory to imitate the installed location.
Here are a few tables showing how these related libraries grew over time.
This table shows the growth of Xaw across the X Consortium and X.Org releases:
WidgetClassvariables in the library.
The other data should be self explanatory.
Release Date Text SLOCs Widgets X.V11R2 1988/03/01 14069 13696 18 X.V11R3 1988/10/27 17274 16459 19 X11R4 1989/12/23 29174 28241 32 X11R5 1994/04/26 34064 33659 43 X11R6 1995/01/30 40874 40304 45 X11R6.1 1996/03/12 40711 40141 45 X11R6.3 1997/07/15 40713 40142 45 X11R6.4 1998/04/02 40309 39604 45 X11R6.5.1 2000/08/29 40436 39731 45 X11R6.6 2001/04/06 40883 40178 45 X11R6.7 2004/04/07 58730 56009 41 X11R6.8 2004/09/07 59817 57092 42 X11R6.9 2005/12/21 59997 57252 42
The increase between X11R6.6 and X11R6.7 is due to incorporating changes from XFree86 (mostly from 1998-1999, but as late as May 2003).
The following table summarizes the older versions of Xaw3d. The "difference" is measured with diffstat against the corresponding X release of Xaw, ignoring blanks.
Release Date SLOCs Widgets X Release Difference Added Deleted Modified Equal Xaw3d.R4 1992/11/13 19637 35 X11R4 +5676 -288 !1152 =27349 Xaw3d-0.6B 1993/03/19 22889 50 X11R4 +11155 -701 !2656 =25432 Xaw3d-1.0 1994/07/20 27636 49 X11R5 +16634 -176 !2713 =28800 Xaw3d-1.1 1995/04/03 27651 49 X11R6 +6277 -166 !805 =39709 Xaw3d-1.2 1995/08/25 27826 49 X11R6 +8073 -175 !835 =39670 Xaw3d-1.3 1996/06/03 26469 49 X11R6.1 +5221 -77 !818 =39492 Xaw3d-1.4 1998/04/21 26430 49 X11R6.4 +5045 -151 !1479 =38351 Xaw3d-1.5 1998/05/15 26456 49 X11R6.4 +5083 -172 !1516 =38293 Xaw3d-1.5E 2003/03/09 28510 50 XFree86 4.3.0 +7913 -10841 !18026 =22026
The last entry (for XFree86) is given to show that although Xaw3d used parts from that source, that it was still far from using all of the improvements made by XFree86 developers over the preceding five years.
Release Date SLOCs Widgets X Release Difference Added Deleted Modified Equal XawPlus-2.0 1999/02/17 37351 39 X11R5 +5251 -691 !1763 =30731 XawPlus-2.0.1 1999/04/23 37333 39 X11R5 +5258 -699 !1771 =30715 XawPlus-2.0.2 1999/05/18 37436 39 X11R5 +5396 -718 !1814 =30653 XawPlus-2.1.0 1999/11/16 37839 38 X11R5 +5970 -717 !1928 =30507 XawPlus-3.0 2000/05/07 42771 38 X11R6.4 +5317 -929 !2846 =35299 XawPlus-3.0.1 2000/05/14 42771 38 X11R6.4 +5324 -929 !2846 =35299 XawPlus-3.1.0 2000/09/13 43778 38 X11R6.6 +6152 -889 !2801 =35926
Although the comments in the sources as well as the accompanying sample clients hint that development started in 1996-1997, the oldest available release is 2.0 in 1999. An undated README file summarizes the features of each release.
Release Date SLOCs Widgets X Release Difference Added Deleted Modified Equal neXtaw-0.5.1 1997/01/14 45172 37 Xaw3d-1.3 +2699 -444 !918 =44299 neXtaw-0.9 2000/05/16 46653 37 Xaw3d-1.5 +8088 -514 !919 =43459 neXtaw-0.10 2001/12/13 49780 37 Xaw3d-1.5 +26563 -307 !900 =43178 neXtaw-0.11 2002/01/26 49788 37 Xaw3d-1.5 +38717 -307 !900 =43178 neXtaw-0.12 2002/03/14 49788 37 Xaw3d-1.5 +38305 -307 !900 =43178 neXtaw-0.13 2003/01/15 49887 36 Xaw3d-1.5 +41458 -298 !901 =43186 neXtaw-0.14 2003/02/26 50047 37 Xaw3d-1.5 +41683 -298 !908 =43179 neXtaw-0.14.1 2003/08/22 50033 37 Xaw3d-1.5E +40085 -1821 !1994 =42308 neXtaw-0.15.0 2003/09/02 51228 37 Xaw3d-1.5E +40085 -1821 !1994 =42308 neXtaw-0.15.1 2003/09/19 51267 36 Xaw3d-1.5E +40183 -1852 !2025 =42246
Like XawPlus, the original developer for neXtaw provided an undated summary of changes for each release. Subsequent developers gave dates for their changes, but fewer details.
Survey of Widget Sets by Edward Falk (last updated 2002/02/13)
This page serves as a survey of the various free widget sets written for the X intrinsics. Most of these widget sets are variations on the standard Athena widget set, Xaw.
Xaw — Athena Widgets on X.Org
XawPlus version of the Athena Widget Set documentation.