This is intended to be a place where you should look first if
you want to contribute to Wine development. Add your e-mail
address to the corresponding entry if you are working on/have 
done something for one of the problems. You are encouraged to 
add new entries and, more importantly, remove those for the 
bugs you fixed ;-)
------------------------------------------------------------
As of June 1997 -

General:

 * TrueType, .FON rasterizer.

 * No thread/process/kernel-object support in Win32 code. 

 * Very alpha printing code. [john@division.co.uk]

 * No OLE2 and OLE32 support (including OLE2 interfaces etc.).

 * No MS Video support (perhaps interface with xanim, don't hold
   your breath for this one).

 * No COMDLG32 support. (Needed badly, the Windows95 comdlg32.dll
   doesn't work with WINE.)

 * No COMMCTRL/COMCTL32 support.

 * No icon titles.
	- Windows uses a special window class to display icon titles.
	  Handles to these title windows are stored in the icon window
	  properties.

 * No manual pages describing the various Windows calls.
	- You can find information about most of the Win32 API calls
          on the www.microsoft.com (go to 'search').

Miscellaneous:

 * New font mapping scheme can be improved.

 * "Cursor XXXX has more than 1 bpp!"

 * 32-bit Freecell segfaults when started from the Progman (looks like
   a problem with cards.dll).

 * Margins in edit controls are too wide.

 * SGI window manager treats Wine windows as topmost.

 * Write shows blank space instead of Paintbrush OLE1 object ( GetDIBits()? ).

 * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple
   times.

Where to look in source files:

 * grep for FIXME in the source files.


