Release 960728

Sun Jul 28 17:57:19 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [loader/task.c] [include/task.h]
	Implemented SwitchStackTo()/SwitchStackBack().

	* [include/wintypes.h] [loader/main.c]
	Added __winelib variable to distinguish between emulator and
 	library at run-time. Later on, this should avoid some
 	recompilations when building Winelib.

	* [windows/property.c]
	Implemented Win32 functions for window properties.

Fri Jul 26 18:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>

	* [controls/listbox.c]
	Implemented LBS_SORT style, WM_COMPAREITEM, and WM_DELETEITEM
	messages.

	* [controls/menu.c]
	Call TranslateMessage() to enable shortcuts (on WM_CHAR).

	* [include/cursoricon.h]
	Moved #pragma pack(1) back to where it belongs.

	* [objects/palette.c]
	RealizeDefaultPalette() maps to system colors only.
	Do not broadcast palette notifications when in TrueColor.

	* [objects/color.c] [include/palette.h]
	Miscellaneous optimizations. Had to fix several
	"improvements" made to my patch for previous release.

	* [objects/dib.c]
	Reverse dib bits order for 24-bit SetDIBits().

	* [objects/dc.c]
	GetDeviceCaps() does not return RC_PALETTE when in TrueColor.

	* [windows/scroll.c]
	Scroll update region too.

	* [windows/message.c]
	Include QS_MOUSE into the event mask for nonclient mouse
	message filter. Fixes problems with Word 6 freezing when
	mouse hits nonclient area.

	* [windows/win.c] 
	Allow top-level windows to be linked as HWND_TOP in CreateWindow().

	* [windows/winpos.c] [windows/mdi.c]
	Attempt to fix control menu duplication.

Fri Jul 26 09:49:35 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [files/drive.c]
	GetDriveType32A(): return value for CDROM fixed.

	* [files/file.c]
	SearchPath* added.

	* [if1632/gdi32.spec] [objects/brush.c]
	SetBrushOrgEx() added.

	* [loader/pe_resource.c]
	If even loading the default entry fails, we just use the first
	entry from the resource directory.

	[loader/task.c]
	SetSigHandler() stub added, Paradox 4.5 now starts up.

	* [misc/comm.c] [include/windows.h] [if1632/kernel32.spec]
	COMM functions updated to win32, not complete.

	* [misc/lstr.c]
	FormatMessageA partially implemented.

	* [include/miscemu.h] [memory/selector.c]
	  [memory/global.c] [miscemu/dosmem.c]
	DOS memory handling changed: 1MB preallocated block, real-mode
	segment handling possible, SetSelectorBase into lower physical 1MB
	possible.

	* [miscemu/dpmi.c]
	Real-mode segments changed, real-mode int 21,ax=6506 added.
	AX=0x0303 added.

	* [multimedia/time.c]
	Fixed bug in killTimer.

	* [objects/bitmap.c]
	LoadImageA partially implemented.

Wed Jul 24 18:20:24 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [include/dde_mem.h][include/dde_proc.h]
	  [ipc/dde_atom.c][ipc/dde_proc.c][windows/message.c]
	  [ipc/generic_hash.h][library/miscstubs.c]
	Changes for error free compilation using "--with-ipc":
	replaced some names with *16-equivalent (e.g. MSG to MSG16),
	modified prototype of function DDE_GlobalFree() .

	* [objects/palette.c]
	Added check for metafile-DC in GDISelectPalette(),
	GDIRealizePalette(),RealizeDefaultPalette() and
	IsDCCurrentPalette().

Tue Jul 23 22:46:53 1996  Andrew Lewycky <plewycky@oise.utoronto.ca>

	* [controls/edit.c]
	EDIT_WM_Create: Don't EDIT_EM_ReplaceSel if created with lParam = "",
	fixes Winhelp.

	* [windows/dialog.c]
	DIALOG_CreateIndirect: Initialise dlgProc before creating children.
diff --git a/windows/scroll.c b/windows/scroll.c
index d25450d..d00330b 100644
--- a/windows/scroll.c
+++ b/windows/scroll.c
@@ -33,9 +33,8 @@
  * dcx can have DCX_WINDOW, DCX_CLIPCHILDREN, DCX_CLIPSIBLINGS set
  */
 
