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

General:

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

 * A lot of the extensions to the GDI that were introduced with Win32 are
   not supported at all or only in a very rudimentary way. (World transforms,
   arc direction, GM_ADVANCED to name but a few)

Miscellaneous:

 * 16-bit Eudora 1.5.2 goes into recursion trying to display
   a horizontal scrollbar (SetScrollPos() artifact).

 * mIRC 'commands' menu stays on top and will not refresh.

 * mIRC is unable to show 'Options' dialog.

 * Tab switching in mIRC 'Setup' dialog stops erasing background
   after a random number of repetitions.

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

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

 * Font mapper weights are rather crude.

 * "Cursor XXXX has more than 1 bpp!"

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