Remember when releasing:
- Change configure.ac - AC_INIT(ClanLib, 2.x.y) and CLANLIB_MINOR_VERSION=x CLANLIB_MICRO_VERSION=y
- Change API/Core.h - CL_VERSION_STRING and CL_CURRENT_VERSION
- If changing the MINOR or MAJOR version: Also change each Makefile.am found inside the subdirectories of Sources

- XML
  - With a (xml) buffer with an  in it, the following fails to tokenize correctly:
	CL_IODevice_Memory iodevice_memory(buffer);
	CL_DomDocument doc;
	doc.load(iodevice_memory);
    (used from a NetGameEvent, with a string argument with an )

- Docs
  - Overview: Add Display Target info
  - Porting guide: CL_String::tokenize -> split
  - Database: write about command.get_output_last_insert_rowid.
  - Update the ReferenceDocs utility. You cannot distinguish between static member public functions and normal public functions

- Strings and Core
  - Should be possible to use strings without initializing clanCore first.

- Why does TextureGroup have add_texture and other CL_Texture functions? Makes the class responsibility unclear..

- GUI Editor
  - Finish property editor

- Change windows to default use unicode:
  - Modify configure app to include by unicode default
  - Change all tests/examples to use unicode 
    Why? Just set the "Character Set" to "Use Multi-Byte Character Set" for UTF8
    Maybe the Unicode configuration should be renamed UTF16 ?

- CL_Directory::get_resourcedata() needs fixing on linux. (See API docs)

- Examples: 
  We need an example that shows how to load a shader from a CL_String, instead of a file
  A benchmark application, showing fps of drawing triangles / images / sprites using various display targets

- GraphicContext::set_primitives_array() uses CL_PrimitivesArrayData
  Internally we use some standard settings as follows:
 	0: POSITION
	1: COLOR
	2: TEXTURE
	3: SPRITE TEXINDEX
        4: NORMAL (GL1 target only)
  Should be values be enum'ed somehow ?

- Friends
   Check all friends are friends for the correct reason.
   For example, if we do:
      CL_Service create_service( CL_Service service("service_name"); return service; )
    This would crash, as CL_Service_Impl makes a local pointer copy of CL_Service, that may change.

- GL1 Texture (NPOT)
   CL_GL1TextureProvider::set_subimage() copies the image edges into the unused part of the texture, so linear filtering works correctly
   However: This needs corrected. It should be optimised and currently it does not write to the lower right quadrant
   Also other GL1 set image functions should contain this fix.

- ClanLib Linux Issues
  GUI Popup menus: CL_GUIWindowManagerProvider_System::create_window() and destroy_window() has a #ifdef WIN32 to removed cached windows - because it did not work

X11 / Linux:
 - Implement icons - http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html#id2507733
 - "ideally you'd also support _NET_WM_PING, WM_CLIENT_MACHINE and _NET_WM_PID that way a linux user can kill our app like in Windows if it goes unresponsive"

Disposable objects:
- The gui cache should add itself to the disposable list, instead of using that signal thing it uses now

- Texture Packer:
  - Finish CSS packer

- GDI
  - gc.clear() does not work when the clip rect is set. Should be modified to call: "CL_Draw::fill(gc, clip_rect, ...);" if clip rect is set
  - The output from Tests/Display/2D is different for OpenGL and GDI
  - The output from Tests/Display/Image1 is different for OpenGL and GDI

  - You cannot set the projection matrix in the GDI target
    CL_GDIGraphicContextProvider::set_projection(const CL_Mat4f &matrix)
    is empty
    Add pixel_canvas->set_projection(matrix);

- GUI Component issues:
  - Important:
    - ProgressBar!

  - Less important:
    - Minor: Scrollbar buttons should use separate glyph part
    - Minor: Window close/min/max/etc buttons should use separate glyph part
    - scrollbar trackarea and buttonarea overlap with 1 pixel
    - checkbox draw something wrong? (compare with vista screenshot, especially disabled)
    - slider - thumb size for horizontal is too small (compare to vertical)
    - slider - support focused
    - lineedit - use readonly and focused gfx
    - lineedit - set states on parts (hot doesn't show)
    - checkbox support excluded and implicit
    - lineedit - selecting with mouse when there is only one char is difficult
    - spin - disabled state is not shown visually
    - groupbox - no clickthrough
    - Window - texture wm - clicking on window client area does not bring it to front
    - Tab - redo parts so we won't have to use header_border, and resizing of active tagpage part
    - Frame vs GroupBox - whats the difference - do we need both?
    - Popupmenu separator part is too short
    - ToolBar: You cannot switch between horizontal and Vertical Toolbar
    - ToolBar: It uses CL_Sprite, not CL_Image
    - ToolBar: It would be nice to be able to attach a component to the toolbar, like CL_StatusBar
    - Combobox: Line edit doesn't use hot state visually

- GUI Render
  Issue: If a component alters the state during rendering (for example calls gc.set_texture(index, texture) ),
   currently there is no way to restore the previous texture
   Maybe, we could have: texture = gc.get_texture(index) - And texture.is_null() if it was not set.
   etc.

- Add thread safety to CL_Logger:
  The three places the vector is accessed needs to be mutex locked 
  (add a static CL_Mutex to the class, CL_MutexSection the three places its used)
- Logger: If you do "CL_ConsoleLogger logger; logger.enable();" it will have two instances
  of logging!

- Modifying existing display window
  Is this function required: void CL_Win32Window::modify_window(const CL_DisplayWindowDescription &desc) 
  Adds extra complexity, to modify a window that has already been created. Should we force the user, to call set_size() etc manually. 
  This function is not supported in linux.

- D3D9
	1) Create a hidden window and create a Direct3DDevice9 for it
	2) Create all textures on this device
	3) For each CL_DisplayWindow, it creates an additional swap chain 
	4) The CL_GraphicContext for each window shares the same Direct3DDevice, and thus shares states (oh no, now we are f**ked)
	5) When you call flip() or update() on the display window, it calls Present on the swap chain
	6) When you resize the window, it destroys the swap chain and creates a new one
	7) If we had fullscreen support, it would destroy the swap chain and create a fullscreen one
	8) If the fullscreen window loses focus, we have to manually destroy the fullscreen swap chain and hide 


NICE TO HAVE
- Tool in TexturePacker that loads an image, displays the collision outline, lets you change the detail level, and save .col file.
