The Nano-X Window System

Source Code
Git Repository
Screen Shots

Nano-X SDK
Nano-X PDF

Nano-X Tutorial
ELJ Intro I
ELJ Intro II

Embedded Linux
ViewML Project
Linux Devices
Linux Today

Century Software

Linux 7110

Greg Haerr


The Nano-X Window System is an Open Source project aimed at bringing the features of modern graphical windowing environments to smaller devices and platforms.  Nano-X allows applications to be built and tested on the Linux desktop, as well as cross-compiled for the target device.  The Nano-X Window System was previously named Microwindows, but has been renamed due to conflicts with Microsoft's Windows trademark. There are two APIs implemented in the system, a Win32 API and an Xlib-like API.  Please read the FAQ for more information.  An extensive Architecture document is also available. Check out the Articles that have been written about Microwindows in the left sidebar.  To get involved, please join the Nano-X mailing list.  There is a full mirror of the mailing list accessible here.


New Nano-X Engine Architecture Preview

December 15, 2010
There has been much work on the internals of Nano-X, which are now running well enough for a preview of this upcoming release.
Following is a summary of the changes currently in the Git Repository:

New Ports

o MAC OSX 64-bit X11 port
o MoSync port

New Features

o Processor and framebuffer independent compositing with internal RGBA 32bpp pixmaps with display on 8/15/16/24/32bpp truecolor displays.
o Hugely faster display of font and image data using blit rather than per-pixel drawing.
o Entirely new driver architecture uses fast conversion blits for all display of font and image data. Subdrivers for 1/2/4/8/15/16/24/32bpp have no control branches in inner loops for highest speed. For systems without framebuffers, like desktop X11 for testing, all image data is computed using framebuffer subdrivers, and then blitted once to final display using an automatic graphics Update() operation. For systems with framebuffers, drawing is done directly to screen for speed, with support for future "buffered" windows for late-stage final compositing.
o All conversion blits support all portrait modes, stretching, raster ops and srcover alpha blending.
o GdArea, GdReadArea, GdBitmap and all fonts use fast conversion blits.
o New conversion blits can be added for speed for specific systems, and slower draw code is still available for 1/2/4/8bpp palette systems.
o Most image loaders (png, jpg, etc) read into internal RGBA format for easy use in compositing and alpha blending.
o Runtime auto-portrait mode switching now possible without application image recomputation requirements. (bin/nano-X -A)

New Driver Architecture

o All drivers are endian-neutral with only Read/DrawPixel, DrawV/Hline and Blit entry points.
o New conversion blit implementation uses static inline functions for high speed, and ease of adding new framebuffer or image data formats.
o RGBA image data format available regardless of framebuffer.
o X11 driver can emulate 8/15/16/24/32bpp displays using same codepath as target.

Nano-X API Changes

o GrNewPixmapEx takes new parameter for image data type: MWIF_RGBA8888, 32 and 0 for hardware framebuffer.

Win32 API Changes

o Added CreateDibSection, GetLastError, SetLastError, RegisterHotKey, UnRegisterHotkey

See src/ChangeLog.txt for details, and make sure to try out the new demos, and!

There is also a snapshot tarball available:

Have fun! - Greg

Nano-X Version 0.92 Released

June 11, 2010
The Nano-X Window System version 0.92 has finally been released from the GIT repository as of June 11, 2010.
As usual, it is available from the website:

This release has been a long time in coming, and has a large variety of enhancements, speedups, and bug fixes.
Following is a short summary:

New Ports
o Tomtom Linux port
o Sony PSD port (RGBA framebuffer support)
o 64-bit support (nano-X only)
o Linux AVR32 target
o Linux Blackfin target
o RTEMS 4.10 target
o iPod Linux target

New Features
o FBE - Frame Buffer Emulator, allows simulation of 1,2,4,8,15,16,24,32bpp framebuffers on X11. Microwindows writes a shared memory framebuffer and the separate fbe process updates the display. (bin/fbe -c -d)
o Alpha channel/blending supported in image drawing and loading routines
o RGBA framebuffer support
o Large number of patches and bugfixes applied
o Freetype 2 and T1LIB fonts supported by all drivers

Font Subsystem
o FT2 and T1 font drivers now use fast blit for drawing, previously pixel-by-pixel
o Scaling by width and height now supported (previously height only)
o Freetype 2: many bug fixes, support for v2.3.9+, caching works
o All drivers (1/2/4/8/16/24/32bpp) support T1 and FT2 fonts in non-aliased blit drawing
o T1 and FT2 anti-aliased blit drawing supported in 8/16/24/32bpp blits
o Font drawing supported in all portrait rotations for all drivers
o Freetype 1 driver deprecated - use FT2 v2.3.9+ instead
o Many fixes to PCF font loader
o Partial Hanzi Bitmap Font support
o Enhanced Korean KSC5601 support

Driver Updates
o Added portrait handling to X11 driver
o Rewritten and fully implemented alpha blending code in 16/24/32bpp drivers
o Speedups, cleanups in all drivers and bugfixes in 24bpp, 16bpp, XOR handling
o Added 1 and 2bpp inverse black/white, 4bpp low nibble first handling (REVERSE=Y)
o DrawArea routine supports PCF/FT2/T1 fonts in 1/1R/2/2R/4/4R/8/15/16/24/32bpp, and in all portrait orientations (non-aliased only in 1-4bpp)
o Improved StretchBlitEx routine supports all portrait modes
o Deprecated old StretchBlit routine
o Added WDTV sigma 863x drivers
o Added 18bpp (RGB666 LSB) driver for ARM PXA270

Win32 API Additions
o Many fixes to internal controls - scrollbar, listbox, button, edit
o Caret blinking
o Right-to-left rendering w/shape joining
o Add GetTextColor, MulDiv, GetWindowFromPoint, GetDlgBaseUnits, WM_COMPAREITEM, MessageBox, MessageBoxIndirect, SetWindowPlacement, DeferWindowPos, GetWindow, SW_MAXIMIZE, GetTextAlign, TA_CENTER, EnumFonts, EnumChildWindows, GetClassName, GetNextDlgGRoupItem, CreateDialog, DialogBox, FindResource, LoadResource, LoadString, Get/SetDlgItemText, CheckDlgButton, MapDialogRect, SystemParametersInfo, Get/SetProp, GetMenu

Nano-X API Additions
o GrResizeWindow enhanced so no unmap required
o GrMovewindow enhanced to use screen blit
o GrDrawImagePartTofit - stretchblit portion of image to destination
o GrCopyEvent, GrFreeEvent - for use with CLIENT_DATA events
o UNIX98 PTY support for nxterm
o Pixmap window background support

Nano-X Window Manager
o Allow window resize by dragging bottom right corner
o Can disable window resizing with WM_PROPS_NORESIZE
o Can link with server rather than run as separate process

Following is the detailed ChangeLog:

11 June 2010 (Version 0.92)
* fix freetype 2 off-by-one height bug (ascent + descent != height)

10 June 2010
* added capabilities flag word in font subdriver for h/w scaling
* use new freetype2 scaler cache api (>= v2.3.9) (Johannes)
can now compile freetype 2 without FT_CONFIG_OPTION_OLD_INTERNALS
* fix ncolor assert in fblin24.c

26 May 2010
* fix nanowm cursor to resize in window bottom right to indicate resize
* added window x,y and root window rootx,rooty to GR_GENERAL_EVENT
(mouse enter event should be a mouse event, not general event)
* added WM_PROPS_NORESIZE window property to disallow window resizing

24 May 2010
* rewrote adobe type1 (T1LIB) and truetype (freetype2) font subdrivers to use fast blit
blit project halfway done - will move GdBitmap to driver blit for PCF/CORE fonts
will remove/replace PSDOP_* and and combine drawarea/blit driver routines
all drivers will support mono lsb/msb and blendfgbg blit, meaning all fonts supported
* wrote drawarea_bitmap_bytes_lsb_first (t1lib) rotations for all fbportrait_xxx.c
* rewrote adobe type 1 font driver (font_t1lib.c), new fonts/type1 dir
added T1LIB_FONT_DIR to config (defaults fonts/type1)
requires blit_mono_byte_lsb routine in drawarea
* added width and height scaling to t1lib and freetype2 fonts (was height only)
added width parm to GrCreateFontFromBuffer, GrCopyFont
use GrCreateFontEx, GrSetFontSizeEx to set height and width for scaleable fonts (t1,ft2)
* freetype2 driver uses TTFONTDIR environ var for default font dir
* freetype 1 driver deprecated - use freetype 2 instead
* fix .fnt loader padding bug (again)

23 May 2010
* split engine/devdraw.c into engine/devblit.c for blit changes
* major driver reorganization, DrawArea parameters change
* rename MWMODE_xxx modes to MWROP_xxx, change MWROP_SETTO1 to MWROP_SET
* rearrange device.h and mwtypes.h for more exportability info in mwtypes.h

23 May 2010 - Ludwig Ertl
scrollbar various fixes, SB_THUMBTRACK
listbox fixes w/scrollbars, WM_CTLCOLORLISTBOX
added newlistbox.c from ReactOS (GPL only, not used by default)
replace Draw3dButtonRect with Draw3dUpDownState
rewrite mwDrawTextOut/mwDrawText heavily, internal prefix/& support
add #if OLD_DRAWTEXT for old drawtext code
no need for mwCheckUnderlineChar special drawing, button.c modified
add GetTextColor, Muldiv, WindowFromPoint, WM_SETREDRAW
remove GetDlgBaseUnits (replaced by GetDialogBaseUnits)

21 May 2010
* fixed applyOp4 off-by-one bug (affects XOR+ blits), applyOp2/3 (fblin16 v/h draw)
* started 64 bit compatibility, requires (uint32_t and int32_t)
* fix map non-existent char to default char with PCF fonts, port to 64 bit
* fix space glyph width bug with PCF fonts (negative leftBearing still not handled)
* fill background in FT2 when usebg set (done again in alphacol driver for charbox)

13 May 2010
* fix bug in non-MWMODE_COPY blit in fblin32/32a/24/18 and X11 drivers

2 May 2010 - Ludwig Ertl
* check hdc NULL in mwTabbedTextOut fixes crash in mwdvetest
* enhanced DT_CALCRECT for multiline text
* dialog enhancements: pressing RETURN or VK_MBUTTON now pushes button w/focus,
CreateDialogIndirectParam, DialogBoxIndirectParam, GetDialogBaseUnits,
* added MessageBox, MessageBoxEx, MessageBoxIndirect, MessageBoxTimeout
from ReactOS (GPL only)
* ShowWindow always shows window except on SW_HIDE
* pressing RETURN or VK_MBUTTON now pushes button w/focus

1 May 2010 -
* added stretchblitex to left/right/down portrait modes
* add stretchblitex to fblin8, stretchblit test to ft2test.c
* deprecated StretchBlit screen driver entry point and GdStretchBlit
use GdStretchBlitEx, StretchBlitEx screen driver entry point
* added 15, 16, 24 and 32bpp to fb emulator, fix bug in fblin24 blit/alphacol
* fixed bug in fblin24 reversed b/g colors when alpha 0 and usebg

29 April 2010 - Greg/Ludwig
* added SetWindowPlacement, GetWindowPlacement, BeginDeferWindowPos,
DeferWindowPos, EndDeferWindowPos, GetWindow, GetMenu, GetForegroundwindow,
SW_MAXIMIZE, SW_MINIMIZE, workarea maximize, partial WM_SYSCOMMAND,
dialog maximize via CS_DBLCLKS, MWKEY_ACCEPT, FillRgn (Ludwig)
* added drawarea_bitmap_bytes_msb_first to fblin4rev.c, fixed MWROP blit bug
* fix bug in linear24_alphacol, not blending properly, added ft2test.c pgm
* speedup fblin1/2, wrote msb_first drivers for fblin2/2rev
* add fblin1rev.c drawarea_bitmap_bytes_msb_first (Vladimir)
* dynamically allocate buffers in GdGetTextSize, GdText, and GdConvertEncoding

28 April 2010 - Ludwig Ertl
* changed BM_SETIMAGE and STM_SETIMAGE to use lParam in button/static
* add SystemParametersInfo, non-overlapped workarea feature
* add GetProp, SetProp, RemoveProp window property routines
use these rather than window userdata
* rewrite KillTimer to allow deleting currently executing timer
* fix free szExecCommand in mwFreeInstance
* fix mwFindResource endless loop on last resource when closed resfile
* rewrite peekmessage loop in windlg.c with getmessage
* replace sscanf with strtoul in windlg.c
* fix BS_RIGHT style in button.c
* added BS_PUSHLIKE button style

27 April 2010 -
* speedup fblin8/4/2/1 drivers, no asserts by default
* speedup 4bpp drawarea_bitmap_bytes_msb_first with linear4_drawpixelfast
* wrote drawarea_alphacol for 8bpp fblin8.c (FT2 antialiased output)
* change back FIRSTUSERENTRY to 256 for palette mode and fbe in non ALPHABLEND
* added bin/fbe (demos/fbe.c), frame buffer emulator on X11 for 1, 2, 4 and 8bpp!
to use set default BPP/XRES/YRES in drivers/scr_fb.c, FBEMULATOR=Y in config
run FRAMEBUFFER=/tmp/fb0 bin/fbe -d
reverse bit order supported for 1,2,4 bpp (-r option)
* removed EMBEDDEDPLANET and TPHELIO special cases in scr_fb.c

26 April 2010 -
* fixed FT2 non-antialias (bitmap) display in left/right/down portrait
* implemented drawarea_bitmap_bytes_msb_first in fbportrait*.c
(current requires bitmap rotatation)
* wrote rotate bitmap 1bpp left/right/down routines
* fix mask bug in drivers/fblin1rev.c (Vladimir)
* generalize portrait routines, add gen_setportrait, gen_mapmemgc
portrait mode should work with most any screen driver
by adding gen_setportrait scrdev entry and setting psd->orgsubdriver
* add portrait mode to X11 screen driver

Version 0.92RC4 - 11 April 2010 -
* fixed drawarea_alphacol driver for right/left/down portrait
(freetype2 w/anti-aliasing now works right/left/down)
* speedup fblin32/16 drivers, no asserts by default
* add partial Hanzi Bitmap Font support (hbf.c, genfont.hbf.c)
* add WDTV sigma 863x drivers scr_smp863x.c, scr_em86xx.c
* fix invalid event return on mou_tslib.c driver (Kave Dai)
* finally correct muldiv255 macro, moved all to include/device.h
* update alpha channel with muldiv255
* fixed bad free in GrSetSelectionOwner

1 April 2010 (Foedrowitz)
* revised GsCheckCursor() handles grab window differently
* inherit cursor from parent window(s)
* revised GrMovewindow screen blit move algorithm
* rewrite GrResizeWindow so no unmap required
* add GrCopyEvent, GrFreeEvent, must use for CLIENT_DATA events
when GrPeekEvent or GrPeekWaitEvent called, as data later freed

31 March 2010
* remove obsolete.c from engine/, fonts/, drivers/
* cleanup fblin32.c, fblin32alpha.c, fblin24.c, fblin16.c, fblin8.c
* rewrite alpha blend code in fblin32.c, fblin32alpha, fblin24.c, fblin16.c
* change alpha calc in drawarea alphablend routine to a+1 from a+(a>>7)
* remove bad background draw on ft2 rotated fonts
* fix draw background for ft2 fonts when usebg=1 in alphablend drawarea driver
background is now drawn only for char glyph bbox, not entire text bbox
* added underline for non-rotated ft2 fonts

23 March 2010
* use macros for alphablend in GdDrawImage, default fast inc/shift method
* cleanup fblin*.c code
* fix PCF/FNT and core font gettextsize to display default char if out of range
* added test RGBA tif file strike.tif
* fix bitfield order declarations for big endian GdDrawImage w/alpha (Sung Joo)

11 March 2010
* changed win32 BUTTON control to get/put longs on longword boundary
* add -DARCH_NEED_ALIGN32 to CFLAGS for PSP port fix
* special thanks to YuTao for debugging PSP port!
* cleanup mdemo.c for various options (for PSP port debug)

