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:

 * We need to do InsertMenuItem32[AW] and then code most of the other
   inserting function in terms of this.  Without this, we cannot support
   all the new extended menus.  Not hard, but slightly big.

 * TrueType, .FON rasterizer.

 * No thread/process scheduling support in Win32 code. 

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

 * Extremely alpha Win95 interface code.

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

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