Woopsi is a Nintendo DS GUI library for rapidly creating user interfaces for homebrew software. Modelled after the AmigaOS windowing system.

Release notes:

Woopsi 0.99.5 is now out. It is available from the Woopsi website:


The big change this time around is the rendering system. Instead of each gadget needing to redraw itself when its appearance changes, gadgets now push their damaged rectangles to a queue that is redrawn every VBL.

In short – redrawing the screen is faster and the code is simpler.

The FreeType library and associated classes are no longer being distributed as part of Woopsi. Instead, Lakedaemon has put together a distribution of Woopsi that includes ported libraries and extra classes. These provide Woopsi with a wealth of extra functionality. His distribution can be found here:


On top of the FreeType library, Woopsi font classes and an “XmlBox” gadget, it includes DS ports of:

– libjpeg
– libmxml
– libpng
– libsqlite3
– libz

The full changelog is below.

– Removed freetype classes, library and example (Lakedaemon’s distro will provide this functionality).
– Examples build script uses for loop instead of explicitly named folders.
– Gadget::checkCollision(Gadget) works correctly.
– Tests build script uses for loop instead of explicitly named folders.
– Fixed memory leaks in Text::getLineTrimmedLength().
– Rewrote RectCache::splitRectangles() for speed and clarity.
– Increased delays for SDL double click and key repeat times.
– Fixed memory leak in demo.
– Fixed memory leak in PackedFontBase::getStringWidth().
– Fixed memory leak in MultiLineTextBox::moveCursorToPosition().
– ScrollingPanel::scroll() redraws correctly on top screen.
– Renamed Text class to Document.
– Document class contains a WoopsiString instead of inheriting from it.
– Removed DimmedScreen class (not compatible with new rendering system).
– Removed erased flag from Gadget.
– Removed Gadget::erase().
– Removed Gadget::eraseGadget().
– Removed Gadget::redraw().
– Removed Gadget::redrawDirty().
– Removed Gadget::drawChildren().
– Removed Gadget::redrawDirtyChildren().
– ListData destructor does not fire list changed events.
– Removed AmigaWindow::redrawBorder().
– Removed Woopsi::eraseRect().
– Gadget::getChild() no longer returns a const gadget.
– Removed visibleRegionCacheInvalid flag from gadget.
– Removed Gadget::enableDrawing().
– Removed Gadget::disableDrawing().
– Removed drawingEnabled flag from Gadget.
– Gadget::remove() and removeChild() will trigger a redraw of the gadget’s visible regions (ie. erase it) automatically.
– Pong uses a SuperBitmap as its display.
– WoopsiArray doubles in size each time it needs to grow instead of increasing by 100.
– ScrollingPanel::scroll() uses the new rendering system.
– Fixed FileRequester border.
– FileListBox re-raises ListBox value changed events.
– ListBox no longer raises events when deselecting options when double-clicked (correctly raised when selecting the correct option).
– Fixed horizontal position of text in left-aligned text box.
– ScrollingTextBox scrolls line-by-line when scrollbar is dragged instead of smooth-scrolling (easier to read).
– Added virtual destructor to ListBoxBase.
– Moved border size defines from window.h to amigawindow.h and made them consts.
– Changed DYNAMIC_ARRAY_SIZE define in woopsiarray.h to a const.
– Changed GLYPH_MAP_SIZE define in fontbase.h to a const.
– Changed defines in glyphs.h to consts.
– Moved SCREEN_WIDTH and SCREEN_HEIGHT defines into sdl/nds.h.
– Changed defines in defines.h to consts.
– Woopsi::handleKey() expects an s32 instead of a u32 as the heldTime argument.
– PadHeldTime struct stores values as s32 instead of u32.
– Gadget::getCloseType() is const.
– ScrollingTextBox and ScrollingListBox scrollbars move in steps instead of smoothly as their lists are scrolled.
– Rewritten slider logic again.
– ScrollingListBox scrollbar updates correctly as list changes or gadget is resized.
– ScrollingTextBox scrollbar updates correctly if gadget is resized.

New Features:
– Added makefile for demo – can now be built from command line.
– Added Rect::splitIntersection().
– Gadget rendering re-written to use damaged rects.
– Added equality and inequality operator overloads to Rect class.
– WoopsiArray accepts an initial reserved size parameter in its constructor.
– FileRequester includes filename textbox.
– Added FileRequester::getTextBoxFileName().
– Added Range class.