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 1 1996 -

General:

 * Combobox code is very inadequate (no notification messages,
   dropdown listboxes often stay visible, etc... ).

 * Font mapping is too generic. No soft font loading, no rotated 
   text support. [alex@amadeus.pharm.sunysb.edu]

 * No thread support in Win32 code. 

 * Very alpha printing code. [john@division.co.uk]

 * No icon titles.
	- Windows uses a special window class to display icon titles.
	  Handles to these title windows are stored in the icon window
	  properties.

Miscellaneous:

 * Simple OLE actions were working in October release, got
   broken in November (in Winword "Insert Object" now results in 
   segfault right after the call to LoadModule()).
 * Write and other applications have problems with displaying partially
   obscured bitmaps. 
 * Asynchronous Winsock services sometimes produce zombie processes.
 * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple
   times.
 * ScrollWindowEx() is outdated.
 * HCBT_CLICKSKIPPED/HCBT_KEYSKIPPED hook actions are not implemented.

Where to look in source files:

 * grep for FIXME in the source files.


