Ftwl

FTWL has been completely removed starting from freeciv 2.4, and it had been non-functional for many releases before that.
=Freeciv Theme and Widget Layer=
Freeciv Theme and Widget Layer (FTWL) is a low-level library for 
manipulating the graphics and input systems on your computer,
and displaying screens with widgets based on themes loaded from 
configuration files.
A few naming conventions:
: be_* backend functions
: te_* theme engine functions
: sw_* widget related functions
: osda off-screen drawing area buffer
Programming in FTWL is quite simple. Here is an annotated example:
----
 #include <config.h>
: Always remember this one, folks, otherwise you end up with bugs that are horribly difficult to figure out. I speak from experience...
 #include <assert.h>
 #include <stdio.h>
 
 #include "shared.h"
 #include "support.h"
: These are utility files.
 #include "back_end.h"
 #include "widget.h"
: These two contain the public API of FTWL.
 struct sw_widget *root;
: A variable to point to the root window.
 void nullfunc(int socket); /* prototype */
 
 static bool my_key_handler(struct sw_widget *widget,
 const struct be_key *key, void *data)
 {
 assert(ct_key_is_valid(key));
 if (key->type == BE_KEY_NORMAL && key->key == 'q') {
 exit(0);
 return TRUE;
 }
 return FALSE;
 }
: The above function is a callback that handles all keypresses that are received on the root window. We use this to add a convenient way to exit our example application.
 void nullfunc(int socket)
 {
 return;
 }
: The main loop expects a function pointer that can give it input from outside devices, eg the network. We just use an empty function here.
 int main(int argc, char **argv)
 {
 struct ct_size res;
 struct ct_size size;
 
 res.width = 640;
 res.height = 480;
 sw_init();
 be_init(&res, FALSE);
: Now we have set up the main window at 640x480.
 /* Error checking */
 be_screen_get_size(&size);
 if (size.width != res.width || size.height != res.height) {
 die("Instead of the desired screen resolution (%dx%d) "
 "got (%dx%d). This may be a problem with the window-manager.",
 res.width, res.height, size.width, size.height);
 }
: Error checking is always nice.
 root = sw_create_root_window();
: Set up the root window.
 sw_window_set_key_notify(root, my_key_handler, NULL);
: Register our key handler from above. You need to register key handlers for any widget that is supposed to receive key presses.
 sw_mainloop(nullfunc);
: Start the main loop. Unlike more primitive libraries, FTWL has a built-in main loop, and your program must be callback-driven.
 return 0;
 }
: That's it.
----
TODO:
* Add more documentation!
* Support UNICODE
* Support more depth on the existing backend
* Create a backend with palette mode (no transparency, no AA)
* OpenGL, Quartz and DirectX backends