-HRGN	SCROLL_TraceChildren( HWND hScroll, short dx, short dy, WORD dcx)
+HRGN	SCROLL_TraceChildren( WND* wndScroll, short dx, short dy, WORD dcx)
 {
- WND	       *wndScroll = WIN_FindWndPtr( hScroll ); 
  HRGN		hRgnWnd;
  HRGN		hUpdateRgn,hCombineRgn;
 
@@ -45,13 +44,13 @@
 	 hRgnWnd   = CreateRectRgnIndirect16(&wndScroll->rectWindow);
  else
 	{
-	 RECT32 rect;
+	 RECT32 rect = { 0, 0, wndScroll->rectClient.right - wndScroll->rectClient.left,
+			       wndScroll->rectClient.bottom - wndScroll->rectClient.top };
 
-	 GetClientRect32(hScroll,&rect);
  	 hRgnWnd   = CreateRectRgnIndirect32(&rect);
 	}
 
- hUpdateRgn  = DCE_GetVisRgn( hScroll, dcx );
+ hUpdateRgn  = DCE_GetVisRgn( wndScroll->hwndSelf, dcx );
  hCombineRgn = CreateRectRgn(0,0,0,0);
 
  if( !hUpdateRgn || !hCombineRgn )
@@ -74,21 +73,21 @@
 /* ----------------------------------------------------------------------
  *	       SCROLL_ScrollChildren
  */
-BOOL	SCROLL_ScrollChildren( HWND hScroll, short dx, short dy)
+BOOL	SCROLL_ScrollChildren( WND* wndScroll, short dx, short dy)
 {
- WND           *wndPtr = WIN_FindWndPtr(hScroll);
+ WND           *wndPtr = NULL;
  HRGN		hUpdateRgn;
  BOOL		b = 0;
 
- if( !wndPtr || ( !dx && !dy )) return 0;
+ if( !wndScroll || ( !dx && !dy )) return 0;
 
- dprintf_scroll(stddeb,"SCROLL_ScrollChildren: hwnd %04x dx=%i dy=%i\n",hScroll,dx,dy);
+ dprintf_scroll(stddeb,"SCROLL_ScrollChildren: hwnd %04x dx=%i dy=%i\n",wndScroll->hwndSelf,dx,dy);
 
  /* get a region in client rect invalidated by siblings and ansectors */
- hUpdateRgn = SCROLL_TraceChildren(hScroll, dx , dy, DCX_CLIPSIBLINGS);
+ hUpdateRgn = SCROLL_TraceChildren(wndScroll, dx , dy, DCX_CLIPSIBLINGS);
 
    /* update children coordinates */
-   for (wndPtr = wndPtr->child; wndPtr; wndPtr = wndPtr->next)
+   for (wndPtr = wndScroll->child; wndPtr; wndPtr = wndPtr->next)
    {
 	/* we can check if window intersects with clipRect parameter
 	 * and do not move it if not - just a thought.     - AK
@@ -100,8 +99,8 @@
   } 
 
  /* invalidate uncovered region and paint frames */
- b = RedrawWindow32( hScroll, NULL, hUpdateRgn, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE |
-				              RDW_ERASENOW | RDW_ALLCHILDREN ); 
+ b = RedrawWindow32( wndScroll->hwndSelf, NULL, hUpdateRgn, 
+		     RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ERASENOW | RDW_ALLCHILDREN ); 
 
  DeleteObject( hUpdateRgn);
  return b;
@@ -114,10 +113,11 @@
  */
 void ScrollWindow(HWND hwnd, short dx, short dy, LPRECT16 rect, LPRECT16 clipRect)
 {
-    HDC  hdc;
-    HRGN hrgnUpdate,hrgnClip;
-    RECT16 rc, cliprc;
-    HWND hCaretWnd = CARET_GetHwnd();
+    HDC  	hdc;
+    HRGN 	hrgnUpdate,hrgnClip;
+    RECT16 	rc, cliprc;
+    HWND 	hCaretWnd = CARET_GetHwnd();
+    WND*	wndScroll = WIN_FindWndPtr( hwnd );
 
     dprintf_scroll(stddeb,"ScrollWindow: dx=%d, dy=%d, lpRect =%08lx clipRect=%i,%i,%i,%i\n", 
 	    dx, dy, (LONG)rect, (int)((clipRect)?clipRect->left:0),
@@ -158,6 +158,11 @@
     else
 	CopyRect16(&cliprc, clipRect);
 
+    /* move window update region (if any) */
+
+    if( wndScroll->hrgnUpdate > 1 )
+	OffsetRgn( wndScroll->hrgnUpdate, dx, dy );
+
     hrgnUpdate = CreateRectRgn(0, 0, 0, 0);
     ScrollDC(hdc, dx, dy, &rc, &cliprc, hrgnUpdate, NULL);
     ReleaseDC(hwnd, hdc);
@@ -165,13 +170,14 @@
     if( !rect )
       {
          /* FIXME: this doesn't take into account hrgnUpdate */
-         if( !SCROLL_ScrollChildren(hwnd,dx,dy) )
+
+         if( !SCROLL_ScrollChildren( wndScroll, dx,dy) )
 	     InvalidateRgn(hwnd, hrgnUpdate, TRUE);
       }
     else
       {
-        HRGN hrgnInv = SCROLL_TraceChildren(hwnd,dx,dy,DCX_CLIPCHILDREN |
-						       DCX_CLIPSIBLINGS );
+        HRGN hrgnInv = SCROLL_TraceChildren( wndScroll ,dx,dy,DCX_CLIPCHILDREN |
+						              DCX_CLIPSIBLINGS );
         if( hrgnInv )
         {
 	    CombineRgn(hrgnUpdate,hrgnInv,hrgnUpdate,RGN_OR);