Version 0.92RC3 - 9 March 2010 -
* remove assert(cncolors) check in fblin32.c, allow nonzero alpha
* careful edit of GdDrawImage for handling image draw w/alpha channel
* change many comments to clarify framebuffer and longword A,R,G,B order
* add new MW_TRUECOLORABGR ABGR pixel format (RR GG BB AA LE framebuffer)
* Sony PSP port using 32bpp ABGR pixel format (Jim Paris -
great port and ABGR fb format by Jim Paris, untested in this version

7 March 2010 -
* added back MWIMAGE_ALPHA_CHANNEL flag to tiff decoder (untested)
* fix inconsistency with PNG GdDrawImage w/alpha ARGB order (Byun Sung Joo)
* nanowm enhancements: moved to library, wm_handle_event/wm_init api,
added to apps in LINK_APP_INTO_SERVER case when NANOWM=Y,
window close on button up, NO_CORNER_RESIZE, NO_AUTO_MOVE options,
GR_WM_PROPS_NORAISE and NOMOVE supported in container bits (Johannes)
* GrGetWMProperties now returns malloc'd props.title in NONETWORK case
* fix long offset for win*.c fonts, fix GsAcceptClientFd close()

21 February 2010 -
* widen space char width in PCF font decoder (usually was 1 pixel wide)
* fixed clipping code for pixmaps with offsets (Johannes)

30 January 2010 -
* added PACKEDDATA structure attribute/define for packed data structs
* fixed BMPHEAD packing for screen.bmp files, add portrait mode (Steven)
* fix to support clipping for shaped windows with borders (Byun Sung Joo)

Version 0.92RC1 - 24 Jan 2010 -
* fix multithread bug: allow other threads to run while in select: (Robert)
* unlock lock around client.c::select() (test in demos/nanox/threadtest.c)
* finalized Linux default UNIX98 pty support for nxterm, reformatted heavily
* added ngterm terminal type and TERMCAP environment string to nxterm
* implement alpha channel using C bitfields in GdDrawImage (Byun Sung Joo)
* add nxview -p for background pattern, -s for window half screen size

11 January 2010 -
* added to test problem helvB12_lin.pcf.gz and large pcfs
* cleaned up defines for RTEMS, __ECOS, LINUX

10 January 2010 -
* clear background in freetype 2 rotated text (Junior)
* turned back on auto caching for Freetype 2.3.x (tested 2.3.9) (Riaz)
* fixed bug in applyOp2/3/4 macros affecting 16bpp non-copy drawing (Uwe)
* added GetTextAlign, implemented TA_CENTER, TA_RIGHT (Uwe)
* removed createfont fail verbose messages
* faster fillrect in genmem.c when portrait mode
* added 18bpp (RGB666 LSB) framebuffer support/driver ARM PXA270 (V Brach)
* enhanced korean KSC5601 dbcs support, modified jo16x16.c font
* enhanced nxterm w/cursor key support, started UNIX98 /dev/ptmx support
* vncserver patches (still broken), updated snap_jpeg for palette support
* added tomtom support and mouse driver

9 January 2010 -
* fix copyright notice sscanf in convbdf.c
* fix off-by-one in GdFillPoly (Foedrowitz)
* added Linux tslib driver TSLIBMOUSE=Y (/dev/input/event0) (Daniel)
* added Linux AVR32 target support (Daniel)
* added Linux Blackfin target support
* fixed bug in pcf font subdriver, added test helvB12_lin.pcf.gz test
* test and update src for latest png, tiff, t1lib, libz libraries
* add patches for RTEMS 4.10 support (Joel and Roxana)

21 January 2008 -
* fix .fnt.gz loader padding bug

6 January 2008 - neuros patches from Vladimir
* add generic window message send GrSendMsg, GR_EVENT_MSG, GR_EVENT_MASK_MSG
* add alpha channel handling in GdDrawImage, alpha support in PNG loader
* fix bug in GdGetNextTimeout
* add GrDrawImagePartToFit - draw image from part of source image
* add MWMODE_SRCTRANSCOPY support in fblin16, applyOp{3,4} macros for speed
* remove #include in clientfb.c, PAGE_SIZE now internal
* fix GsWpDrawBackgroundPixmap to work with pixmap window backgrounds

30 November 2007
* fix ftell in FNTGZ font subdriver
* port AGG AntiGrain Geometry, NXLIB and direct hw fb version
* add MWPF_HWPIXELVAL run-time pixel type to allow no-translation GrArea
* add back in low level psd->DrawArea for fast GdArea
* rewrite GdArcAngle to fix bug w/small angles, no fp required
* add font file parameter to fontdemo

9 September 2007 -
* fix EPRINTF for gcc 3.x (Petr)
* fix ft1 return on zero height/width characters (Alexander)
* fix GrNewBitmapFromData pad when byte swapped (Martin)
* break GrBitmap requests into MAXREQUESTSZ size packets (Martin)
* fixed freetype2 font rotation, baseline, compile w/cache off bugs
* added support for freetype2 2.3.5 (forces cache off for now)

22 June 2006 -
* added complete rop processing to fblin4.c 4bpp driver

21 April 2006 -
* obtained permission to convert stretchblit code from LGPL to MPL

20 December 2005 -
* added support for 16bpp 5/5/5 and 5/6/5 images to GdDrawImage (Greg)
* added support for 16bpp and 32bpp .bmp files

10 November 2005 -
*src/include/mwtypes.h: include ecosmwconfig.h under eCos
*src/drivers/kbd_rtems.c: use kbd.mode for supporting keyrelease events under eCos
*src/engine/dev_open.c: disable GdCaptureScreen() under eCos
*src/ecos/cdl/: update microwindows.cdl
*src/ecos/: add eCos specific files (support for qvfb, mw uid and WinMain)

9 November 2005 -
*src/demos/mwin/mdemo.stretch.c, mdemo.c: change #ifndef ELKS to #if !ELKS
*src/mwin/winmain.c: enable the RTEMS code for eCos, change MwSelect() to MwSelect(BOOL)

7 November 2005 -
* src/include/device.h: guarded some defines, so that they are not redefined
if they are already defined (as it is the case in the eCos port) (Alex)

17 October 2005 -
* src/drivers/kbd_rtems.c and mou_rtems.c: fix a null pointer crash in
MWKbd_GetModifierInfo() and prepare both files for usage under eCos (Alex)

7 October 2005 -
* src/engine/error.c: use diag_printf() for error reporting under eCos (Alex)

5 October 2005 -
* src/include/swap.h: removed dependency to network stack under eCos (Alex)
* src/engine/selfont.c: removed wrong and unnecessary select_font() declaration (Alex)
* added support for BGR233, backport from the eCos port (Alex)

23 June 2005 -
* reduced mem size, const for text section, static for size (David)
* cleaned up David Bell's copyright notice with permission
* added GrQueueLength, GrGetTypedEvent, GrGetTypedEventPred for
* fixed DT_RIGHT in MwDrawText,
invalid hwnd in SendMessage & MWGetTopWindow (Jochen)
* added Gabriele's test .rc -> .c conversion tool: contrib/makedlg
* added Gabriele's win32 api enhancements test pgm: demos/mwdvetest
added accid___.ttf, VAGROLN.TTF test fonts,
Bitstream Cyberbit unicode font (13Mb) and
other truetype fonts are downloaded automatically on make
* reformatted windlg.c,newedit.c,winres.c,winresbmp.c,listbox.c,static.c
* added right-to-left rendering w/shape joining (Gabriele)
MwSetTextCoding sets default text coding for non wide char fns
* added --no-whole-archive option to leave .so's dyn-linked (Hinko)
* fixed alpha blending demo when nEraseBkGnd zero
* added extremely extensive enhancements to win32 API: (Gabriele)
- New Dialog features:
- Added function EnumFonts
- Added function EnumChildWindows
- Added function GetClassName
- Added function GetNextDlgGroupItem
- Added functions CreateDialog, CreateDialogParam, DialogBox, DialogBoxParam
- Added functions IsDialogMessage, SendDlgItemMessage
- Added functions FindResource, LoadResource, LockResource,
UnlockResource, FreeResource, LoadString
Can read dialog, string and bitmap resources from .res file
- Added function resLoadBitmap, that loads a bitmap from resource file in
- Added functions Set/GetDlgItemText, Set/GetDlgItemInt.
- Added functions IsDlgButtonChecked, CheckDlgButton. Fixed CheckRadioButton.
- Added functions GetDlgBaseUnits, MapDialogRect
- Implemented DrawFocusRect fn for controls focus highlight.
- Implemented WM_SYSCHAR message
- Implemented controls navigation for DIALOGS (arrows and tab).
- Implemented controls accelerator character (symbol '&' before character).
- New Control features:
- Static control: implemented WM_SETFONT message. The SS_BITMAP style shows bmp.
The text for non SS_SIMPLE static control is automatically wrapped as needed.
Implemented the WM_CTLCOLORSTATIC and fixed the SS_xxFRAME and SS_xxRECT styles.
- Button control: implemented WM_SETFONT and fixed mouse release outside bug
- Listbox: implemented WM_OWNERDRAWFIXED and WM_OWNERDRAWVARIABLE. Implemented
WM_MEASUREITEM. Fixed some paint code. Implemented Horizontal scroll.
- Rewrote edit control, newedit.c new features:
- horizontal scroll.
- non-fixed fonts works without caret position problem.
- selection (SHIFT+Arrowkeys or Home/End).
- cut and paste (CTRL+INS, SHIFT+INS, SHIFT+DEL).
- word skip if CTRL pressed when using arrows keys.
- mouse selection and autoscroll.
- mouse dblclick.
- insert and replace mode, with different caret size.
TODO: multiline capability.
- Other bug fixes:
- anti-aliasing min font height now set in device.h using FTMINAA_HEIGHT
- global user_builtin_fonts
- added font cache for freetype fonts to speed up GetTextMetrics
- Caret blinking.
- WM_CHAR not sent if the key pressed is a control key (like VK_LEFT ecc.).
- WM_KEYDOWN: Bit 24 in lParam indicates that the key is a control key.
- Implemented TabbedTextOut and GetTabbedTextExtent.
- automatic underlined character using & marker
- framebuffers: fblin4rev.c should not reverse the c color pixel when in XOR mode.
- Now it's possible to activate any number of timers.
- Timers: remove timers associated to wnd when windows are destroyed.
- Windows caption is now dynamically allocated. Note that szCaption (member of HWND)
is now a pointer, not an array! Never use sizeof(szCaption)!!!
- Window structure has some new items: lpfnWndProc, paintBrush, paintPen, hInstance.
- WinMain now has hInstance, szCmdLine
- Keep window erasebkgnd count
- Only post one kbd message to a window at a time, fixes new window post bugs
- Some architectures, like ARM, needs data to be 32bit aligned in GetWindowLong
and SetWindowLong. Fixed it by rd/wr unaligned data as four bytes.
The definition ARCH_NEED_ALIGN32 should be set in Makefile.rules if needed.
- The MwSelect function has been changed. An argument is passed to the function to
indicates if the select may suspend or not the process. PeekMessage do not suspend,
GetMessage suspend until a next timeout or user action.
- if MW_CALL_IDLE_HANDLER is defined, a function idle_handler is called
(should be implemented in the application code). The idle_handler has
the following prototype: void WINAPI idle_handler ( void );
This may be used in some embedded application to put CPU in idle state
and save battery.
- The GetMessage function, when waiting for a message, call
MwHandleTimers and if requested the idle_handler fn.
- In the drivers folder, the file mou_tp.h was missing. (Needed by mou_harrier)
* fixed v0.90 white display bug in 24/32bpp images (Greg)
* fixed XPM support for large line size (Greg)
* added VNC server support, requires libvncserver 0.6 (Giampiero)
added INCZ zlib include config option
* fix mterm on Cygwin (David)
* add DT_BOTTOM, DT_VCENTER to DrawText (Simon)
* fix bug in MwDestroyWindow causing crashes
* add DrawArea function to fblin4 driver for Freetype 2.1.4 (Steven)
* add Windows screen/mouse/kbd drivers, support Visual C (Wilson Loi)
contrib/visualc contains .dsp files, tested for NONETWORK only
* added support for iPod Linux (Bernard)
new config options: IPOD_LCD, INVERT2BB, config.ipod
new arch: UCLINUX-ARM
new screen driver fblin2revipod.c
fixed uClinux framebuffer mmap, ttyscan driver
* allow large transfers > MAXREQUESTSZ in GrDrawImageBits (Thomas)
* fixed positive leftBearing in PCF fonts (Thomas)
* fix no mmap under eCos
* fix GrSendClientData mem leak

Have fun! - Greg

NXLIB v0.46 - Nano-X / Xlib Compatibility Library

May 17, 2010
NXLIB has been updated, and is available from the Microwindows web site:

Following is the detailed ChangeLog:

17 May 2010 - Version 0.46
* fix prefix problem in XLoadFont when full filename (not XLFD) passed

10 Apr 2010
* fix XSetClipOrigin to offset current gc clip region also (REMOVED 12/7/2010!)
* load linux kernel keymap when XRefreshKeyboardMapping called (Aron Takacs)

21 Mar 2010
* fix multiple free() bug in _nxFreeFontDir()
* added Xutf8SetWMProperties for mupdf port
* added XShmQueryExtension, XShmAttach, XShmCreateImage stubs

9 Mar 2010
* added image padding in XGetImage and XPutImage (Johannes)
* add XSetTransientForHint(), XA_WM_TRANSIENT_FOR and XM_WM_NAME handling
in XChangeProperty (Johannes)
* fix null ptr in XConvertSelection (Johannes)

21 Feb 2010
* fixes relating to running FLTK 1.1.10 w/NXLIB (requires mwin v0.92RC2)
* XParseColor randomly returned incorrect colors, now works #RRRRGGGGBBBB
* fix bug in drawing text bk color after drawing Images
* revised default Makefile for Ubuntu 9.10 X11 fonts location
* added fonts.alias support

24 Jan 2010
* revised Makefile to allow compiling without X11 installed
* created internal X11 directory for X11 hdrs if not present
* added test directory with X11 test applications
* revised Xlcint.h removed varargs.h, added stdargs.h

30 November 2007
* ported FLTK 2.0.x (stubbed _XUnknownNativeEvent,XutfLookupString)

23 November 2007
* change XPutImage to use new MWPF_HWPIXELVAL pixtype
* force UseBackground true in XPutImage
* change XFillArc/XFillArcs to add one to width/height
* added X11_FONT_DIR3 to Makefile for X11 default TTF directory
* added scalable font & height handling to XLoadFont with X11 fonts.dir
* added input window handling to XCreateWindow (Giosis/Foedrowitz)
* added BIGENDIAN option to Makefile
* fix XCreateBitmapFromData for big endian (Giosis/Foedrowitz)
* fix XDrawPoints past first coord (Giosis/Foedrowitz)
* fix memory leak in XSetClipMask and XSetClipRectangles
* rewrite XChangeProperty, never worked, implement XGetWindowProperty
* fix XInternAtom to return above XA_LAST_PREDEFINED

14 June 2005
* add XSetSelectionOwner,XGetSelectionOwner,XConvertSelection (Jordan)

Have fun! - Greg

Source code control system changed to Git

January 24, 2010
We've moved from CVS to the much superior Git system for maintaining the Nano-X and NXLIB source trees.  Snapshot tarballs are also available if you're not using git.  See the Git Repository link for more information and instructions.

Nano-X Version 0.91 Released

June 3, 2005

Version 0.91 of The Nano-X Window System has been released, and is available on the website:

The Microwindows Project renamed to The Nano-X Window System

January 30, 2005
The project has been renamed to The Nano-X Window System, due to conflicts with the Windows trademark registered by Microsoft.  Although the web site has not been updated for some time, updates are in the works.  The CVS source release will be packaged and released as v0.91 shortly.  Quite a few enhancements and patches have been received, which will be released as v0.92.

NXLIB v0.45 - Nano-X / Xlib Compatibility Library

September 11, 2003
NXLIB has been updated, and is available from the Microwindows web site:

Following is the detailed ChangeLog:

Version 0.45 - 11 Sep 2003 -
* added XAllocWMHints, XAllocSizeHints for FLTK 1.1.4
* fixed 'p' entry in mwscan_to_mwkey
* added X headers to nxlib distribution, X11 now not required to build
* added Jordan's mods for better GTK (1.2.10) compatibility:
XwcTextListToProperty, XwcPropertyToTextList, XWcFreeTextList
fixed XPutImage w/src_x not 0 or unequal widths
stubbed out XCreateFontSet
added XGetSelectionOwner, XSetSelectionOwner, XConvertCase
* temp kluged problem with X11 width/height vs NX radius for arc specs
* fixed XDrawRectangle, XDrawArc width/height +1 bug
* fixed angle1/angle2 difference between X11 and Nano-X in XDraw/FillArc

Have fun! - Greg

NXLIB v0.44 - Nano-X / Xlib Compatibility Library

June 1, 2003
The first public release of the NXLIB Project, a companion project to Microwindows that allows X11 binaries to run unmodified using the Microwindows Nano-X server, is available from the Microwindows web site:

This release has been tested heavily with FLTK v1.0.11, and FLTK v1.1.3. FLTK is built using the standard X11 headers and shared library. The NXLIB replacement for (named is then used to run all FLTK test programs successfully without source or binary modification. This is great news since  we now can use a very full-featured small footprint widget set, as well as many already-built applications in the Microwindows environment.

Although a work in progress, NXLIB also is making progress running unmodified QT and GTK+ programs. NXLIB v0.44 has been tested with QT v2.3.1, and GTK+ 1.2.10, and  many of the demonstration programs are currently running. 

NXLIB works by emulating only the Xlib ( library. Since FLTK's use of Xlib is much smaller than GTK+ or QT, more programs are currently running. There is still work to do with the Xrm resource manager routines, and of course the idea is to keep the footprint small.

NXLIB requires Microwindows v0.90, just released.

The Microwindows mailing list, at will be used for questions, suggestions and patches to NXLIB. NXLIB is licensed under a the MPL license, with a conversion capability to GPL, the same as Microwindows.

Have fun! - Greg

Version 0.90 release, many font enhancements, standard calibration

May 31, 2003
Microwindows version 0.90 is released, and available on the website: 

There have been many additions, enhancements and bugfixes since the November 0.89 release. Following are some of the major highlights:

o Support for the new NXLIB project, which allows X11 binaries to run unmodified on Microwindows, without requiring the X11 server. 

o Support for Sharp Zaurus, Tuxscreen, TriMedia, and Cygnus X11 platforms.

o Standardized calibration (nxcal) support now built into Microwindows. A single touchscreen driver supporting popular ARM platforms including iPAQ, Zaurus, ADS and Tuxscreen is also available.

o Many font enhancements, including support for FreeType 2, as well as a new BDF font converter that will allow any BDF font, including large Asian fonts, to be used. In addition, a new .fnt native binary font format is supported. DBCS multibyte decoding is supported for Japanese, Chinese, and Korean encodings (BIG5, GB2312, EUCCN, EUCKR, EUCJP, JISX0213)

o Major speed improvements to the X11 screen driver as well as text drawing.

o Per-color alpha support with a new 32bit ARGB hardware driver is included.

o LIRC keyboard with HAVI keyboard mappings.

o Doxygen-based automated documentation generated from source code for html and pdf docs.

o And lots more!

New APIs
GrGrabKey, GrUngrabKey
GrCreateFontFromBuffer, GrCopyFont
GrSetTransform, GrCalcTransform, GrSaveTransform
GrSetForegroundPixelVal, GrSetBackgroundPixelVal

Many thanks to everyone, especially Jonathan Foster and Jordan Crouse in this release for their support and patches.

Following is the detailed ChangeLog:
Version 0.90 - 30 May 2003 -
* remove scancode hack in ttyscan.c (loses mozilla X compatibility)
* protect 0 width/height bitmaps in GdBitmap, drawbitmap (PCF fonts)
* enhance nanowm to handle client programmatic resize requests
* send UPDATE_SIZE event before EXPOSURE event for fltk
* removed GR_EVENT_TYPE_HOTKEY, use GR_EVENT_KEYSTROKE.hotkey member
Version 0.90rc1 - 18 May 2003 -
* changed GR_EVENT_TYPE_HOTKEY_* to data member in GR_EVENT_KEYSTROKE
* cleaned up various function prototypes
* fixed XPM transparency drawing bug
* added ADS7846 touchscreen support (PSI OMAP Innovator) (Dave)
Version 0.89pl15 - 13 May 2003 -
* fixed bug in fast_grayscale option to LoadJPEG
* removed DPRINTF code generation except when DEBUG=Y
automatic GCC detection for GdError or fprintf usage
* added -DDEBUG when DEBUG=Y
* implement GrPrepareSelect/GrServiceSelect in linked server (Jonathan)
* reimplemented GrGrabKey, GrUngrabKey (Jonathan)
added grabdemo demonstration program
* cleaned up printf/DPRINTF, added DONT_HAVE_SIGNAL for no signals
* cleaned up // comments (Simon)
* added "make realclean" to remove generated .c files from .bdf & .bmp
* single touchscreen driver for Zaurus, iPAQ, tuxscreen, ADS (Jordan)
(jitter and transform moved into engine/devmouse.c)
mou_touchscreen.c: (standardized kernel; ucb1x00 chip)
IPAQMOUSE=Y (Compaq iPAQ /dev/h3600_tsraw)
ZAURUSMOUSE=Y (Sharp Zaurus /dev/sharp_ts)
TUXMOUSE=Y (TuxScreen /dev/ucb1x00-ts)
ADSMOUSE=Y (Applied Data Systems GC+ /dev/ts)
mou_vrlinux.c: (VR-Linux distribution)
EPMOUSE=Y (Embedded Planet /dev/tpanel) (was TPMOUSE)
VHHELIO=Y (Vtech Helio /dev/tpanel) (was TPHELIO)
mou_yopy.c: YOPYMOUSE=Y (Yopy)
mou_mt.c: MTMOUSE=Y (MicroTouch serial /dev/ttyS0)
mou_ps5.c: PSIONMOUSE=Y (Psion 5 /dev/touch_psion)
mou_harrier.c: HARRIERMOUSE=Y (NEC Harrier)
(original drivers moved to src/drivers/old)
* mouse drivers:
mou_gpm.c: GPMMOUSE=Y (gpm mouse)
mou_ser.c: SERMOUSE=Y (serial MS, PC, Logitech, ps/2 mice)
mou_sun.c: SUNMOUSE=Y (Sun workstations /dev/sunmouse)
mou_null.c: NOMOUSE=Y (no mouse)
* added Zaurus support, config.zaurus (Jordan)
* added tuxscreen support, config.tuxscreen (Jordan)
* added MWFONTDIR environment variable for loading FNT files
* fix swap.h::dwread macro to work on unaligned data
* added textflags to PSD GetTextSize function
* added TIFF decoder to devimage.c (HAVE_TIFF_SUPPORT=Y)
* changed LARGE_COORDINATE in devrgn2.c (more work needed here)
Version 0.89pl14 - 7 May 2003 -
* removed various auto-generated mwin/bmp/*.c files, fonts/*.c files
* fixed GrPeekEvent no-select() bug in LINK_APP_INTO_SERVER case
* added Doxygen-created source documentation & Makefile (Jonathan)
"make doc" to create docs in microwin/doc/nano-X/html
"make pdfdoc" for docs in microwin/doc/nano-X/latex
"make doc-clean" to clean docs and microwin/doc/internal
(requires Doxygen 1.3 or later from
(requires LaTEX for pdf docs)
* added newbuild.diff (Jonathan)
Enabled lots of warnings for GCC.
(src/Arch.rules, src/Makefile.rules):
Tidying: Moved defines, libraries and compiler flags into these two
Tidying: Simplified the layout, so libraries and headers for a
specific config option are together (before they were separated).
Tidying: Simplified how libraries are handled - now they only need to be
added to one variable, rather than five.
Bugfix: Corrected a few options that were added to CFLAGS rather than
(src/*/Makefile [but not src/demos/*]):
Tidying: Removing options that were moved into Makefile.rules
Tidying: Removing the (now empty) compiler flags section of these
Tidying: Removing these Makefiles that did nothing.
* added minormakefixes.diff: (Jonathan)
Bugfix: Display a fatal error if the specified filename is longer
than the fixed-sized filename buffer, instead of crashing.
Bugfix: Make the fixed-size filename buffer longer.
Feature: Add -o option to specify the output file name.
(Previously it always computed this from the input file name.
The old behaviour still applies if you do not specify -o)
Bugfix: Don't redirect output of convbmp, it doesn't produce
output on standard out (even before my modifications).
Use the -o option to specify the output file.
Bugfix: "make clean" would delete all files in src/ if the
bin/ directory did not exist.
* clean up demo program declarations to eliminate warnings (Jonathan)
* added LIRC keyboard support, MWKEY_HAVI keys (LIRCKBD=Y) (Jonathan)
* added Gr/GdCreateFontFromBuffer, Gr/GdCopyFont API (Jonathan)
* add comments to font code (Jonathan)
* accept Java's relaxed UTF8 variant (U+0000 as 2 chars) (Jonathan)
* fix buffer overflow in GdCreateFont w/long pathnames (Jonathan)
Version 0.89pl13 - 1 May 2003 -
* added GrGrabKey, GrUngrabKey (Jordan)
* added mousedev.flags member, jitter transform, rotate filters (Jordan)
* added nxcal standard Microwindows calibrator (Jordan)
new server transform routines:
GrSetTransform, GdSetTransform (server)
GrCalcTransform, GrLoadTransform, GrSaveTransform (client)
* added ucbx100 touchscreen driver (Alex, Jordan)
* updated iPAQ mouse driver (Jordan)
* added iPAQ kbd driver (IPAQKBD=Y)
Version 0.89pl12 - 13 Apr 2003 -
* added compressed native font format (.fnt.gz) (HAVE_FNTGZ_SUPPORT)
* move to portable locking mechanism in lock.h as default (Jon)
* allow GrMoveWindow to use quick blit in portrait mode
* move to only two builtin fonts: MWFONT_SYSTEM_VAR, MWFONT_SYSTEM_FIXED
- should change applications that request MWFONT_GUI_VAR to
- deprecated MWFONT_GUI_VAR (redirected to MWFONT_SYSTEM_VAR)
- deprecated MWFONT_OEM_FIXED (redirected to MWFONT_SYSTEM_FIXED)
* added very cool support for Cygwin X11 (Nano-X on X11 on Win32!) (Jon)
* re-inserted special hack for portait mode pixmap handling in genmem.c
* added auto UC16 conversion to handle large (non-ASCII) bdf fonts
- requires loading converted bdf file as .fnt file
- any BDF can now be used to display international chars
convert font using fonts/convbdf.c: "convbdf -f *.bdf"
- MWTF_DBCS_* flags can be used with font for DBCS encoding
- this is the new preferred method for Chinese,Japanese & Korean
* speed up PCF font output for ASCII fonts
* added default font dir handling with PCF and FNT files (set in config)
* fix GrCreateFont to return ID 0 when font not found
Version 0.89pl11 - 07 Apr 2003 -
* change to allow GrCreateFont w/height=0 to work with loadable fonts
- if height=0 specified with scalable fonts, must call
GrSetFontSize with height before rendering
- if height=0 specified with non-scalable fonts, height ignored
- if height specified, will always return some font
- if height=0 specified and font not found, may return 0 rather 
than builtin font
* added lfClass to MWLOGFONT, allows specifying renderer
* added native loadable .fnt support (use fonts/convbdf.c -f to create)
* added enhanced fonts/convbdf, fonts/convbdf.c:
- allows fonts with > 256 chars
- allows fonts with bitmap offsets > 64k (offset now long array)
- offset and widths list not generated when not required
- start, limit options & defaultchar
* removed HAVEMSFONTS option
* slight speed increase on dashed drawing, reformatted devdraw.c
* increase text draw speed with no-clip drawbitmap internal function
* rewrote and moved all DBCS code into engine/devfont.c and font_dbcs.c
MWTF_DBCS_EUCJP, MWTF_DBCS_JIS: must use w/GrText for builtin fonts
- "count" parameter with dbcs is byte-length of dbcs string
- can use MWTF_DBCS_* flags with any (UC16-indexed) fonts now
- can use multiple DBCS encodings and fonts at same time
- can use DBCS encoding with non-compiled-in fonts, encoding is
seperate from specially-compiled-in fonts.
* fixed BIG5, GB2312, JISX0213, KSC5601 from previous GetTextBits retmap change
Version 0.89pl10 - 04 Apr 2003 -
* fix GrRegisterInput bug for successive file descriptors (Chen)
* cleaned up some nxproto.h signed/unsigned int16 values and Gr* params
* add MW_FEATURES_TIMERS and MW_FEATURES_IMAGES (set in device.h) (Jon)
APIs are now _not_ available at compile time when option not set
free server timers on client disconnect
* various cleanups: make clean, devrgn.c protos, locking in clientfb.c,
XtoNX.h, image buffers (Jon)
* fixed compatible bitmap size in mdemo.c stretchblit demo (Jon)
* removed Casio E-15 config option, use general options instead
* added -x<#> and -y<#> virtual screen sizing option (Jordan)
* fixed TS offset bug, solid linestyle bug (Felix)
Version 0.89pl9 - 01 Mar 2003 -
* renamed GdSetForeground to GdSetForegroundPixelVal (and GdSetBackground)
* added AF_INET client/server, NXDISPLAY env variable
* added text speedup patch, no per-point clipping in visible
case in GdBitmap and corefont_textdraw. Also clear
background once not per char. Changed GetTextBits
driver entry point to not copy font data. 60% improvment (Aaron)
Note this change eliminates max fixed font sizes for all
fonts except those requiring textbits copy (e.g. font_eujp.c)
* added USE_CCACHE=1 environment variable check for cached builds
* added StretchBlitEx driver entry point, GdStretchBlitEx,
GrStretchArea (experimental) (Jonathan)
StretchBlitEx is still broken in dest rectangle calc (FIXME)
* added maxascent,maxdescent,descent(=baseline) to MWFONTINFO (Jonathan)
* fixed byte-swap bug in GrNewBitmapFromData/GrNewPixmapFromData
* added mwsystem.h, GdRealloc, for alt mem mgmt (Jonathan)
Version 0.89pl8 - 25 Feb 2003 -
* added THREADSAFE support with LINK_APP_INTO_SERVER (Jonathan)
* changed _exit to exit() in client.c
* added various freetype 2 changes (Jonathan)
* added 4bpp nibble-flipped driver (fblin4orion.c) (David)
* fixed GsAllocEvent/GsError OOM recursive loop (Aaron)
* added big-endian support for PCF fonts (Jordan, Klaus)
* fixed usec calc bug in GrDelay (Marc)
* fixed 7-bit requirement for MS mouse (Murphy)
* fixed GrGetGCTextSize char count calc bug (Jonathan)
* fixed off-by-one alpha calc in fblin32alpha.c (Jonathan)
* fixed void * arithmetic for non-GCC compilers
* fixed broken x11 blit scroll code (Jonathan)
Version 0.89pl7 - 24 Feb 2003 -
* APPLIED mw_phillips_fontnetworkbug.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Added GrCreateLogFont nxRequest.
* Removing the hardcoded 64-character limit on font names.
This caused problems with FreeType 2, because the font names
are just filenames. The network layer no longer
restricts font name length, but there is still a
potential buffer overflow in devfont.c.

* APPLIED mw_phillips_freetype2.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Added FreeType 2 support, HAVE_FREETYPE_2_SUPPORT in config

* APPLIED mw_phillips_drawarea.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Added new DrawArea blitters. Controlled by the defines
Usually called through GdDrawAreaInternal() in devdraw.c.

* fixed nxroach GrArea alpha bug (BLACK used in GrArea crash)

* APPLIED mw_phillips_alpha.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Adds 8-bit alpha value to MWCOLORVAL value, new fblin32alpha.c
* Added MWPF_TRUECOLOR8888 pixel type.
* Changes to GdDrawImage() to simplify, fix a
24bpp bug, and to add the MWIMAGE_ALPHA_CHANNEL flag.
* Adding MWROP_USE_GC_MODE option to GrCopyArea
* Adding a default implementation to fb.h for the new Porter-Duff
blending rules, which assumes that both SRC and DST have
alpha=1.0. Drivers that actually support alpha should not
use these macros in Porter-Duff modes.
* MWMODE_XOR_FGBG implementation
* Adding Porter-Duff MWMODE and MWROP codes,
renumbering some existing MWROP codes to prevent collisions.
* Adding MWMODE_TO_ROP() macro.
* Adding code to choose between 8/8/8/8 and 0/8/8/8
modes on 32-bit displays, depending on whether or not the
display claims to support alpha.
* New 32-bit with alpha driver: fblin32alpha.c.
* Adding GR_ARGB() - just calls MWARGB().
* Rewriting MWRGB() to set the alpha to 255 (opaque).
* Adding MWARGB() macro
* Use new GrSetGCForegroundPixelVal() API rather than the
deprecated MWPALINDEX() macro.
Removing MWF_PALINDEX and MWPALINDEX(). They don't work
due to the alpha blending changes. Clients should be
modified to use GrSetGCForegroundPixelVal(index) instead
of GrSetGCForeground(MWPALINDEX(index)), and similarly to use
GrSetGCBackgroundPixelVal() to set the background color.

* APPLIED mw_phillips_color.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* API changes to allow later alpha patch.
* Added GrSetGCForegroundPixelVal, GrSetGCBackgroundPixelVal
* Added new functions GdSetForegroundColor() and GdSetBackgroundColor
GdSetForeground/GdSetBackground now takes MWPIXELVAL only.
* Added fgispixelval and bgispixelval flags to GR_GC and GR_GC_INFO.
* Added a PSD parameter to GdSetForeground() and GdSetBackground(),
GdFindColor(). Allows multiple color depths to be supported
at the same time by different PSDs
* (wingdi.c) Using GdGetColorRGB() instead of a switch()
statement that duplicated it's functionality.
* Replacing GdSetForeground(GdFindColor(c))
with GdSetForegroundColor(psd,c) - note the extra PSD
parameter. Similarly for GdSetBackgroundColor().
* New function GdGetColorRGB(), the inverse of GdFindColor().
* Preventing multiple arc draws - this was causing
problems in XOR and alpha-blending drawing modes.

* APPLIED mw_phillips_x11.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Major speed enhancements to X11 screen driver.
* Resizing the window caused an assert() fail and
crash. Added a call to set size hints on the window, indicating
it's not resizable.
* Handle true color X modes correctly. The previous
code made the assumption that a X always lays out it's colors
in exactly the same way as MicroWindows. This is incorrect.
For example, some Microsoft Windows based X servers use BGR
rather than RGB ordering.
* If we are in true color mode, then we try hard to
get a true color X window if the server can support it. This
is a huge speed boost with a 32-bit Nano-X app, properly
antialiased fonts (so we use lots of colors) and an old 8-bit
palettised display. (In 3/3/2 RGB mode we can compute color
values easily. In 8-bit palettised mode we have to do a very
expensive lookup).
* An alternative blit implementation. Since we are
maintaining a separate off-screen copy of the display, we
perform all blits on this copy, then simply copy the offscreen
data onto the screen. The only exception are simple copies (no
raster ops) between parts of the screen - these are handled by
the server to save us having to send an image across the
* Added PIXEL332RED8 and PIXEL332RED32 macros to device.h

* APPLIED mw_phillips_1.diff (Jonathan)
Contributed by Koninklijke Philips Electronics N.V.
* Misc build system changes.
* Added .cvsignore for CVS
* Initial support for the TriMedia media processor. Not complete.
* Correcting install target so that libraries
are writable by the user who owns the file.
* Rewriting subdirs target so that the build stops on error.
* added config option HAVETEXTMODE, removed from scr_fb.c
* Added config option GPROF=Y for profiling support.
* Added config option BIGENDIAN=Y/N, may define MW_CPU_BIG_ENDIAN to 1.
* Added various echo statements to demo and nanox link steps
* (demos/nanox/Makefile) Only compiling the snap_jpg demo if we
have framebuffer support.
* Fixing a compiler warning in scr_x11.c
* Removing compiler warning about unused variable 'tty'
if HAVETEXTMODE is disabled.

* Commented out XSynchronize() in scr_x11.c (way slow)
(08 Dec 02)
* fix GrCheckNextEvent return no event for X11/LINK_APP_TO_SERVER case
* changed pcf debug output, firstchar calculation, count calc
* corrected include files for RH 7.x

Have fun! - Greg

Version 0.89 release supports multi-threading, DVDVIEW, PCF fonts, tiles/stipples

November 21, 2002
Microwindows v0.89 is released, and available as two archives.
The source archive is
Truetype, T1Lib, Chinese, Japanese, and Korean fonts are available at

This release adds many enhancements and bugfixes. Major enhancements include support for X11 .pcf/.pcf.gz and MGL loadable fonts, Japanese JISX0213 and EUCJP encoding/fonts, multithreading library support, tiles, stipples, dashed line and non-rectangular window support. Bugfixes for ARM architecture processors is also included.  Many new demo programs are now included.

The 0.89 release also supports the DVDVIEW and SMPEG digital multimedia players, and the recently added support for Microwindows in the SDL library. DVDVIEW supports single-threaded mpeg display using direct client-side framebuffer access for highest speed.

These applications and libraries are also available on the Microwindows ftp site The new CONTENTS file identifies compatibility with all known external libraries and applications. - DVDVIEW 1.1.0d
- SMPEG 0.4.4b
- SDL 1.2.4a
- Compatibility version numbers

New APIs
GrSetGraphicsExposure, GrQueryPointer
GrNewBitmapFromPixmap, GrNewBitmapRegion, GrNewRegionFromPixmap
GrGetTypedEventPred, GrGetTypedEvent, GrQueueLength
GrSetGCLineAttributes, GrSetGCDash, GrSetGCFillMode
GrSetGCTile, GrSetGCStipple, GrSetGCTSOffset

Thanks to everyone, especially Alex and Jordan, for outstanding contributions. I plan on starting work on v0.90 immediately, as several large contributions have still not been fully integrated. This release is stable.

Following is the complete ChangeLog:

Version 0.89 - 20 Nov 2002 -
* check for additional client data before queing event data
(05 Oct 02)
* added automatic GetNextEvent after 0 PeekEvent for GTK+ select
(12 Sep 02)
* fixed NOKBD option, X11 can't connect message
* removed nested static procedures in jpeg decoder
* reoriented MWTF_ bits, moved to long MWTEXTFLAGS type for expansion
* added sample MGL fonts for EUCJP testing, t1demo.c supports MGL fonts
(28 Aug 02)
* added fonts/t1lib directory with sample t1lib fonts and config file
* moved font engine sources into separate engine/font*.c files
* ansified C source for small very cool TCC compiler, created config.tcc
* added multi-threading safety to nano-X, THREADSAFE option to config
this currently requires pthreads, see include/lock.h
* fixed .bmp->.c conversion rule for broken building from CVS
* added VGA16 screen->offscreen blit (Alex)
* added XSynchronizeDisplay to X11 driver to bugfix fb emulation
* fixed mem leak in client.c::GetNextQueuedEvent()
* check cursor clip in GdBlit for srcpsd not just dstpsd
* added #define mechanism to select polygon fill in devpoly.c
changed back from X11FILLPOLY to EDGEFILLPOLY default
(X11FILLPOLY still fails in bin/polydemo
* removed nwidgets.h requirement in ecos/ecos_init.c
* changed src/fonts directory: added chinese, korean, japanese and truetype
(17 Aug 02)
* send UPDATE_ACTIVATE event to force redraw on title changes
* added FASTJPEG and HAVE_MMAP to include/device.h configuration
* corrected MAP_UPDATE event in GsWpRealizeWindow, may need tweaking
* default configuration includes freetype and pcf.gz fonts
* use static fontid in window manager titlebar updating
* corrected GrCopyArea rop parm definition to unsigned long
* fixed dash mode/mask on gc change
(04 Aug 02)
* fixed GrGetTypedEventPred to remove returned event from queue
(26 Jul 02)
* added std coding formatter for Microwindows
* wrote GrNewRegionFromPixmap
* added GrNewBitmapRegion, GrSetWindowRegion, first-pass shaped windows (Alex)
* enhanced nanowm, doesn't require parent map before child reparent now
fix props.title leaks after any GrGetWMProperties call
* fixed GrReparentWindow finally: rewrote map/unmap algorithm (no unmapcount)
changed GR_WINDOW_INFO unmapcount member name to realized
* extended GrText flags parameter to 32 bits over wire
* added many demo programs: arcdemo, bmapdemo, rgndemo, convpbm (Alex)
nxmag, nxeyes, setportrait, snap_ppm, tux (Alex)
pcfdemo, tsdemo, dashdemo, polydemo, snap_jpg (Jordan)
tuxchess (Steve)
fontdemo (Greg)
rearranged many *.sh demo scripts
* added nxcolors.h (converted rgb.txt), nxcolors.fe, rgb.txt to contrib (Alex)
* updated html documentation (Alex)
(18 Jul 02)
* allow user clip regions in offscreen memory DC's for win32 API (Tom)
* fix bug with SYSTEM_VAR font selected when plogfont passed to GdCreateFont
* fixup ecos port SVR_Gr defines, Makefile.rules CPPFLAGS, NANOXSERVERLIBS changes
rejected CPPFLAGS change
* added BS_BITMAP style to button control (Phat)
* added WM_KEYDOWN/WM_KEYUP messages,
WM_CHAR in TranslateMessage, use PostMessage instead
* added enhanced convfnt MS font convertor (Tom)
* added EM8400 realmagic chip port of nano-X server (Peter)
* fixed GrArc ax,ay bx,by argument offset bug (Alex)
* padded MWPALENTRY, changed MWSCANCODE to unsigned short for network alignment issues
* added LINUX-SPARC config (Sparc Linux support), SUNMOUSE config option added
* added HAVE_EUCJP_SUPPORT config option (Japanese EUC JP Kanji encoding) (Koichi)
includes support for any MGL fonts
* added HAVE_JISX0213_SUPPORT config option (Japanese JISX0213 compiled in font support)
* added Simons patch for slider kbd support
* added Jordan's patches: (122701) (021102)
add tiles, stipples, dashed lines, fill mode support
GrSetGCLineAttributes, GrSetGCDash, GrSetGCFillMode
GrSetGCTile, GrSetGCStipple, GrSetGCTSOffset
GdSetDash, GdSetFillMode, GdSetStippleBitmap, GdSetTilePixmap
gr_dashmask, gr_dashcount, gr_stipple, gr_tile, gr_ts_offset
ts_drawpoint, ts_drawrow, ts_fillrect
fillmode support to GdArc routines, all line drawing routines
added GR_UPDATE_REPARENT subevent
added routines for NX11 library:
GrGetTypedEvent, GrGetTypedEventPred
GrQueryPointer, GrQueueLength, GrNewBitmapFromPixmap
_GrPeekEvent, _GrGetNextEventTimeout, _GrPeekWaitEvent (where is free?)
(look at serv.h, check TILE struct), exposure?, GrNewGC
(lookat srvfunc.c, GrSetGCLineAttributes, GrQueryPointer
(lookat srvnet.c
(lookat srvutil.c GR_LINE_ONOFF_DASH, #964
add option for tile/stipple support
fix nanowm map/unmap behaviour
remove #include <sys/io.h> from scr_fb.c
open CONSOLE instead of /dev/tty if set
fix X11 driver psd->linelen calculation
fix GrCopyAreaReq sizeof(op) in nxproto.h
(17 Jul 02)
* tidy'd up MWIMAGEBITS macros, not dependent on fixed sizeof(MWIMAGEBITS)
* increased max cursor size to 32
* fixed Jordan's patch GrNewBitmapFromPixmap: GrReadArea return based on MWPF_xxx
* fixed GrRegisterInput for successive fd's
* fixed GrGetWindowFBInfo to return absolute x,y coords.
GrGetWindowInfo still returns relative coords, changed src comments
* added MWTF_XCHAR2B encoding
* better X11 can't connect errmsg
* completely fixed PCF/PCF.GZ font reading
* added Jordan's tile/stipple code (GrXXx
(10 Jul 02)
* fix X11 driver indicator status init problem
* fix SVGAlib compile bug
* fix NOKBD support
(21 Nov 01)
* fixed FreeBSD support
* added GrSetGCGraphicsExposure, GrNewBitmapFromPixmap
* added .pcf and pcf.gz loadable font support (requires libz) (Jordan)
* fixed PNG support (may require -lm in Makefile.rules)

Have fun! - Greg

Mozilla, SDL, SMPEG, Rdesktop supported with 0.89pre8

November 15, 2001
Microwindows version 0.89pre8 is released and available at:

A very large number of enhancements are included in this pre-release. The code base is stable, and is being used in a variety of other open source projects, including the Mozilla web browser, SMPEG digital video viewer, SDL gaming/direct video library, rdesktop RDP Windows thin client, and the PIXIL operating environment. The plan is to release final version 0.89 after a several week comment period for last-minute bugfixes and changes.  Following is a list of additional available software compatible with this release: - SDL v1.1.3 - SMPEG v0.4.0 - rdesktop v1.5.0 - Mozilla v0.9.4 - PIXIL OE v1.0

Major enhancements for this release include:

  • Dynamic portrait mode - Nano-X now supports display in all four portrait orientations without requiring a server restart.  The startup options -N, -L, -R and -D force the server into normal, left, right and upside-down display.  The -A option specifies automatic re-orientation to the left or right successively with a mouse-down at the left or right edge of the screen.  Run ./ to see this in action.  The server sends a new GR_EVENT_TYPE_PORTRAIT_CHANGED event when the server orientation changes, allowing applications to resize to the new display form factor.  There are still some issues using portrait mode with offscreen pixmaps; this version requires offscreen pixmaps to be reconstructed when the above event is received.

  • StretchBlit driver support - The Win32 StretchBlt and Nano-X GR_BACKGROUND_STRETCH functions now allow images and blits to use a fast stretchblit driver entry point for resizing image data.

  • eCOS operating system support - The complete system can be built for the eCos operating system on the Compaq iPAQ, including all Nano-X demos, linked together with the eCos OS and executing as multiple threads.

  • Direct client-side framebuffer mapping - This feature was added to implement extremely fast MPEG video decoders using Microwindows.  A client Nano-X application desiring direct access to framebuffer video memory uses the GrOpen ClientFramebuffer API call to initially mmap() the actual framebuffer as shared memory in the client process address space.  Then, the GrGetWindowFBInfo API call can be used on any window ID to have Microwindows compute the upper-left hardware pixel address, along with an appropriately faked line pitch (bytes per scan line) that makes the client application think the window is in fact the entire addressable framebuffer video memory.  The client can then draw directly into the window, while Microwindows continues to draw the window decorations around the window, while continuing to handle the normal window move, map, and other event reporting/management actions.

  • 16 ROP drawing modes for all graphics drawing and blitting - All possible source destination copy, xor, and and or logical functions are now possible for drawing and blit operations.  See include/mwtypes.h::MWMODE_* functions for details.

  • Many additions to Nano-X API required for Mozilla, SMPEG, SDL, rdesktop, and the PIXIL Operating Environment - A large list of new API calls have been added for a variety of enhancements. Following is a quick description of what's new:
    • GrNewCursor, GrDestroyCursor, GrSetWindowCursor - server side cursors
    • GrNewBitmapFromData - X11 compatible bitmaps from C data structures
    • GrQueryTree - search server window list
    • GrDelay - msec standard delay
    • GrSetBackgroundPixmap supports GR_BACKGROUND_STRETCH
    • GrCreateTimer, GrDestroyTimer server-based periodic timers
    • GrSetPortraitMode - set server runtime portrait mode
    • GrOpenClientFramebuffer, GrCloseClientFramebuffer - direct framebuffer access
    • GrGetWindowFBInfo - get framebuffer information about window
    • GrLoadImageFromBuffer, GrDrawImageFromBuffer - image routines not requiring file i/o
    • GrGetFontList, GrFreeFontList - font query routines
    • GrPeekWaitEvent - wait for input, then peek event
    • GrSetGCClipOrigin - set user clip region x,y offset

  • Large list of bug fixes and small additions - This version of Microwindows has become more stable, with the inclusion of very many contributions over the last 10 months.  Many structures have been expanded to include additional information.  See include/mwtypes.h and include/nano-X.h for more information.

Following is the complete ChangeLog:

Version 0.89pre8 - 15 Nov 2001 -
* added MicroTouch DynaPro SC3 touchscreen driver and calibrator (Jordan)
* added GrSetGCClipOrigin
* removed most C++ style comments (Simon), cleaned up source tree
* added GrPeekWaitEvent, blocks until at least one event is available, then peeks
* fix GrPeekEvent, was absorbing events
* added win32 VK_ key translations for scancode MWKEY_ values
* Mozilla and rdesktop enhancements (Matthew Wlazlo)
       ttyscan and x11 keyboard driver fixes
       GrGetFontList, GrFreeFontList, GdGetFontList
* added USE_16BIT_ACCESS to fblin16.c to draw using short word stores only
* implement all src/dst copy modes in fb/x11 blitters and win32 SetROP2/BitBlt codes
        use MWMODE_COPY instead of MWMODE_SET
        use MWROP_COPY instead of MWROP_SRCCOPY
* implement all 16 src/dst MWMODE_xxx operations (Matthew Wlazlo)
* fixed alphablending for truecolor 555 systems
* fix GdTimeout bug when usecs only specified (David Erickson)
* check GC changed before fixing clip in GsPrepareDrawing, clip sometimes incorrect
* allow 0 timeout to cancel GrSetScreenSaverTimeout
* changed check for /tmp/.nano-X to use access(), not stat()
* revised reported x, y event values to be parent-relative
* added Century's GrLoadImageFromBuffer, GrDrawImageFromBuffer
* removed GPL restriction to Arc clipping routines w/permission Eero
(24 Sep 2001)
* added pid to GR_WINDOW_INFO for window ownership identification (Century)
* added patch to change mouse position when cursor moved with GrMoveCursor
* removed incorrect GrReparent code with regards to child mapcount (temp fix)
* added direct client-side framebuffer mapped window routines:
GrOpenClientFramebuffer, GrCloseClientFramebuffer, GrGetWindowFBInfo
* added rgb mask values, fb driver type to SCREENINFO struct
* updated mou_tp.c for Yopy (untested), can use mou_yopy.c
* fixed GrCheckNextEvent to return locally queued event first if any
* added swap.h little/big endian swapping macros, fixed alignment bugs in devimage.c
* added GsSetPortraitMode, GsSetPortraitModeFromXY, screen driver SetPortrait entrypoint
* reimplemented GdFillPoly algorithm for correctness
(4th July 2001)
* added DJGPP changes from Victor
* added check for CONSOLE env var for /dev/tty to open, GrCopyArea fix and
        X11 scanline calc bug from Jordan Crouse
* add patches for compiling with libc5 and default t1lib Latin1 encoding from Tomasz
* added Korean Hangul KSC5601 encoded font support and 16x16 fixed text font from Kevin O
* add byte swap in devimage.c, X11 driver changes, DPRINTF defaults to no output
        GrRegisterInput/GrUnregisterInput use fd_set, -s on debug only from Steve Hein
* add GrCreateTimer, GrDestroyTimer periodic timers from Gary James
* added MWPACKED attribute packing define in mwtypes.h
* added eCos port by Gary Thomas
* ntetris game orientation patch (Xiang Lee)
* translate 127 (DEL) to MWKEY_BACKSPACE in tty scancode (L.C. Chang)
* fixed non-inited sizing field in nanowm (L.C. Chang)
* added Microtouch rs232 touch panel driver mou_mt.c (Holger)
* fix multiple GrClose bug (Gary)
* update kbd_pipe.c (Murphy)
* free memory in MwDestroyWindow
(4th June 2001)
* removed Nano-X widget directory (obsoleted)
(15th May 2001)
* temp removed driver DrawArea() calls in GdArea code (blit bug)
* fix clip bug in GdReadArea
* added portrait mode member to screeninfo struct (change all dr/scr*.c)
* added down portrait mode
* added dynamic portrait mode, nano-X [-ANLRD] startup portrait modes
(13th Apr 2001)
* implemented GR_BACKGROUND_STRETCH in GrSetBackgroundPixmap
* fixed startup VTSWITCH time delay bug in win32
* added StretchBlt, new screen driver stretchblit entry point
* added direct .bmp file create on PRINT, added 16,24,32 bpp output
(27th Jan 2001)
* added GrDelay for msec delay
* added GrQueryTree to obtain window parent/children list
* ported nxroach! (run
* replaced GrClearWindow with GrClearArea, created GrClearWindow macro
* experimental fix to GrReparentWindow when parent not mapped
* added cursor id to GR_WINDOW_INFO
* added server-side cursors, GrNewCursor, GrDestroyCursor, GrSetWindowCursor
* removed GrSetBorderColor, changed to GrSetWindowBorderColor
* added GrNewBitmapFromData

Have fun! - Greg

Doom port, major enhancements for PDAs and WebPAD devices

January 21st, 2001
The long-awaited 0.89pre7 is _finally_ released, and is available at:

There are some major enhancements in this release, as well as many small additions and bug fixes required to run well on PDAs, WebPAD devices, and set-top boxes. Some of the major enhancements  include:

  • Complete scancode-mode keyboard driver rewrite. The Microwindows keyboard interface is now complete, and all applications now have access to separate keydown and keyup events for every key on the keyboard, including function keys, shift/ctrl/alt, as well as additional keys found on things like the iPAQ. In addition, all keystrokes are reported with a unicode value (read from the Linux kernel tables) as well as an up/down scancode. This modification changed some of the earlier contributed keystroke API and it's now far simpler to catch any keystroke without additional decoding. This modification was required for the Doom port to Microwindows, available from the ftp site. See mwtypes.h for the new keynames. The scancode driver is enabled by setting KBDSCAN=Y in the config file. The X driver has been updated as well so that keystrokes are identical when running Microwindows on X or framebuffer. 
  • Microwindows now exits with the PAUSE/BREAK key, rather than the ESC key. This change makes it harder to accidentally exit. 
  • Support was added for the G.Mate YOPY PDA.
  • Image support is enhanced with PNG, PBM,PGM and PPM image decoders (thanks Alex)
  • Top-level window movement is many times faster using screen-to-screen blitting when dragging windows around. (An option in the window manager also allows drawing an XOR frame instead for slower systems: OUTLINE_MOVE).
  • A very nifty launcher application with an extremely cool set of screensavers has been added. Background pixmap support for tiling, centering and such makes background wallpaper a snap. A tetris game has been added. (thanks again to Alex for a heck of a lot of work and a great job on all this!) 
  • Support for 5/5/5 15bpp screens was added. I finally realized why my home system 16bpp never looked good! This change was required for ongoing work with digital video on Microwindows.
  • A pass at a macro-driven Xlib to Nano-X conversion header file, XtoNX.h, which greatly helps hacking Xlib programs into running easily. 
  • A number of new API entry points were added, including  selection api Gr[GetSet]SelectionOwner, GrRequestClientData, GrSendClientData. Screen saver support with a new internal timer mechanism with GrSetScreenSaverTimeout. GrSetBackgroundPixmap, GrNewPixmapFromData for X bitmap display conversion.  GrSetWindowTitle, GrSetWindowBorderColor, GrSetWindowBorderSize, GrSetWindowBackgroundColor for the xfreecell port.
  • Extensive automatically generated html/pdf/sgml documentation, which has been placed in the microwin/doc/nano-X directory.
  • FreeType font caching has been added, enabling _much_ faster display of truetype fonts. (there's still some issues with this, and a change in the font api will be required for the full fix.)

Some of the big bug fixes that are included are:

  • Fix XFree86 4.0 expose event handling when running on newer X11. 
  • Fixed nasty slow blitting in the X11 screen driver. (more on this to come)
  • Added -mstructure-size-boundary=8 for StrongARM compiles
  • Fixed dropped events when running client/server. This was a big problem and numerous events were dropped by clients due to a client/server protocol issue that wasn't handled properly by the client library. We've now had to move to a client-side event queue.  
  • Linker error when building shared libraries fixed

Thanks again to everybody for the extremely numerous contributions and fixes to this release. I plan on adding a major improvement to the image/blit architecture in the next release. 

Following is the complete ChangeLog, including the 6b and unreleased 6c revisions since 0.89pre5:

Version 0.89pre7 - 21st Jan 2001 -
* moved config.* files to Configs directory and added README
* moved caching devfont.c to devfont.caching.c (breaks ftdemo)
* added extensive gtkdoc sgml/html/pdf nano-X documentation from Alex
* wrote Xlib to Nano-X macro hdr file for easier porting (XtoNX.h)
* added Alex's improved server timeout routines (no alarms)
* converted demo3 to nxview image viewer
* added time field in GR_EVENT_BUTTON for double-click determination
* fixed fast window move blit bug with non-root child windows
* added useful macro functions: GrSetWindowTitle,GrSetWindowBorderColor, GrSetWindowBorderSize, GrSetWindowBackgroundColor
* ported xfreecell to nano-X
* added GrNewPixmapFromData to create pixmap from bitmap data
* added Alex's GrSetBackgroundPixmap, GrBell
* added Alex's cool screensaver app nsaver, GrSetScreenSaverTimeout
* added Alex's getselection/setselection demos, Gr[GS]etSelectOwner, GrRequestClientData, GrSendClientData
* enhanced nxclock and ftdemo
* fix shared library bug w/GetSysCharHeight function
* fixed MwRegisterInput/Output/Except bug (Yang)
* fixed Arch.rules for Solaris 7
* fix antialiasing bug when both T1lib and Freetype enabled (Murphy)
* fixed GrReadArea offset bug (Dave Tubbs)
* added MWPF_TRUECOLOR555 for 16 bpp 5/5/5 packed pixels
* fixed 5/5/5 driver for ATI card

Version 0.89pre6c (unreleased) 8th Dec 2000 -
* new scancode kbd driver: ESC never quits, pause/break quits
select with SCANKBD=Y in config (default)
* added Brent's changes for VxWorks port
* added PNG image decoding from Alex
* fixed GrGetNextEvent returning event twice when signal caught (Alex)
* fixed XPM loader errmsg on non-XPM images from Alex
* added launcher application from Alex
* added HAVE_PNM_SUPPORT for PBM,PGM,PPM ascii&binary images from Alex
* added ntetris game from Alex
* fixed FREETYPE_FONT_DIR in engine/Makefile
* added freetype font caching to devfont.c (experimental) (huge speedup)
* added -mstructure-size-boundary=8 for ARM compiles and structure bugs
* changed MOUSE_POSITION to ..._MOTION in scribble for better recognizer
* fixed nasty slow blitting code in X11 driver
* added USE_EXPOSE config option for XFree4.0 backing store expose fix
* added iPAQ scancode keyboard driver
* added YOPY mouse driver and YOPY build support
* fixed dropped events bug in client/server!!
* send UPDATE_MOVE to all children on window move
* finished fast screen blit move algorithm for topmost windows
* auto calculation of virtual screen size
* change GR_EVENT_MOUSE subwid to always be mouse window (Peter)
* added auto-repeat to scancode tty driver
* fixed buggy GrGetRegionBox
* fixed X11 screen->offscreen blit
* fixed blit with negative src clipping
* added GR_MODE_EXCLUDECHILDREN clip mode to GrSetGCMode
* added window resize to nanowm and #define OUTLINE_MOVE
* changed GrInjectPointerEvent visible arg semantics
* converted x11 kbd driver to scancode
* added MWKEY_* defines, changed kbd modifiers
api change: GR_EVENT_KEYSTROKE to return unicode only values
api change: GrInjectKeyboardEvent
* complete keyboard driver rewrite: scancode, up/down events
* ported Doom! to Microwindows
* fixed overlapping blit for 8/16 bpp
* added current mouse coords in SCREENINFO struct
* started on Wt widget set port

Version 0.89pre6 - 12th Nov 2000 -
* added Peter's driver blit fix for dst in src rectangle
* added Scott's correct GdFillPoly routine (uses malloc/qsort)
works for irregular polygons, concave, convex with holes
* added config.ipaq for pre-built ipaq build configuration
* added -lm to LDFLAGS when T1LIB or FREETYPE is used
* added FLIP_MOUSE_IN_PORTRAIT_MODE #define to engine/devmouse.c
* added Vladimir's nxlsclients and nxev programs
* GrCopyArea optimization fix for windows with no eventclients (slider)
* added Kim's SH3 reversed order fblin4sh3.c driver
* added support for SuperH compilations (LINUX-SH)
* added Jordan's convxpm.perl xpm to rgb converter
* added Brent's alloca patch
* fix update map/unmap events sent only on actual unmap/map
* fix window manager to map parent before reparent for unmapcount bug
* allow GdStretchBlit to width/height of 0 without error
* remove GsError for GrNewPixmap of 0 width or height
* change to service all kbd data in single poll loop
* change low level clipping to always clip child windows
* fix server clear allocated pixmaps before drawing to them
* fix blit code after xor in X11 driver for nxterm

ViewML and FLNX Upgrade

November 2nd, 2000
Version 0.89pre5 of Microwindows is now released at:

This prerelease adds quite a few bug fixes to Nano-X, as well as  major enhancements to the window manager and window style bits. Quite a few subtle bugs in update event reporting, offscreen area copying, blitting, and client disconnect server resource cleanup are fixed. XPM image display has been added.

Now, all font, region, gc, window, pixmap and image server resources  are completely deallocated on any client disconnect. The interaction between the window manager and Nano-X is bug free, and new update event subtypes have been added for proper window manager-server interaction and notification. Error event reporting has been rewritten, although there are still some problems when the server  generates an error, which normally shouldn't happen.

The Nano-X server has been enhanced to allow a virtual screen size and workspace to be reported that is different from the physical size, in order to emulate PDA screens on the desktop framebuffer. The server also produces a .bmp-convertable file when control-P is pressed for ease in generating screenshots.

This release coincides with the flnx-0.14 and viewml-0.18 releases from Century Software in order to create a completely working ViewML embedded web browser on top of Microwindows.

There are still quite a few more contributions and enhancements that I am working on getting into Microwindows, I'll try to get them in the next cut. Soon, we will be attacking the keyboard input issues and font caching/aliasing that will be required for better speed with ViewML. In addition, the image rendering will be sped up considerably.

I want to give a big thanks to the rapidly growing list of contributors to this project. I feel Microwindows is nearing the stability and feature set it needs for a v1.0 release sometime in the next couple of months.

Following is the complete ChangeLog for this release:
Version 0.89pre5 - 2nd Nov 2000 -
* add GdCaptureScreen screen capture for later makebmp processing
* temp #define FASTJPEG in engine/devimage.c for 8bpp fast jpeg display
* free server images on client disconnect
* wrote experimental non-flick blit-move routine when window is topmost
* fixed GrCopyArea with offscreen source wid
* fixed UPDATE_MAP x, y, values
* fixed transparent color drawing in GdDrawImage,
unique color no longer required
* fix imagehdr free in GdFreeImage
* added xpm image support from Jordan, (HAVE_XPM_SUPPORT)
* added UPDATE_DESTROY update event subtype
* changed update map/unmap semantics: update sent on all child
windows of map/unmap
* send update unmap event on auto server-destroyed windows
* change GrDestroyWindow to send always send update unmap event
* change GR_EVENT_TYPE_CHLD_UPDATE message wid member, added subwid
now properly sends CHLD_UPDATE messages
* added GrDrawLines util function
* added virtual and workspace width/height GR_SCREEN_INFO members
* fixed cursor on when in source blit rectangle
* fixed GrCopyArea copy garbage on clipped src area,sends expose instead
* fix DestroyRegion code in GsDestroyClientResources
* added Kaben's clipping fix for GdBlit
* Kaben's clip region fix when alternating between on/offscreen windows
* remove GsError on bad GrCloseWindow
* fix negative text coordinate offsets for freetype
* consolidated GrNewWindow/GrNewInputWindow
* disallow auto-focus to windows with GR_PROPS_NOFOCUS set
Version 0.89pre4 - 26th October 2000 -
* added aggregated expose events for better paint appearance
* added cleanapps Makefile entry
* fixed T1Lib Makefile.rules bug
* removed strdup definition for mips in nxscribble
* fixed constant timeout event returned when linked with server
* rewrote error handling completely, new GrDefaultErrorHandler,
GrSetErrorHandler type/semantics. Removed nanox/stubs.c
* don't revert to mouse enter/leave focus after window destroy once set
* fix GrCopyArea drawing on unmapped window crash
* fix crash on bad GrGetWMProperties call
* return all 0 info for any invalid id GrGet* functions
* fix GrGetWMProperties to return flags 0 on invalid window id
* free gc, region and font resources on client exit

Window Manager Enhanced, NEC Harrier Supported

October 17th, 2000
The latest Microwindows tarball is available at:

This prerelease is mostly bug fixes and enhancements to the Nano-X window manager. A new routine, GrNewWindowEx has been added that allows a window style and title to  be specified at the same time the window is created, rather than making a separate call to GrSetWMProperties immediately afterwards.

Also, several new window "properties" were added for interpretation by the window manager. These include the following: 

GR_WM_PROPS_APPWINDOW - default look and feel
GR_WM_PROPS_BORDER - single black border
GR_WM_PROPS_CAPTION - draw a caption
GR_WM_PROPS_CLOSEBOX - draw a closebox
GR_WM_PROPS_NOMOVE - don't allow user window move
GR_WM_PROPS_NOAUTOMOVE - don't reposition window on map
GR_WM_PROPS_NORAISE - don't allow user z-order change
GR_WM_PROPS_NODECORATE - don't decorate/reparent window
GR_WM_PROPS_NOFOCUS - don't allow user focus
GR_WM_PROPS_NOBACKGROUND - don't erase background 
on expose events, application will draw it.

The NEC Harrier board is now supported.

A number of other patches and fixes are also included, we're still trying to get to the bottom of the client hang on disconnect bug. This release is also being synchronized with a big ViewML and FLNX release that implements many more features.

I have received quite a few more patches that I will try to get into the pre4 cut soon. Thanks again to all the fine contributors to this growing project!

The complete ChangeLog follows:
Version 0.89pre3 - 17th October 2000 -
* turned off alpha blending in X11 screen driver for 8bpp
* added Nano-X draw library nxPaintNCArea, nxDraw3dShadow, etc
* added Vladimir's GR_CLOSE_FIX in nanox/client.c fixing client hang bug
* fix for GrGetWindowInfo crashing Vtech after GrCloseWindow/ncPaint
* added NEC Harrier port from Century Software
* some include file changes for VxWorks port from Brent
* cleaned up nanowm window move/closebox/raisewindow routine and policy
* added GrNewWindowEx to specify title and props at window create time
* implemented window draw styles GR_WM_PROPS_APPWINDOW, APPFRAME,
BORDER, CAPTION, CLOSEBOX, default style set by window manager
don't decorate if not direct child of root window
* extended GrGetWindowInfo to return window properties
* fixed LINK_APP_INTO_SERVER makes
* added FBREVERSE=Y and PSIONMOUSE=Y config options for Psion 5 port
Justin Davies contributed Psion 5 touchscreen/screen driver
* added PIPEKBD option for named pipe keyboard driver (kbd_pipe.c)
* added nxterm patch for FreeBSD from Andrew
* fixed sharedlibs link for nxkbd, nxscribble and nanowm apps
* fixed make bug when SHAREDLIBS=Y and FREETYPE/T1LIB=Y from Murphy

Handwriting Recognition, Soft Kbd, New Window Mgr

October 3rd, 2000
Microwindows v0.89pre2 is released with quite a few new capabilities, including handwriting recognition, graphics keyboard, and a new window manager. It's available via ftp at:

In addition, a complete set of free truetype Serif, Sans Serif and  Courier fonts for running browsers on Microwindows are available, along with fixes to loadable chinese fonts. These packages are available at:

This release is aimed towards preparing Microwindows for use on quite a few upcoming PDA projects. The 0.89pre1 announcement was skipped, so there's many changes and enhancements since the 0.88patch1 release. Much work has been on enhancing the Nano-X API and applications. Changes include:

  • Scribble handwriting recognition is ported to Nano-X. This  stroke recognizer currently is Palm-compatible. I'm working on a trainer that will allow users to input their own stroke alphabet if desired. Try running 
  • A graphical keyboard for entering typewriter-style keystrokes is implemented, with support for the entire ASCII character set. The example demo is
  • The NanoWM window manager has been significantly updated, with an updated look-and-feel and much enhanced application support functionality. System color schemes for windows and the desktop/screentop are supported.
  • The VTech Helio is fully supported in this release.
  • Quite a few additions to the Nano-X API have been added. Font support was extended for loading truetype fonts from an  external font directory. Compiled-in color bitmap support was added, with .bmp file conversion. Changes were made to support running Mozilla on Nano-X. 
  • Many win32 controls were enhanced with scrollbar support, and changes to the win32 api were added to run Kaffe well. 
  • Check out the new docs on the left side of this web page.

Finally, I want to thank the increasing number of contributers to Microwindows, I was barely able to keep up. There have been many small changes and bug fixes contributed to this cut as well.

Following is the complete ChangeLog:
Version 0.89pre2 - 3rd October 2000 -
* added nxscribble handwriting recognition from Century Software
* added nxkbd popup keyboard for Nano-X (original from Jay & Vladimir)
* added SIGHUP ignore to Nano-X, removed GrRedrawScreen dropclient bug
* implemented GrReadArea for pixmaps from Peter
* added free truetype fonts to distribution (Arial, Times, Courier)
* added FREETYPE_FONT_DIR config for truetype font search path, .ttf ext
* enhanced nxclock no polling, nxterm better focus handling
* added GrGetNextEventTimeout and GR_EVENT_TYPE_TIMEOUT event
* reworked NanoWM for 3d window decorations for Nano-X applications
removed multi-window decorations, uses only one window now
* fixed user clip region parent offset bug from Peter
* added GrGetFocus call for use with nxkbd and nxscribble
* added GrGetSysColor for system-defined color schemes
* fixed focus semantics during window move/resize/reparent
* added Makefile INSTALL_PREFIX variable
* added GrPoints function from Murphy
* rewrote window manager property struct, added set background color
added props, flags, title, background, bordersize get/set
* added kbd_soft.c named pipe keyboard driver from Vladimir
* added touch panel mods to mou_tp.c driver for Helio (TPHELIO=Y)
* added inverted 4bpp screen driver for Helio (INVERT4BPP=Y)
* added changes to Makefile for shared libs for Helio
* added kbd modifier info for X11, nano-X hdr changes from Jordan
* generate Nano-X root window expose event repaint on startup
* removed termios errchk in serial/ps2 mouse driver
* fixed DT_CENTER DrawText and MSDOS GetTickCount from Robert Sharp
* fixed Makefile.rules .depend target errmsg
* start work on Nano-X drawing library for 3d look/feel
* added GrDrawImageBits, .bmp file conversion for Nano-X
must change MAXREQSIZE in nxproto.h
* add title display to nanoWM
* fix SetWMProperties title memcpy/wrapper bugs
* fix many NanoWM bugs:
window move offset, mousedn on client loses title data
* ported nxkbd software keyboard to Nano-X
* added FREEBSD-X86 to config file as ARCH option
Version 0.89pre1 - 18th September 2000 -
* added map-update events to be batched to any application that selects
for child update events on the root window (window managers)
this allows a window manager to get a list of all mapped
windows without a special API call
* updated nanowm bitmaps from Vladimir
* eliminate need for sleep after nano-X startup, multiple connect trys
* print nano-X server error messages rather than numbers
* force nano-X cursor to appear on startup
* fix cursor change without mouse movement
* moved apps/nanowm to demos/nanowm to fix Makefile build problem
* fix bad MIPS sys header define for SOCK_STREAM
* fix free() bug in GrSetWMProperties from Vladimir
* added alpha RGB444 12bpp fb driver for EP7211 from Julian
* fixed uninitialized transparent color in devimage.c from Jamie
* fixed mouse in abs mode for iPAQ touchscreen in portrait mode
* renamed demos/mwin/demo.c to mdemo.c
* added changes for compiled in HAVE_BIG5_SUPPORT
packhz12 program
bugfixed hzx12 big5 chinese font
* added changes to win32 controls:
listbox control with scrollbars
edit control w/chinese support and caret
combobox enhancements
new scrollbar (client) control, smooth scrolling thumbs
mtest2 demo program
multiline edit control
* wrote caret handling for win32
* added Roman's changes for Kaffe port to win32 api:
GetTextExtentExPoint, GetTextExtentPoint, DrawTextA
added blit AND, INVERT, BLACKNESS to x11 and 16bpp drivers
GdGetTextSizeEx (freetype only for now)
automatically append B/I for bold/italic in CreateFont
fix delete pen/brush but not font resources in ReleaseDC
change default TOP alignment to BASELINE in MwExtTextOut
enhanced glyph width calculations for freetype in devfont.c
auto antialias for freetype at height > 14
not added (kaffe port):
TextOut defaults to UTF8, not ASCII
no SetForegroundWindow on NCLBUTTONDOWN on HTCLIENT area
* enhanced demo2.c for upcoming Linux Journal article (Dec)

Microwindows CVS available, patch release for ViewML

August 21st, 2000
I have prepared a patched distribution to v0.88 that is required to support the ViewML browser on top of Microwindows, which is available at:

In addition, the Microwindows development tree is now available from a public CVS. Following are the instructions for gaining access:

cvs login
(use password: guest)
cvs co microwin

In addition to adding support for transparent color image display for ViewML, the following was added:

  • Added right/left portrait mode mouse coordinate changes, allowing operation on iPAQ with touchscreen support. When compiled with portrait mode, running the Nano-X server with the -N option reverts to non-portrait mode at startup.
  • Added window id parameter to GrInjectKeyboardEvent for Century Software's port of Scribble to Microwindows. This allows Scribble to remember the last window with focus and send keystrokes to that window. Century Software will be releasing Scribble as a GPL'd Nano-X application, rather than adding it to the Microwindows distribution directly (MPL license issues).
  • Fixed the Nano-X window manager screen flicker when dragging windows. I'm about to make bigger changes to the window manager for better support of applications running on PDAs (such as the iPAQ).

Various small bug fixes.

Following is the complete ChangeLog:
Version 0.88patch1 - 21st August 2000 -
* temp hack scribble to window #2, remove srvutil.c id!=1 hack
* fixed nanowm window move flicker
* added window id parm to GrInjectKeyboardEvent
* added otherid to nano-X focus window events
* fixed BOOL decl in scr_bios.c
* add WM_NCHITTEST fix to tpcal calibrator
* fix ADS and iPAQ touch screen drivers for kernel driver select bug
* added right/left portrait mode mouse fixups, -N cmd line startups
* fixed GsError with no clients core dump
* added transparent color to MWIMAGEHDR format, GdDrawImage, GIF decode

ViewML browser and iPAQ ports, Version 0.88 final released

August 3rd, 2000
I've finally released version 0.88 of Nano-X and Microwindows, available at:

Although I didn't get in everything I wanted to, this version is stable and provides needed support for some important projects that I'm trying to stay synchronized with. My open source browser project, ViewML, now runs client/server with Nano-X using this version of Microwindows. We've also added a touch screen driver for the Compaq iPAQ, and will have the browser running on it shortly, with full touch screen support. We'll release a ViewML v0.15 shortly with almost all of the features present in the X version. We'll be showing all this at the Linux Expo the week after next, and are also working on binaries that can be downloaded without having to build.

Details on the enhancements for this release include:

GIF, JPEG and BMP image rendering with stretching or shrinking to any size. (PNG and PPM coming soon) Image caching in the server if desired, without sending image data from client to server. We decided to support images directly in Microwindows, rather than bringing in the larger imLib image library, used with the X version of ViewML.

A number of bug fixes were received from ScreenMedia, who are working on releasing the FreePad, based on  Microwindows.

A number of new/changed config options, including IPAQMOUSE, ADSMOUSE, and HAVE_GIF_SUPPORT were added

There's still quite a few enhancements recieved that I haven't integrated yet, including caret support, a chinese input method, and some color macro bugs. I will be releasing an enhanced FLTK for Nano-X at the same time as the ViewML v0.15 release.

The detailed changelog for this release is:
Version 0.88 - 3rd August 2000 -
* added iPAQ mouse support from Century Software, config IPAQMOUSE
* changed config option TSMOUSE to ADSMOUSE
* added HAVE_GIF_SUPPORT to config, added GIF decoder
* changed image decode algorithms, image is kept in core until drawn
* added GrDrawImageFromFile, GrLoadImageFromFile, GrDrawImageToFit,
GrFreeImage, GrGetImageInfo for GIF, BMP and JPEG
* removed GrJPEG/GdJPEG, GrBMP/GdBMP
* modified MWIMAGEHDR structure, added pitch and bytesperpixel
* wrote decoder for 24bpp .bmp files, enhanced convbmp
* added stretch blit, rewrote image routines in Nano-X for ViewML
* corrected nano-X demo makefiles to work with LINK_APP_INTO_SERVER

* Patches recieved from ScreenMedia: Jan Vehusheia
* nanox/srvnet.c Free allocated events to freelist when destroying
a client.
* nanox/srvutil.c Correctly reassign mouse pointer information when
an application crashes while a mouse button is held pressed down.

* Patches recieved from ScreenMedia: Jon K Hellan <>
* nanox/srvmain.c (GsInitialize): Initialize wp->owner to NULL.
* drivers/kbd_x11.c (X11_Read): Initialize modifiers also when no
key press pending.
* demos/nanox/demo5.c (main): Correct height of bitmap2(fg|bg) in
GrSetCursor call.

* added Kevin's patch for destroying eventclient structures
* added Jiwon's patch for NULL name strcpy in devfont.c
* added Kyle's makefile patches, PORTRAIT_MODE=R or L in config

Have fun!

Kaffe and OTI Java port, Version 0.88pre11 released

July 10th, 2000
The [hopefully] final prerelease to version 0.88 is now available at:

This version adds a variety of enhancements that enable Microwindows to host some open source and commercial java environments, as well as almost completing our standard set of Win32 custom controls.

  • Microwindows can now be configured in an extremely small configuration by setting the new NOFONTSORCLIPPING option in the config file. This allows Microwindows to be used to just open and setup the  screen driver, but not use any of the mid level drawing routines, which is perfect for bringing over applications that perform all their own drawing, but require only a framebuffer or screen driver interface to the hardware. In addition, support for no fonts is now included if  desired.
  • Kevin contributed win32 checkbox, radio and static controls for the win32 api, as well as a not-yet-working combobox control. This nearly complete's Microwindows' low level custom controls for the Windows api.
  • Simon contributed a horizontally flipped portrait mode driver for systems where the display is upside down. We should now be able to handle almost all landscape/portrait implementations.
  • Andrew contributed a FreeBSD port of Microwindows, as well as hacking the W Window Systems' terminal emulator to run on Nano-X. It provides a VT52 terminal emulation so that now any curses based program can be run as a Nano-X client.
  • Other bug fixes and gdi enhancements were added to support the ongoing Kaffe JVM port by Roman.
  • The GrSetFontAttr api changed slightly to allow runtime underlining without requiring a font switch, this change should be invisible to most user programs.

    I plan on making version 0.88 final in the next few days, it appears that most everything is operational, and I think we need a stable non-prerelease here soon.

    The complete ChangeLog follows:
    Version 0.88pre11 (IBM OTI java&Kaffe ports) - 10th July 2000 -
    * added set palette patch from Joe for Embedded Planet /dev/lcd driver
    * started adding win32 keyboard support (not working yet)
    * added Andrew's port to FreeBSD, Wt wterm terminal emulator port
    * fixed convbdf font size error
    * added Kevin's not working combobox control
    * added George's Isicad Prisma screen driver and config
    * added Simon's flipped portrait mode driver (we now have two)
    * added updated BC5 makefiles from Ming-Lin Kao
    * added HZK font patches from kevin
    * added checkbox, radio button and static controls by kevin/cms
    * changed GrSetFontAttr,GdSetFontAttr api
    * added underlining to font rendering with GrSetFontAttr/MWTF_UNDERLINE
    * fix WS_POPUP parent clipping, add owner window handling
    * fix delete pen/brush/font resources in ReleaseDC, use DeleteObject
    * fix memory leak in GetDCEx using CS_OWNDC
    * added nofont.c for null font support
    * added NOFONTSORCLIPPING config option for screen driver interface only
    * separated engine open and draw routines for small driver interface

FLTK-pre6 on Nano-X, Version 0.88pre10 released

June 18th, 2000
A number of quick bug fixes have been made to the last release, resulting in another prerelease available at:

Microwindows except the microwin/src/fonts/chinese directory:

FLTK ported to Nano-X api:

A lot of work was performed to get the FLTK port to Nano-X running well. It now looks pretty good, though there's still alot to be done. The Nano-X region routines were slightly revamped to best mirror Xlib calls, the GR_RECT structure was changed, and quite a few bug fixes were made.

Tanghao contributed more changes to fltk-nanox, and fixed some expose event problems, added the region code, and added Nano-X to the configure script.

In addition, I fixed up the Microwindows win32 listbox, and started work on non-client area scrollbars, which I've added to bin/mdemo.

Kevin submitted a patch to get HZK chinese character display working with the t1demo program, and Simon contributed a slider game.

Overall, 0.88pre10 and fltk-nanox-pre6 seem to work well.

Please check out the new features, and send any bug fixes to the list. I'll be pretty busy for about the next week.

The ChangeLog for 0.88pre10 follows:
Version 0.88pre10 (fltk-nx port) - 18th June 2000 -
* started adding win32 non-client area scrollbars
* added Simon's contributed slider game (
* added Nano-X GrEqualRegion, GrEmptyRegion, GrOffsetRegion
* added GdEqualRegion, GdEmptyRegion
* changed GdRectInRegion to return partial intersection values
* fixed Nano-X clipping regions relative to drawable
* changed GR_RECT struct to match X, not win32
* changed GrRectInRegion, GrGetRegionBox, GrUnionRectWithRegion parms
to match X
* applied Kevin's HZK font sizing fix
* removed floating point, ldiv from ported progress bar, fixed bugs
* fixed listbox multi-element display code, initial state
* fixed PIXELVALTOCOLORVAL macro typo

Chinese fonts, window manager, polygon regions, arcs, pies, fltk
Version 0.88pre9 released

June 15th, 2000
Well, I've finally completed another big prerelease of Microwindows, thanks alot for all the contributions... I can barely keep up, it seems. This distribution is split up into a couple files because the contributed chinese fonts are large. The following files are now available:

Microwindows except the microwin/src/fonts/chinese directory:

Chinese fonts (12x12, 16x16 ascii, GB2312 and Unicode-16 and others):

FLTK ported to mwin32 API:

FLTK ported to nano-x API:

I want to merge the two FLTK ports into one, but the Nano-X version was just contributed, and I only had time to make sure that it ran well. (And it looks great with our new Nano-X Window Manager!)

There have been a large number of contributions since the 0.88pre8 cut, and I have included almost everything that has been submitted. Following  are some of the highlights:

  • Chinese character display is now incorporated within Microwindows. There are a few variations, and the work is still in progress. We now support disk-based Unicode-16, GB2312 and Big5 Chinese national standard encoding with contributed 12x12 and 16x16 Han Zi Ku chinese and ascii fonts that display well together. This option is enabled with the HAVE_HZK_SUPPORT config option.  Thanks to Tanghao and Jauming for this contribution. Separately, a compiled in chinese font with GB2312 encoding support is enabled with the HAVE_GB2312_SUPPORT option. Thanks to Guo for this. There are a number of issues with the implementation, and I will follow this up in a separate email. 
  • Nano-X now has a working window manager, thanks to Alex Holden.  While still a work in progress, it allows movement of windows and paints title bars, close boxes, and resize borders. This is a great piece of work and I am very impressed. It runs as a separate process, just like the Nano-X processes do. 
  • Complete region support has been added to Nano-X, which we've been needing in order to proceed with the GTK and FLTK-nanox ports. In addition, full-blown (optional) polygon area regions have been added to our region engine. Thanks to Murphy for most of this work.
  • Arcs, pies, and outlined arcs have been added to Microwindows and Nano-X. This was a big pain, although a lot of fun. There's still some bugs in there but we've now got all our basic drawing functions done. I wrote a new demo to show them off.
  • Kevin contributed ports of MiniGUI's listbox, edit control and progress bar, and I dressed them up and made them look very 3d for the mwin32 api. The listbox doesn't seem to display more than one item, but more controls will soon be added, like combobox and scrollbars.
  • The MIPS based Osprey board is now supported, along with some changes to the touch-pad calibration program, contrib/GPL/tpcal.
  • Various fixes to get Nano-widgets and C++ objects to compile are included, as well as a palette patch for VNC. A nasty data corruption bug, only when UPDATEREGIONS was set, is fixed.

The complete ChangeLog for 0.88pre9 follows:
Version 0.88pre9 - 15th June 2000 -
* added Chinese Han Zi Ku font support from Tanghao and Jauming
12x12 and 16x16 ascii and chinese fonts
Big5, Unicode-16 and GB2312 encoding supported
set with config option HAVE_HZK_SUPPORT
* added Guo's Chinese GB2312 decoding routines, fonts/gb2312font.c
set with config option HAVE_GB2312_SUPPORT
* added Jin ke xue's gb16x16song.c font file (no support yet) (and .bdf)
* fixed C++ objects to compile
* added Rosimildo's RTEMS changes, convbmp allows full paths
* added Alex's VERY COOL nano-X window manager! (great job!!)
* added GrSetWMProperties,GrGetWMProperties,GrCloseWindow, GrKillWindow
* added Alex's npanel enhancements (solid dragging, zombies)
* added Alex's cpu usage reduction to nclock, npanel
* added Alex's patch to get nano-widgets to compile
* added Alex's PPM file decoder demo6
* implemented DT_CENTER, DT_RIGHT for DrawText
* added changes in tpcal.c for MIPS Osprey board port, dblclk changes
* HAVETEXTMODE #define for Osprey and Embedded Planet ports
* added Michael's MINIX port updates
* added George's setpalette changes to VNC
* added GdAllocPolygonRegion, GrNewPolygonRegion, CreatePolygonRgn
* fixed nasty #if UPDATEREGIONS in windows.h compile problem
* added Kevin's port of edit, listbox and progressbar from MiniGUI
* added GdGetRegionBox, GrGetRegionBox
* fixed update regions calc bug
* combined GdEllipse and GdFillEllipse and Arc/Pie routines
* wrote pie, arc, outline arc routines, win32 Arc,Pie, GrArc,GrArcAngle
* added George's patch to fix X11 screen driver setpalette function
* added Murphy's region code for Nano-X, also polygon regions

Version 0.88pre8 released

May 23, 2000
I have finally put together another release of Microwindows at:

This release has been a while in coming and includes the following major enhancements, including those in the unannounced 0.88pre7 release:

o Fixed font issues with FLTK port, things are now starting to look pretty good. I have released an FLTK snapshot that works well with this release at:

o Added George's VNC viewer for Nano-X. This is very, very cool, and it works, although it's not complete. A Microwindows based system can now communicate with Windows, UNIX and Mac systems and can actually operate any program remotely! This means that handhelds and PDA's can now potentially  communicate with servers and have users operate anything, using very little RAM. Currently this only operates in 8bpp mode, but I plan on enhancing it considerably.

o Added Morten's two patches for font selection and external keyboard and mouse input. These patches are necessary for  the Opera port to Nano-X and other things Morten is working on. The font selection is turned on with a #define FONTMAPPER in device.h and allows for very sophisticated font selection via the new logical font structure filled in by user programs. 

o Finally fixed the Nano-X server crashing on certain client exits. Thanks to Kevin Lin for this.

o Fixed win32 top/baseline/bottom positioning, required for FLTK.

o Added support for DJGPP, BC 5.02, and MINIX.

o Completed port to Embedded Planet's PowerPC box. We now have both touch screen and framebuffer display support when used with Monta Vista's CDK.

o Finished cool minesweeper game, complete with bitmaps.

o Many bug fixes of all types.

We have finally got an initial snapshot of the GTK+/GDK port running on Nano-X. There's still quite a bit to do, as it barely runs. There's a snapshot tarball as well as a diff from the GTK 1.3 CVS at: I'm not sure I advise playing with this just yet. Thanks to Paolo for this great work.

The ChangeLog for this release since 0.88pre6b is:
Version 0.88pre8 - 23rd May 2000 -
* added Murphy's X vs Microwindows speed tester in contrib/speedtst
* fixed convbdf to not emit nonascii characters
* added Victor's DJGPP port
* removed automatic portrait mode
* added extern "C" to nano-X.h
* added Kao's patches for BC5, enhanced scr_tc.c, some bug fixes
* fixed win32 top/baseline/bottom positioning
* added Morten's GrInjectKeyboard/GrInjectPointer patches
* added Kevin Lin's fix to Nano-X persisent mode curclient crash
* changed GdCreateFont name,height semantics
* added Morten's font picker algorithm, turn on w/#define FONTMAPPER 1
Note: font selection is currently under development
and will likely change
* cleaned up source for Michael's MINIX port, replaced convbmp.c -s opt
* fixed XYPOINT in mou_tp.c, changes for embedded planet tp driver
* fixed multiple GsSelect() call in GrGetNextEvent in linked client/serv
* continued port of VNC to Nano-X, contributed by George
* added Rosimildo's patch for RTEMS, MW* fixes, svgalib fade

Version 0.88pre7 - 15th April 2000 -
* added LINUX-POWERPC port for embedded planet linux box
* fixed Polygon routine fill/draw reversed, AdjustWindowRectEx
* fixed no root window paint without background bitmap
* added bitmaps to minesweeper, polished up
* added middle button handling for mwin
* added GrSetSystemPalette
* added user-replaceable GdError, removed all fprintf/printf's
* added EPRINTF for all error printfs, DPRINTF for debug printfs
* removed HAVE_PERROR config option
* changed memmove to memcpy

Interim Version 0.88pre6b

April 5, 2000
I've added the patches received since 0.88pre6 and have released another interim version, 0.88pre6b:

The patches received consist mostly of bug fixes,  except for Erik's very cool implementation of alpha blending for the X11 screen driver. Now everyone can check out alpha blending for Microwindows on their X11 desktop.

However, there seems to be a big problem in the X11 screen driver when running X in 8bpp mode: Microwindows runs out of colors and starts returning BlackPixel from  XAllocColor: thus alpha blending doesn't work in 8bpp mode. In addition, the has the same problem.

If anybody volunteers to fix this problem in the X11 driver, that would be GREAT!

I've also made some small changes for the Kaffe port in progress, and started porting a minesweeper game.

Attached is the ChangeLog:
Version 0.88pre6b - 5th April 2000 -
* added PostThreadMessage
* started porting minesweeper game
* fixed -p persistent mode
* added Kao's BC 5.02 fixes, other pre6 fixes from name changes
* added Steven's patch for polling drivers, HAVE_PERROR config option
* added Erik Hill's alpha blending for X11
* fixed jpeg compile bug
* removed include <asm/io.h> patch from Shane

Opera, Kaffe, GDK/GTK+ and FLTK ports being supported

April 2, 2000
The 0.88pre6 release is now available.  Quite a few modifications have been made in order to better support the new work with GDK/GTK+ and Kaffe ports that have just started.  The prerelease is available at:

This release contains MAJOR changes to the public header files in an attempt to clean up the exported namespace problems with Microwindows. All Nano-X exports now start with GR_*, and  all client callable routines start with Gr*. In addition, quite a bit of work was done making sure that only symbols required to be exported are made public. This should help Microwindows be more suitable for the GDK/TGK+ and FLTK ports now in process.

All Microwindows engine typedefs and defines now start with MW*, and have been placed in mwtypes.h rather than in device.h.  Most previous Nano-X and Microwindows applications should compile up without change, except that some of the latest font flags have changed from TF_* to GR_TF*, etc. The public header files for Nano-X and Microwindows remain nano-X.h and windows.h respectively. Oh - GrUnloadFont is renamed GrDestroyFont.

I have created a new GR_LOGFONT (MWLOGFONT) structure for describing fonts more precisely with GrCreateFont. There are now mechanisms to specify a font's height, width, orientation, weight, family, pitch, and character set. The current font selection routine only uses the facename and height, however.

There are quite a few other small bug fixes included, as well as more Win32 API implementations for the Kaffe port. A couple more X11 fonts were converted, and 5x7 and 6x13 versions compiled into the base system for better readability with the terminal emulator. The system now automatically runs in portrait mode if yres > xres.

I plan on working on the new blitting architecture and getting better kbd support next.

Following is the ChangeLog:
Version 0.88pre6 - 2nd April 2000 -
* major header file cleanup, fixing namespace pollution
API typdef procs data
Nano-X: GR_* Gr*,nx*,(Gs*) nx*
Microwindows: MW* Mw* mw*
Engine: MW* Gd*,Mw* gr_*, fb*
* changed all Nano-X structures and defines to be GR_ prefixed
* MW prefixed all exported typedefs for name space cleanup,
split device.h into mwtypes.h for exports
* added MWLOGFONT font descriptions
* removed BUTTON, MODE, MODIFIER typedefs
* added Martin's updates to FreeType renderer, updated ftdemo
* added Martin's updated xconfigure for X-based configuration
* renamed GrUnloadFont to GrDestroyFont, GdDestroyFont
* clean up various unwanted nano-X client library symbol exports
* redraw windows on nano-X client disconnect
* added -p for nano-x persistent mode, no exit on client disconnect
* added Timo's fix in GsAcceptClientFd, ignore SIGPIPE, mult GrClose bug
* added automatic portrait mode if screen y resolution > x res
* fixed GrReqShmCmds for linked client/server case
* implemented freetype renderer ascent/descent calculations
* added ascent field to compiled fonts, GrText uses TF_BASELINE default
* added 5x7, 6x13 compiled (bdf) fonts, FONT_SYSTEM_FIXED is now 6x13
* fixed typo in fonts/convbdf $IMAGEBITS incorrect
* added #include <asm/io.h> for outb in 2.3.x systems
* added AdjustWindowRectEx, WM_ACTIVATE, IsWindowEnabled
* completed GetPixel, added PIXELVAL to COLORVAL conversion macros

TrueType and Adobe T1 fonts now supported

March 19, 2000
After an _extremely_ lengthy weekend, I have now got both TrueType and Adobe Type 1 font support integrated into Microwindows. Release 0.88pre4 is available at:

Big thanks go to Vidar and Martin for contributing the initial work in this area.

Version 0.88pre4 has had the font routines heavily rewritten to allow multiple renderer support for fonts. We now are able to run using compiled-in builtin fonts (converted using supplied bdf or Windows utilities), as well as using the FreeType and T1 libraries for advanced font rendering. All can be supported simultaneously, if desired.

Support for ascii, unicode-16, and unicode-32 is completed, allowing text to be supplied from applications in these formats. UTF8 support is almost supported, but we need a non-LGPL version of a utf8 to unicode-16 converter. Flags bits to the GrText/GdText routines tell Microwindows how to convert all text before rendering it. Renderers can request text in any format.

Font scaling to any pixel size, as well as rotations in degrees, and antialiasing for 8, 16, 24, and 32bpp is also completed.

Two new Nano-X sample programs ftdemo and t1demo are written to show off the new technologies. The source in microwin/src/engine/devfont.c can be modifed to  turn on rotations or turn off antialiasing. 

There is still some work to do in GdArea, which I will start rewriting soon, as the alphablending and transparency blitting are not performed at the driver level yet, so the antialiasing only works well when you know the final destination color. The plan is to implement two new low level blitters that the font renderers can use, one for alphablending and the other for transparent blitting.

Finally, we've added another touch screen driver for the  ADS SA1100 ARM evaluation unit, which features a 640x480 3"x5" LCD display. We'll be contributing the kernel driver soon.

Have fun checking this out!

Here's the ChangeLog:
Version 0.88pre4 (truetype/t1 fonts) - 19th March 2000 -
* implemented text drawing in ascii, utf8, unicode 16 and unicode 32
* added font id's for Nano-X, added GrCreateFont, GrUnloadFont
* rewrote font subsystem heavily
* added alphablender for antialiased fonts for 8, 16, 24 and 32bpp
* added GrText, GrGetGCTextSize flags, CreateFontIndirect
* added GdText TF_ flags for 8,16,32 bit packing, top/bottom alignment
* added Martin's FreeType TrueType font support
* added Vidar's t1lib adobe type1 font support, t1demo for Nano-X
use HAVE_FREETYPE_SUPPORT config option
use HAVE_T1LIB_SUPPORT config option
* renamed min/max to mwmin/mwmax
* added Fabio's xconfigure patch for VTSWITCH
* fixed WM_CREATE lparam bug
* added mou_ts.c touch screen driver for ADS ARM port
* added GrSetGCFontSize, GdSetFontSize, GdCreateFont, GdUnloadFont
* added GWL_USERDATA to Get/SetWindowLong
* turboc port screen driver fixes
* added nonclient region special paint handling to avoid flicker
* added null kbd driver, set with NOKBD=Y

Version 0.88pre3d release, fltk port available

March 12, 2000
I have posted another prerelease of Microwindows at:

This version contains considerable enhancements which are needed to get FLTK (Fast Light Tool Kit, a C++ widget set) ported to Microwindows. Great progress has been made. Almost all the widgets are at least operational, although more work needs to be done. Screenshots of FLTK running on Microwindows are available at:

I have posted a cut of fltk 1.0.7 hacked for Microwindows at:

Thanks to Shane for the screen shots and the fonts work.

Enhancements to Microwindows in this cut include quite a few win32 API new implementations, including complete region handling including complex regions like round rectangle and ellipses, update regions/clipping, valid/invalid area paint handling, polygon and ellipse drawing, and font routines.

In addition I have added the Linux Penguin to the Microwindows demo so that Microwindows can be better shown at various trade shows. (It was recently displayed at the Embedded Systems Conference in Chicago, and will be at several more in the next month)

For fun, I have added experimental palette animation. This works only on 8bpp palettized displays, and the Microwindow screen fades in on startup, as well as between console switches. It's quite cool.

A variety of bug fixes are included in this release, including a nasty one which took many hours to find. The first 16 colors of the palette were being overwritten if Microwindows was compiled with VTSWITCH=Y.  Also, portrait mode is working again.

Following is the ChangeLog:
Version 0.88pre3d (fltk port) - 12th March 2000 -
* changed FONTINFO struct, added firstchar, lastchar
* added Shane's fonts patches, added CreateFont, GetTextMetrics,
        GetCharWidth, SetAlignText
* debugged nasty VTSWITCH palette changed bug
* experimental #define ANIMATEPALETTE for cool fade in
* added Kyle's patch to get portrait mode working again
* fix SetClipRgn/ExtSetClipRgn to take client coords (win32 api doc bug)
* added WM_SHOWWINDOW msg
* fixed coords to WM_MOVE msg for WS_CHILD windows
* added PeekMessage, Ellipse
* added Rosimildo's rtemscfg.h patch
* added GetUpdateRgn, GetUpdateRect, GdOffsetRegion
* added Kyle's GdCopyArea fix
Version 0.88pre3c (fltk port) - 8th March 2000 -
* added CS_OWNDC private DC's
* added SetActiveWindow, SetForegroundWindow, BringWindowToTop
* added Polygon, PolyPolygon (filled and outline)
Version 0.88pre3b (fltk port) - 6th March 2000 -
* added GetDeviceCaps, Polyline
* added extern "C" in windows.h
* fixed loop bug in CreateRoundRectRgn
* added penguin to bin/mdemo
* added ValidateRect, ValidateRgn, InvalidateRgn
* completely rewrote UPDATEREGIONS handling for new region fns
* added DCX_EXCLUDEUPDATE handling to window clipping
* sped up WndSetClipWindow, GsSetClipWindow
* added GdSetRectRegionIndirect, GdSubtractRectFromRegion
* added SetWindowPos for size,move,show,hide,repaint,zorder

Version 0.88pre3 release, fltk port started

March 5, 2000
There's a new cut of Microwindows, 0.88pre3 at:  

This version primarily adds dynamic region clipping support, which will be required for the fltk widget set port that's been started.  In addition, at Alan Cox's request, a define can be unset to run under the smaller memory usage static cliprect design, for extremely small systems.

The full-blown clip region support is pretty cool, since now Microwindows performs region Intersect, Xor, Subtract, and Union.  This made it quite easy to add user-specificed clipping regions that can be added/subtracted from the z-order computed visible region.  I've hacked the 3d demo to display only within a circular region, thus testing CreateRoundRectRegion as well as blitting into circles.  Try it out, it's kinda cool. 

In addition, Allistair Riddoch performed an amazing feat in about 50 lines of code - he added client-based window management to his Nano-X panel program.  Now you can exec programs from the Nano-X server, and move them around! In addition, Rosimildo's Uniform Input Device and MicroFramebuffer Architecture common API for RTEMS and other RTOS's is included. And Victor contributed a TURBOC port, for 16 bit systems, using BGI... 

Vidar added offscreen drawing support for Nano-X in 0.88pre2, this allows Nano-X programs to draw images offscreen and then use the blitter for flicker free drawing.

Version 0.88pre1 introduced a heavily rewritten set of screen drivers for speed, as well as a newly designed interface for offscreen draw handling.  With the new interface, the screen driver rather than engine code allocates offscreen buffers, which allows the driver to control how offscreen drawing is initialized and performed.  It's alot faster and cleaner.

Also, 0.88pre1 introduces the "make install" option, which copies Microwindows and Nano-X header files into /usr/bin/microwin, allowing use of #include <microwin/windows.h> in programs.  The libraries are renamed libmw*.a, and released into /usr/lib.  This allows developers easy access to Microwindows headers and libraries.

Following is the ChangeLog since the last major release: Version 0.88pre3 - 5th March 2000 -
 * added contributed DOS TURBOC port by Victor
 * modified bin/mdemo to clip 3d drawing into a circle, added penguin
 * added GdAllocRectRegion, GdAllocRectRegionIndirect,
 * added GdSetRectRegion, GdAllocRegion, GdDestroyRegion
 * added SelectClipRgn, ExtSelectClipRgn, user clip regions!
 * added DYNAMICREGIONS define for dynamic vs static (small) clip code
 * added win32 HRGN object and region routines
 * added GetCursorPos
 * added Al's update event patches for Nano-X client window manager
 * added Rosimildo's RTEMS patches for uniform input devices
 * added George's partial mouse data read fixes (upper level only)
Version 0.88pre2 - 29th February 2000 -
 * added Al's npanel Nano-X program exec'er (cool)
 * added Al's patch to cleanup windows on Nano-X client exit
 * added Al's ignore sigpipe for ELKS
 * added Morten's jpeg grayscale patch
 * create dword-aligned offscreen bitmaps for speed
 * removed much of global scrdev
 * changed screen driver open routine to return psd
 * added Vidar's patch for offscreen drawing in Nano-X, added
  GrNewPixmap, GrCopyArea.  GrDestroyWindow destroys pixmaps
Version 0.88pre1b - 23rd February 2000 -
 * added Kyle's bug fix for 16 and 32bpp jpeg support
Version 0.88pre1 - 22nd February 2000 -
 * added PSD to GdClip routines, fixing potential offscreen write bug
 * renamed libraries, added "make install", hdrs to /usr/include/microwin
  and libs to /usr/lib/libmw*.a and libnano-X.a
 * renamed RECT, POINT, CLIPRECT and CLIPREGION types to MWxxx
 * added Al's ELKS patches for client/server Nano-X on ELKS
 * renamed xconfigure, updated INSTALL with make instructions
 * rewrote all fb drivers for speed eliminating multiple function calls
 * allow GdText count == -1 for strlen()
 * added GdCalcMemGCAlloc to calculate offscreen allocate size
 * added three offscreen memory allocation entry points to screen driver
 * rewrote vga16 driver to use outw rather than outb for speed
 * adjusted fb drivers to always draw last point for drawhorz/drawvert
 * rewrote VT switching code, removed from fb driver to separate file
 * added SetIOPermissions in scrdev for pthreads create i/o bitmap bug
 * fixed parms named "min" in demos for ELKS bcc compiler
 * changed VT switch signal to SIGUNUSED for pthreads compatibility
 * added Brad's touch panel/mouse calibrator to contrib/GPL/tpcal
 * fixed up SVGAlib driver for 256 colors, added screen to screen blit
 * process all mouse messages before next select: better mouse speed
 * added HTBORDER hit testing
 * fixed FBVGA blitting, wrong scrdev used on memdc

Version 0.87 release

February 13, 2000
Microwindows version 0.87 is (finally) released. Source code is available at:

Version 0.87 is fairly stable and seems to work well. It's been a long time in coming since the 0.86 release at the end of October, 1999.  Following are some of the major additions:

  • The 0.87 release now runs on Linux framebuffer, Linux SVGAlib, X11, Solaris, RTEMS, ELKS, MSDOS 32 bit with DJGPP, and MSDOS 16 bit with MSC and PACIFIC C (free). The X11 screen driver supports emulating a target screen driver in 1, 2, 4, 8, 16, 24, and 32bpp, without having to cross-compile and run the application on the target device. 
  • The framebuffer screen drivers have been tested well, and now offer support for 1 through 32 bits per pixel, as well as high speed (software) blitting, and alpha blending. 1 though 8 bpp palettized modes, as well as 16, 24 and 32bpp truecolor modes are supported. The framebuffer drivers have been tuned for speed, although more enhancements are planned. 
  • The new make system is completed, and a config file now controls all options for specifying target architecture and features options. Cross- compilation support for x86, MIPS, ARM Linux, Solaris, ELKS, DJGPP and RTEMS is included. All demos and libraries are built at once, so it's much easier to link Microwindows when developing an application. A C++ object frameworks has been added. Support for displaying JPEG and BMP file types has been added. 

Thanks to everyone for the contributions - it was getting overwhelming for a bit there, but almost all contributions have been added to this release. 

I will now start work on getting the tree into CVS, as well as merging contributions for Truetype font support, as well as some cleanups with the screen device structure for speed. In addition, as a result of the press we've been getting, a number of folks are interested getting Microwindows running with their hardware and software. 

Following is the detailed ChangeLog:
Version 0.87 - 13th February 2000 -
* added VTSWITCH in config to include virtual terminal switch code
* added support for 24bpp, wrote 24bpp fb driver
* fixed 8/8/8 color macros: RGB2PIXEL888, COLOR2PIXEL888, PIXEL888RED
* fixed 32bpp fb bug with psd->ncolors, 32bpp alpha blit bugs
* added fb driver support for FB_VISUAL_DIRECTCOLOR cards (ATI)
* sped up 16, 32bpp blitters by using memcpy
* added large font patches from Kyle
* added PACIFIC C compiler support from Victor
* default UPDATEREGIONS=N in config file for alpha blend demo
* removed XORMOVE from config, requires only ERASEMOVE=N
* wrote alpha blending demo (requires UPDATEREGIONS=N)
* rewrote void *pixels in devdraw.c, won't compile on ansi compilers
* fixed PF_TRUECOLOR0888 bug in GdArea
* added DJGPP as config ARCH option, Victor's patches for DJGPP
* finalized alpha blending blit routines for 8, 16, and 32bpp
* added SetTimer/KillTimer api (single timer only)
* added Chris' SetSysColor api, C++ object frameworks patch to mwin/
* added Rosimildo's make patches for RTEMS
* added Martin's make/configure patches

Microwindows competes with Win2000 and MAC OS X??

February 5, 2000
Microwindows offers features that only the latest Windows 2000 and upcoming MAC OS X have - translucent windows.  This feature, sometimes called alpha blending, is being touted by the press as one of the coolest features of these new operating systems, and now we have it (well, almost).  Check out this screen shot for what's coming:

The application shown in the screen shot requires applications programming for the effect.  Soon, you'll just be able to set a window style bit and get it automatically.  Keep posted for details.

Feature story in

February 1, 2000 featured an article on Microwindows, entitled "Linux + Microwindows: challenger to WinCE".  The news feature spoke highly of the Microwindows Project and our ability to offer a WinCE-compatible graphics API now for embedded systems developers.  The article was picked up additionally by and  The article can be seen at

Version 0.87pre6 release

January 31, 2000
YAP (yet another prerelease) of Microwindows 0.87 is available at:

There have been so many contributions that I feel necessary to release this for quality reasons. I want 0.87 to be quite stable, and I think the Makefile system is now approaching it. Following are the main additions:

  • Martin contributed an updated X11 based configure program,  allowing users to configure various options of Microwindows graphically.
  • I've added experimental alpha blending support, just to test the concept. This works on 8, 16 and 32bpp displays. More will be coming in the 0.88 release. 
  • Morten has contributed GrArea enhancements for high speed rendering, including some 16bpp alpha blending support. 
  • Chris has contributed a C++ objects framework, which can be enabled via the OBJFRAMEWORK config option.  
  • Many, many makefile changes and some small bugfixes.

I plan to go final within the next few days, after contributors have had a chance to sign off on the release, if desired.

I want to thank the growing list of contributors to Microwindows. It's really getting fun. I've been working on getting some trade press for the project, and this should be coming real soon, so our efforts will be visible to a much larger group of people.

Following is the ChangeLog:
Version 0.87pre6 - 31st January 2000 -
* added C++ objects framework from Chris
* added support for multiple read/write/except fd's from Chris
* added Martin's X11 configure program and various Makefile fixes
* added compile time warnings patches from Chris
* added Morten's drawarea patch pre5mr1
* added experimental 8, 16 and 32bpp constant alpha blending to bitblit
(#define ALPHABLEND in device.h and run bin/mterm for demo)
* changed distance-cubed find nearest color to use abs() for speed
* fixed max character height/width alloc; max now 128x128 (configurable)
* small bugfix DRAWON/DRAWOFF in mempl4.c

Version 0.87pre5 release

January 26, 2000
Thanks to everyone for the large number of contributions to Microwindows this last week. The quantity was large enough that I feel we need yet another preprelease before 0.87 can go final, since I want the releases to be pretty bug free and stable. This latest prerelease is available at:

There are quite a few bug fixes and enhancements to the Makefile system, which since pre4 uses config files to set all options. This release includes prebuilt config files for framebuffer, x11, and SVGAlib, in addition to RTEMS builds.  Notable additions, aside from many Makefile modifications include:

  • bug fixed XOR drawing code for 1, 2, and 4bpp fb, thanks to Manuel Teira Paz. In addition, I optimized quite a few routines when I discovered that gcc doesn't generate a shift right for int/2 constructs (try it).
  • Morten contributed sizeable changes to the GdArea routine, including a 16bpp drawarea driver for fast GdArea drawing.
  • Chris contributed changes moving architecture information out from Makefile.rules to Arch.rules, as well as adding the SetWindowLong function for using window extra bytes. In addition, config files can be kept in a user's home/microwin directory so that the distribution can remain read only.
  • Kyle contributed changes for arbitrary-width character drawing in Microwindows by submitting a newly hacked perl script that will translate any width character, along with the appropriate driver modifications. Cool! We now support characters up to 128 bits wide.
  • Finally, an innocuous problem regarding unsigned short to int promotion fixed the DJGPP port.

Some patches didn't apply well and overlapped. I will be sending individual email to each contributor with more detailed information. I hope to wrap up 0.87 before Friday.

Following is the detailed Changelog:
Version 0.87pre5 - 26th January 2000 -
* prepared prebuilt config files for fb, x11, svga
* added Morten's drawarea driver patch (16bpp only)
* fixed XOR drawing for 1, 2, 4bpp, improved speed with x>>2 not x/4
* applied Chris' FBVGA patch
* applied Rosilmildo's RTEMS compiling patch
* applied Morten's SCREEN_PIXTYPE X11 Makefile patch
* added Chris' SetWindowLong and $(HOME)config and Arch.rules patch
* completed fix for DJGPP compiled mou_dos.c driver
* added Kyle's patches for arbitrarily wide text chars

Version 0.87pre4 release

January 18, 2000
The final prerelease of version 0.87 is now available at:

This release contains quite a few small changes, and a big change to the Makefile system. Morten Jolicoeur contributed a config-based Makefile system back in October, and I've finally caught up enough to make it all work with all the changes since then. This new system allows separate config files to be used to control different machine targets, operating systems, and features without modifying the Makefiles. Martin also wrote a X wish based gui config generator, but I haven't been able to test that. Please check out the config system and let me know how well it works.  

  •  Martin's contributed JPEG and BMP file reader/display routines, so that disk based images can be displayed. 
  •  Morten's variable sized PIXELVAL mods, so the servers can be compiled using 8, 16 and 32-bit sized PIXELVALs, for best memory utilization, and allowing applications to create and display images in the native hardware format. 
  • PF_TRUECOLOR0888 (note that 0) was added for  4 byte pixel packing. 
  • Victor Rogach contributed a DJGPP port of Microwindows based on the GRX graphics package. GRX sets up enhanced video modes under 32-bit protected mode so that Microwindows now runs on 32-bit DOS. 
  • Rosimildo contributed changes for the RTEMS operating system, allowing the scr_bios vga driver to be used without making _any_ bios calls. 
  • Kyle Harris contributed fixes to the 16 and 32bpp framebuffer blitter routines, they didn't work for non-zero offsets.  
  • Added Dan's GrReparentWindow routine, allowing window managers to be written.

Full Changelog:

Version 0.87pre4 - 18th January 2000 -
* added Martin's new config-based Makefile system
* added Martin's JPEG and BMP file reading/display routines
* added Morten's variable PIXELVAL size mods
* added contributed DJGPP/GRX port by Victor Rogachev
* fixed 16bpp and 32bpp fb blit routines, by Kyle Harris
* added Rosimildo's RTEMS changes, scr_bios now runs without bios
* added Dan's GrReparentWindow, fixed GetWindowInfo bug
* added PF_TRUECOLOR0888 for 4 byte packing
* updated doc directory with html faq, architecture

Version 0.87pre3 release

December 19, 1999
A hopefully final prerelease for version 0.87 has been released, and is available for download at:  This prerelease covers most issues discussed on the NanoGUI list the past couple of weeks.  Changes include:

  • Directory reorganization started.  .  The Microwindows and Nano-X specific source code, as well as the common engine routines are now in their own directories.  Include files are placed in a common directory, etc.  Although the source file rearrangement is nearly complete, I still haven't added Martin's new Makefile system (that will be coming, next cut). Thus, there still aren't separate bin and lib directories, but  the source organization should make learning easier.
  • GrArea() modified to allow different types of pixel data to be displayed.  Most of this is discussed in previous email lists.  It all works and should be enough for Morten to use as a base for his work.  This involved quite a bit of work, but is worth it since Nano-X now supports drawing in device dependent and device-independent manners.
  • Quite a few bug fixes, including the Nano-X 64k request packet fix, the GrMoveWindow fix for Nano-X allowing windows to be moved and clipped properly, fixing portrait mode in Microwindows offscreen blitting, and the assert() fix that caused Microwindows to exit sometimes.

    For the next cut I plan on adding Martin's make system, which allows for much better configurability, as well as all demos and libraries to be made at once.  In addition, I'm probably going to take a swipe at creating a window manager base for Nano-X, so that it's windows can look as cool as Microwindows API, if desired. (No, this won't add much code).

    Following is the detailed ChangeLog:

    Version 0.87pre3 - 19th December 1999 -
     * started directory reorganization
     * changed LINUX meaning in Makefile, added UNIX for SOLARIS
     * fix negative blit index bug found under X11 by Piotr
     * set rootwp->parent = NULL for nano-X, fixes GrMoveWindow clip bug
     * added COLORVAL<->PIXELVAL conversion macros
     * modified GrArea to take packed pixel values of 8, 16 and 24 bits
     * modified GrArea to take RGB COLORVALs as well as PIXELVALs
     * renamed PF_TRUECOLOR24 to PF_TRUECOLOR888
     * added tunable MAXREQUESTSZ to limit max request length
     * modified Nano-X demo.c to GrArea() > 64k pixelvals for testing
     * fix client/server 64k length bug (request can be 24 bits in length)
     * fixed portrait mode in CreateCompatibleBitmap

Version 0.87pre2 release

December 14, 1999
The second prerelease for version 0.87 has just been released, and is available for download at:  This release is primarily intended for inspection and testing of the changes before the directory tree reorganization, planned next.
The major enhancements include:

  • Portrait mode driver for framebuffer systems.  This is a big win for handhelds and palmtops, many of which require portrait mode for normal operation.  All graphics output, including mouse movement, hotspots, and text output, are rotated and displayed in portrait mode.  In addition, your Microwindows applications can be viewed in portrait mode on the desktop.  Try moving the mouse without holding your head sideways!
  • The RTEMS operating system port source has been integrated with the main tree.
  • Fixes to allow Microwindows to be run on big-endian machines are now included.
  • Various bug fixes including the Microwindows terminal emulator pty fix for X11, and Nano-X GrMovewindow fixes for child windows.  There are still some issues relating to Nano-X clipping during window movement.


December 3, 1999
There's been alot of interest and development with Microwindows lately.  Rosimildo daSilva has ported Microwindows 0.86 to the RTEMS operating system, available at   RTEMS is a POSIX-threads compliant real time multitasking operating system which runs on Intel, Motorola, Hitachi, Mips, and many other CPUs.

Version 0.87pre1 release

December 2, 1999
I have prepared an interim release of Microwindows and Nano-X enhancements, which completes many things folks have asked for, version 0.87pre1. This is available for download at
The major enhancements include:

  • Support for running under X11. Microwindows and Nano-X can now run as a user-defined (default 640x480) window under X Windows. The graphics output and look and feel are identical to framebuffer, but will run on any X display server.
  • Compile-time options allow configuration to emulate any of the Microwindows truecolor or palette modes, in any pixel depth, including grayscale. This allows a Microwindows or Nano-X application to be emulated exactly, regardless of the host's or target's framebuffer characteristics. Thanks to Tony Rogvall for the X11 driver.
  • The client/server network code has been completely rewritten for speed!!! I studied the X11 Xlib implementation and came up with a similar implementation. By queuing all client data until an event or reply is required, Nano-X now runs at extremely high speed. For benchmarking, use the world demo, which plots several thousand points.  This demo now runs extremely quickly.  Unlike the Xlib implementation, Nano-X still runs synchronously per client, meaning that once a client request packet is sent, the server waits until the whole packet has arrived until servicing another client. This keeps the server code immensely simpler, while still running very quickly.  I urge interested folks to check out the implementation, in mwin/src/nanox/nxproto.{ch}, and mwin/src/nanox/client.c.
  • Routines were added to allow Nano-X to be used as a "passive library", meaning that an application with it's own main loop can now call into Nano-X occasionally (after a select returns a file descriptor that Nano-X is interested in), and it will all work. This was done for Morten. See mwin/src/nanox/client.c, functions GrPrepareSelect(), GrServiceSelect(), GrMainLoop().
  • Routines were added to get the system palette, and translate an RGB color to a PIXELVAL palette index. This was for Richard and the Opera browser. See mwin/src/nanox/srvfunc.c, functions GrGetSystemPalette, GrFindColor().
  • A null mouse driver was added for systems without a mouse, by setting NOMOUSE=1 in Makefile.

    This is released as 0.87pre1 because I still haven't finished the directory tree reorganization, and adding Martin's cool X11 graphics makefile configuration tool. The client/server code rewrite took alot more time than expected. I am also working on getting all source on CVS.

NanoGUI combined with Microwindows

November 13, 1999
Alex Holden, the originator of the NanoGUI project, officially handed over his role to Greg Haerr, so that the NanoGUI and Microwindows projects can officially be available as a single distribution.  Alex continues to host the Microwindows/NanoGUI mailing list.   Although the releases have been maintained for some time by Greg Haerr, the official distribution site is now moved here.  A big thanks goes to Alex for thinking up the NanoGUI idea and hosting the initial web site.

Opera Web Browser ported to Microwindows

November 11, 1999
The Opera Web Browser, a browser known for it's small footprint and operation on different operating systems, including Windows, BeOS, Linux, Solaris, MacOS and OS/2, has announced they have completed initial work porting Opera to Microwindows.  This is a crticial milestone for Microwindows, since it shows that larger, graphics intensive applications can run on top of the Microwindows graphics engine.  The Opera port uses the Nano-X api and features jpeg and gif image support, as well as transparent image drawing.  The codefile size is 670k.  The current Microwindows footprint is less than 100k with no compiled-in images.

Version 0.86 release

October 28, 1999
Thanks to Brad LaRonde for helping me get this web page out.  I have posted an update v0.86 to Microwindows/Nano-X at:

This version completes a major effort, that of implementing off-screen drawing, as well as screen-to-screen blitting. The screen driver interface had to change to accommodate this, and I had to rewrite all the screen drivers. In addition, the blitting routines were written for 1, 2, 4, 8, 16 and 32bpp linear framebuffer devices, as well as the 16 color 4 planes vga (this was a royal pain...) The blitting uses a clipping region traversal algorithm so that blitting is always high speed, even when the destination window is partly obscured.

This release also auto-detects most Linux framebuffer implementations, and should have a compiled in driver for it.

The standard Microwindows demo is now a graphical terminal emulator, mterm. (No, it doesn't run vi yet, and it doesn't repaint it's screen contents, but it will ;-) This demo requires screen-to-screen blitting for scrolling. The 3d graphics demo now uses offscreen blitting to enhance (read no flicker) the display. Check it out.

There is also some experimental full-blown region handling code included, which uses X11's y-x banding region algorithms. (This stuff is truly for those with extra time and brains). It is currently not compiled in, but can be included by replacing devclip.c with devclip2.c. In the next release, arbitrary multi-rectangle clipping regions will be available. I also plan on implementing separate clip regions from update regions for windows, with the system computing the update region as a subset of the clip region. Anyway, this sophisticated region handling is required for smart window painting as well as higher end graphics primitives. Eventually, this will also allow separate source and destination clipping for bitblit operations. Only destination clipping is working now.

The next release will have a reorganized directory structure, allowing separate development of Nano-X, widgets, core engine, and Microwindows. I plan on moving the whole thing to a CVS soon. BTW, Microwindows now supports three processor families, according to reports emailed me. We've got i386, 8086, MIPS Vr41xx, and ARM families running ;-)

Following is a summary of the ChangeLog:
Version 0.86 - 28th October 1999 -

  • merged framebuffer, elks and msdos vga 16 color 4 planes drivers
  • wrote vga bitbit routines (a herculean effort)
  • optimized bitblit by traversing window clip region
  • added experimental multi-rectangle dynamically allocated regions
  • wrote scrolling terminal emulator demo for microwindows
  • added WM_FDINPUT msg, WndRegisterFdInput call for terminal emulator
  • changed SCREENINFO struct, removed black/white, added bpp, planes
  • added offscreen (memory DC) drawing to microwindows
  • added BitBlt, CreateCompatibleBitmap, CreateCompatibleDC, DeleteDC
  • retired BOGL library, must use new interface for blitting
  • converted framebuffer, svgalib, elks and msdos screen drivers (we need blit routines for herc and svgalib still)
  • major screen driver interface change, old drivers not compatible

Page maintained by Greg Haerr <>