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 Nov 8 1996 -

General:

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

 * Multicolumn and/or LBS_EXTENDEDSEL style listboxes are still 
   screwed up. [julliard@lrc.epfl.ch]

 * Winsock asynchronous functions do not work.

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

 * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple
   times.
 * ScrollWindowEx() is outdated.
 * HCBT_CLICKSKIPPED/HCBT_KEYSKIPPED hook actions are not implemented.
 * Write sometimes segfaults in StretchDIBits() (when inside BITBLT_GetRow)
   when only lower part of the resulting image is visible.

Where to look in source files:

 * grep for FIXME in the source files.


