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 March 10 1997 -

General:

 * Font mapping is too generic. No soft font loading, no rotated 
   text support, incorrect metrics. [alex@amadeus.pharm.sunysb.edu]

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

Miscellaneous:

 * "Cursor XXXX has more than 1 bpp!"

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

 * Word 6.0 often segfaults when system menu is double-clicked. 

 * Edit controls are prone to show blank space when, in fact, there is a
   text there.

 * SGI window manager treats Wine windows as topmost.

 * Write shows blank space instead of Paintbrush OLE1 object.

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

Where to look in source files:

 * grep for FIXME in the source files.


