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 Jun 1998 -

General:

 * TrueType, .FON rasterizer.

 * Incomplete thread/process scheduling support in Win32 code.

 * Very alpha printing code using win16 drivers.
   We should add a WINE internal PostScript driver (all other printers
   can be supported using ghostscript filters).

 * Extremely alpha Win95 interface code.

 * No OLE2 and OLE32 support (including OLE2 interfaces etc.).

 * No MS Video support. [just started, marcus@jet.franken.de]

 * COMDLG32 support not complete yet [bertho@akhphd.au.dk?]

 * COMMCTRL/COMCTL32 support in progress [ekohl@abo.rhein-zeitung.de].

 * 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).
   Windows95 telnet.exe and NT 3.51 telnet.exe exhibit the same behaviour.

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