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.

 * Threading for non Linux systems completely missing. (might use
   LWPs in Solaris, FreeBSD? NetBSD? SCO?)

 * Very alpha printing code using win16 drivers.

 * Very alpha internal PostScript driver. [h.davies1@physics.ox.ac.uk]

 * Extremely alpha Win95 interface code.		
 * No OLE2 and OLE32 support (including OLE2 interfaces etc.).
	 (started work on pidl-handling, IShellFolders IEnumIdLists 
	 and SH* functions juergen.schmied@metronet.de)	

 * 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.
 
 * Some programs expect that menu window handles stay the same all the time.
   (chemdraw). This implies that the menu popupwindows are just hidden, not
   destroyed in real Windows.

Where to look in source files:

 * grep for FIXME in the source files.
