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/files/drive.c b/files/drive.c
index fb15297..f85c149 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -557,7 +557,7 @@
     {
     case TYPE_FLOPPY:  return DRIVE_REMOVABLE;
     case TYPE_HD:      return DRIVE_FIXED;
-    case TYPE_CDROM:   return DRIVE_REMOVABLE;
+    case TYPE_CDROM:   return DRIVE_CDROM;
     case TYPE_NETWORK: return DRIVE_REMOTE;
     case TYPE_INVALID:
     default:           return DRIVE_CANNOTDETERMINE;
diff --git a/files/file.c b/files/file.c
index 7d30397..2ea02e3 100644
--- a/files/file.c
+++ b/files/file.c
@@ -802,6 +802,121 @@
     return HFILE_ERROR;
 }
 
+/***********************************************************************
+ *           SearchPath32A   (KERNEL32.447)
+ * Code borrowed from OpenFile above.
+ */
+DWORD SearchPath32A(
+	LPCSTR path,LPCSTR fn,LPCSTR ext,DWORD buflen,LPSTR buf,LPSTR *lastpart
+) {
+    LPCSTR	unixName;
+    INT32	len;
+    char	testpath[1000]; /* should be enough for now */
+    char	*name,*p;
+    int		i;
+
+    if (ext==NULL)
+    	ext = "";
+    name=(char*)xmalloc(strlen(fn)+strlen(ext)+1);
+    strcpy(name,fn);
+    strcat(name,ext);
+
+    dprintf_file(stddeb,"SearchPath32A(%s,%s,%s,%ld,%p,%p)\n",
+    	path,fn,ext,buflen,buf,lastpart
+    );
+    if (path) {
+	strcpy(testpath,path);
+	strcat(testpath,"\\");
+	strcat(testpath,name);
+	if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL) {
+	    goto found;
+	} else
+	    return 0;
+    }
+    if ((len=sizeof(testpath)-strlen(name)-1)<0)
+    	return 0;
+
+    /* Try the path of the current executable */
+    if (GetCurrentTask()) {
+	GetModuleFileName(GetCurrentTask(),testpath,len);
+	if ((p=strrchr(testpath,'\\'))) {
+            strcpy(p+1,name);
+            if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE)))
+                goto found;
+        }
+    }
+
+    /* Try the current directory */
+    lstrcpyn32A(testpath,name,sizeof(testpath) );
+    if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
+        goto found;
+
+    /* Try the Windows directory */
+    GetWindowsDirectory(testpath,len);
+    strcat(testpath,"\\");
+    strcat(testpath,name);
+    if ((unixName = DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
+        goto found;
+
+    /* Try the Windows system directory */
+    GetSystemDirectory32A(testpath,len);
+    strcat(testpath,"\\");
+    strcat(testpath,name);
+    if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
+        goto found;
+
+    /* Try all directories in path */
+
+    for (i=0;;i++)
+    {
+        if (!DIR_GetDosPath(i,testpath,len)) 
+		return 0;
+        strcat(testpath,"\\");
+        strcat(testpath,name);
+        if ((unixName=DOSFS_GetUnixFileName((LPCSTR)testpath,TRUE))!=NULL)
+            break;
+    }
+
+found:
+    strncpy(buf,testpath,buflen);
+    if (NULL!=(p=strrchr(testpath,'\\')))
+    	p=p+1;
+    else
+        p=testpath;
+    if (p-testpath<buflen)
+	*lastpart=(p-testpath)+buf;
+    else
+    	*lastpart=NULL;
+    dprintf_file(stddeb,"	-> found %s,last part is %s\n",testpath,p);
+    return strlen(testpath);
+}
+
+/***********************************************************************
+ *           SearchPath32W   (KERNEL32.448)
+ */
+DWORD SearchPath32W(
+	LPCWSTR path,LPCWSTR fn,LPCWSTR ext,DWORD buflen,LPWSTR buf,
+	LPWSTR *lastpart
+) {
+	LPSTR	pathA = path?STRING32_DupUniToAnsi(path):NULL;
+	LPSTR	fnA = STRING32_DupUniToAnsi(fn);
+	LPSTR	extA = ext?STRING32_DupUniToAnsi(fn):NULL;
+	LPSTR	lastpartA;
+	LPSTR	bufA = (char*)xmalloc(buflen+1);
+	DWORD	ret;
+
+	ret=SearchPath32A(pathA,fnA,extA,buflen,bufA,&lastpartA);
+	lstrcpynAtoW(buf,bufA,buflen);
+	if (lastpartA)
+		*lastpart = buf+(lastpartA-bufA);
+	else
+		*lastpart = NULL;
+	free(bufA);
+	free(fnA);
+	if (pathA) free(pathA);
+	if (extA) free(extA);
+	return ret;
+}
 
 /***********************************************************************
  *           _lclose   (KERNEL.81) (KERNEL32.592)