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 scheduling 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).

 * COMDLG32 support not complete yet.

 * No COMMCTRL/COMCTL32 support.

 * 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:

 * Text alignment problems in Word and Write (variable pitch fonts).

 * Font mapper weights

 * "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.


