For information on how to post a useful bug report, please
read documentation/bugreports.

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 some operating systems still missing. (NetBSD? SCO? OS/2?)

 * Very alpha printing code using win16 drivers.

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

 * Extremely alpha Win95 interface code (some apps, like Opera, choke on it).

 * No OLE2 and OLE32 support (including OLE2 interfaces etc.).
	 (started work on pidl-handling, IShellFolders IEnumIdLists 
	 and SH* functions juergen.schmied@metronet.de)	
	(Corel is working on it)

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

 * Windows95 telnet.exe and NT 3.51 telnet.exe, and Borland Delphi
   is known to go into recursion with infinite resizing, possibly
   due to scroll bars.

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

 * GDI memory leaks apparent in Free Agent 16-bit.

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

 * KDE window manager puts popup windows like menus below the main window.

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