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 Sept 1997 -

General:

 * Catch/Throw() do not save SI and DI registers (quite fatal).

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

 * nBytesWidth in CURSORICONINFO is bogus for some bpp
   (doesn't reflect the fact that bits are packed and 16-bit aligned).

 * Progman and AOL complain about being unable to convert bitmaps
   (probably because of bytes width stuff).

 * Netscape displays partially downloaded inline graphics with
   wrong offsets. Bitmap is missing in the splash-window.

 * BCW 4.5 crashes after SwitchStackBack().

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