***** this file is horribly outdated - please update ! *****

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.

 * internal PostScript driver not finished. [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 has been 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 and icewm put 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.
