Release 970824

Sat Aug 23 00:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [if1632/kernel.spec] [if1632/mmsystem.spec]
	Added some stubs.

	* [include/neexe.h] [loader/module.c]
	Added warning for OS/2 executables.

	* [multimedia/midi.c]
	Shortened MIDIOUT driver version string to be less than 31 chars.

	* [objects/gdiobj.c]
	Fixed DeleteObject32() to react properly when called with stock object.

Fri Aug 22 18:03:26 1997  Dimitrie O. Paun <dimi@cs.toronto.edu>

	* [controls/updown.c] [include/updown.h]
	First attempt at implementiong the UpDown class.

	* [controls/widgets.c]
	Added the UpDown class to be initialized by InitCommonControls().

Wed Aug 20 18:01:33 1997  Doug Ridgway <ridgway@routh.UCSD.EDU>

	* [graphics/*] [objects/*] [include/gdi.h]
	Made all GDI objects (except DCs) moveable.

Mon Aug 18 03:25:30 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/event.c] [misc/winsock.c] [misc/winsock_dns.c]
	Removed IPC communication to speed up winsock services
	(tested only with 16-bit netscape 3.03).

	* [graphics/x11drv/xfont.c] [documentation/fonts]
	Miscellaneous improvements. Updated docs.

Sun Aug 17 20:39:55 1997  Ingo Schneider <schneidi@informatik.tu-muenchen.de>

	* [misc/comm.c]
	A couple of bug fixes.

Sun Aug 17 19:29:22 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [debugger/dbg.y]
	Display next instruction after stepi/nexti.

	* [if1632/relay.c] [include/callback.h] [tools/build.c]
	Replaced CallTo32_LargeStack with the CALL_LARGE_STACK macro for
	better Winelib support.

	* [include/sigcontext.h]
	Renamed to sig_context.h to avoid conflicts with libc.

	* [*/*]
	All API functions are now prefixed with WINAPI in prevision of
	future Winelib integration.

	* [loader/signal.c] [memory/ldt.c]
	Fixed assembly code to be -fPIC compatible.

Thu Aug 14 14:38:15 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [if1632/crtdll.spec][win32/except.c]
	_global_unwind, _local_unwind stub added.

	* [objects/dib.c]	
	Don't read memory you don't even need for the target bitmap (fixes
	one 'lazy' program).

	* [if1632/relay.c][if1632/thunk.c][if1632/kernel32.spec]
	  [win32/ordinals.c][memory/selector.c][memory/global.c]
	  [include/callback.h]
	Added/moved some more win95 ordinal stuff. Implemented QT_Thunk
	(not 100% correct yet) and some friends.

	* [loader/pe_image.c]
	Add possibility to break at the DLL entrypoint.

	* [controls/static.c][misc/commdlg.c][scheduler/thread.c]
	Misc bugfixes and additions.

	* [misc/registry.c]
	The registry seems to be case-preserving but case-insensitive.

	* [memory/global.c]	
	Adapted to new /proc/meminfo format.

	* [objects/font.c][graphics/x11drv/xfont.c]
	FONT_SelectObject and GetTextMetrics* get passed ranges in logical
 	and not device points (thanks to Marion Reyzl for pointing this
 	out).

	* [windows/caret.c]
	Use the windows own DC if present (The caret coordinates are
	logical coordinates based on it). Fixes another AMIPRO problem.

Wed Aug  6 18:22:22 1997  Morten Welinder  <terra@diku.dk>

	* [controls/menu.c]
	General clean-up and Win32 work: split item_flags into fType and
	fState; split item_id into wID and hSubMenu.  Improved
	debug-printing.  Implemented InsertMenuItem32[AW],
	SetMenuDefaultItem32, and SetMenuItemInfo32[AW].  Fixed
	GetMenuItemInfo32[AW].

	* [if1632/user32.spec]
	Define above new functions.

	* [include/windows.h]
	Define MF_DEFAULT and MF_RIGHTJUSTIFY.  Prototype above functions.

	* [include/menu.h]
	Don't prototype now-static MENU_InitSysMenuPopup.

	* [include/comm.h]
	Reduce MAX_PORTS to 9 (which the profile code can handle).

Tue Aug  5 20:16:22 1997  Victor Schneider <vischne@ibm.net>

	* [library/winestub.c] [libtest/expand.c]
	These patches let people porting Windows apps compile them using
	the same conventions regarding global _argc and _argv as those on
	Windows C/C++ compilers.
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 3d59435..6c80245 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -231,11 +231,13 @@
     {
 	/* Create default palette */
 
+      /* DR well *this* palette can't be moveable (?) */
+
 	HPALETTE16 hpalette = PALETTE_Init();
 
 	if( hpalette )
 	{
-	    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LIN_ADDR( hpalette );
+	    StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)GDI_HEAP_LOCK( hpalette );
 	    return TRUE;
 	}
     }
@@ -250,12 +252,17 @@
 {
     static DWORD count = 0;
     GDIOBJHDR * obj;
-    HGDIOBJ16 handle = GDI_HEAP_ALLOC( size );
+    HGDIOBJ16 handle;
+    if ( magic == DC_MAGIC || magic == METAFILE_DC_MAGIC )
+      handle = GDI_HEAP_ALLOC( size );
+    else 
+      handle = GDI_HEAP_ALLOC_MOVEABLE( size );
     if (!handle) return 0;
-    obj = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    obj = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     obj->hNext   = 0;
     obj->wMagic  = magic;
     obj->dwCount = ++count;
+    GDI_HEAP_UNLOCK( handle );
     return handle;
 }
 
@@ -271,10 +278,10 @@
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
         return TRUE;
     
-    object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!object) return FALSE;
     object->wMagic = 0;  /* Mark it as invalid */
-
+ 
       /* Free object */
     
     GDI_HEAP_FREE( handle );
@@ -286,6 +293,8 @@
  *
  * Return a pointer to the GDI object associated to the handle.
  * Return NULL if the object has the wrong magic number.
+ * Movable GDI objects are locked in memory: it is up to the caller to unlock
+ * it after the caller is done with the pointer.
  */
 GDIOBJHDR * GDI_GetObjPtr( HGDIOBJ16 handle, WORD magic )
 {
@@ -294,9 +303,13 @@
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else 
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return NULL;
-    if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic)) return NULL;
+    if ((magic != MAGIC_DONTCARE) && (ptr->wMagic != magic)) 
+    {
+      GDI_HEAP_UNLOCK( handle );
+      return NULL;
+    }
     return ptr;
 }
 
@@ -304,7 +317,7 @@
 /***********************************************************************
  *           DeleteObject16    (GDI.69)
  */
-BOOL16 DeleteObject16( HGDIOBJ16 obj )
+BOOL16 WINAPI DeleteObject16( HGDIOBJ16 obj )
 {
     return DeleteObject32( obj );
 }
@@ -313,12 +326,15 @@
 /***********************************************************************
  *           DeleteObject32    (GDI32.70)
  */
-BOOL32 DeleteObject32( HGDIOBJ32 obj )
+BOOL32 WINAPI DeleteObject32( HGDIOBJ32 obj )
 {
       /* Check if object is valid */
 
-    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
-    if (!header || HIWORD(obj)) return FALSE;
+    GDIOBJHDR * header;
+    if (HIWORD(obj)) return FALSE;
+    if ((obj >= FIRST_STOCK_HANDLE) && (obj <= LAST_STOCK_HANDLE))
+        return TRUE;
+    if (!(header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj ))) return FALSE;
 
     dprintf_gdi(stddeb, "DeleteObject: %04x\n", obj );
 
@@ -340,7 +356,7 @@
 /***********************************************************************
  *           GetStockObject16    (GDI.87)
  */
-HGDIOBJ16 GetStockObject16( INT16 obj )
+HGDIOBJ16 WINAPI GetStockObject16( INT16 obj )
 {
     return (HGDIOBJ16)GetStockObject32( obj );
 }
@@ -349,7 +365,7 @@
 /***********************************************************************
  *           GetStockObject32    (GDI32.220)
  */
-HGDIOBJ32 GetStockObject32( INT32 obj )
+HGDIOBJ32 WINAPI GetStockObject32( INT32 obj )
 {
     if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0;
     if (!StockObjects[obj]) return 0;
@@ -362,73 +378,86 @@
 /***********************************************************************
  *           GetObject16    (GDI.82)
  */
-INT16 GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
+INT16 WINAPI GetObject16( HANDLE16 handle, INT16 count, LPVOID buffer )
 {
     GDIOBJHDR * ptr = NULL;
+    INT16 result = 0;
     dprintf_gdi(stddeb, "GetObject16: %04x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return 0;
     
     switch(ptr->wMagic)
-    {
+      {
       case PEN_MAGIC:
-	  return PEN_GetObject16( (PENOBJ *)ptr, count, buffer );
+	result = PEN_GetObject16( (PENOBJ *)ptr, count, buffer );
+	break;
       case BRUSH_MAGIC: 
-	  return BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer );
+	result = BRUSH_GetObject16( (BRUSHOBJ *)ptr, count, buffer );
+	break;
       case BITMAP_MAGIC: 
-	  return BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
+	result = BITMAP_GetObject16( (BITMAPOBJ *)ptr, count, buffer );
+	break;
       case FONT_MAGIC:
-	  return FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
+	result = FONT_GetObject16( (FONTOBJ *)ptr, count, buffer );
+	break;
       case PALETTE_MAGIC:
-	  return PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
-    }
-    return 0;
+	result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
+	break;
+      }
+    GDI_HEAP_UNLOCK( handle );
+    return result;
 }
 
 
 /***********************************************************************
  *           GetObject32A    (GDI32.204)
  */
-INT32 GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
+INT32 WINAPI GetObject32A( HANDLE32 handle, INT32 count, LPVOID buffer )
 {
     GDIOBJHDR * ptr = NULL;
+    INT32 result = 0;
     dprintf_gdi(stddeb, "GetObject32A: %08x %d %p\n", handle, count, buffer );
     if (!count) return 0;
 
     if ((handle >= FIRST_STOCK_HANDLE) && (handle <= LAST_STOCK_HANDLE))
       ptr = StockObjects[handle - FIRST_STOCK_HANDLE];
     else
-      ptr = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+      ptr = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (!ptr) return 0;
     
     switch(ptr->wMagic)
     {
       case PEN_MAGIC:
-	  return PEN_GetObject32( (PENOBJ *)ptr, count, buffer );
+	  result = PEN_GetObject32( (PENOBJ *)ptr, count, buffer );
+	  break;
       case BRUSH_MAGIC: 
-	  return BRUSH_GetObject32( (BRUSHOBJ *)ptr, count, buffer );
+	  result = BRUSH_GetObject32( (BRUSHOBJ *)ptr, count, buffer );
+	  break;
       case BITMAP_MAGIC: 
-	  return BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
+	  result = BITMAP_GetObject32( (BITMAPOBJ *)ptr, count, buffer );
+	  break;
       case FONT_MAGIC:
-	  return FONT_GetObject32A( (FONTOBJ *)ptr, count, buffer );
+	  result = FONT_GetObject32A( (FONTOBJ *)ptr, count, buffer );
+	  break;
       case PALETTE_MAGIC:
           fprintf( stderr, "GetObject32: magic %04x not implemented\n",
                    ptr->wMagic );
           break;
     }
-    return 0;
+    GDI_HEAP_UNLOCK( handle );
+    return result;
 }
 
 
 /***********************************************************************
  *           GetObject32W    (GDI32.206)
  */
-INT32 GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
+INT32 WINAPI GetObject32W( HANDLE32 handle, INT32 count, LPVOID buffer )
 {
     return GetObject32A( handle, count, buffer );
 }
@@ -437,7 +466,7 @@
 /***********************************************************************
  *           SelectObject16    (GDI.45)
  */
-HGDIOBJ16 SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
+HGDIOBJ16 WINAPI SelectObject16( HDC16 hdc, HGDIOBJ16 handle )
 {
     return (HGDIOBJ16)SelectObject32( hdc, handle );
 }
@@ -446,7 +475,7 @@
 /***********************************************************************
  *           SelectObject32    (GDI32.299)
  */
-HGDIOBJ32 SelectObject32( HDC32 hdc, HGDIOBJ32 handle )
+HGDIOBJ32 WINAPI SelectObject32( HDC32 hdc, HGDIOBJ32 handle )
 {
     DC * dc = DC_GetDCPtr( hdc );
     if (!dc || !dc->funcs->pSelectObject) return 0;
@@ -458,7 +487,7 @@
 /***********************************************************************
  *           UnrealizeObject16    (GDI.150)
  */
-BOOL16 UnrealizeObject16( HGDIOBJ16 obj )
+BOOL16 WINAPI UnrealizeObject16( HGDIOBJ16 obj )
 {
     return UnrealizeObject32( obj );
 }
@@ -467,11 +496,12 @@
 /***********************************************************************
  *           UnrealizeObject    (GDI32.358)
  */
-BOOL32 UnrealizeObject32( HGDIOBJ32 obj )
+BOOL32 WINAPI UnrealizeObject32( HGDIOBJ32 obj )
 {
-      /* Check if object is valid */
+    BOOL32 result = TRUE;
+  /* Check if object is valid */
 
-    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( obj );
+    GDIOBJHDR * header = (GDIOBJHDR *) GDI_HEAP_LOCK( obj );
     if (!header) return FALSE;
 
     dprintf_gdi( stddeb, "UnrealizeObject: %04x\n", obj );
@@ -481,21 +511,23 @@
     switch(header->wMagic)
     {
     case PALETTE_MAGIC: 
-        return PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
+        result = PALETTE_UnrealizeObject( obj, (PALETTEOBJ *)header );
+	break;
 
     case BRUSH_MAGIC:
         /* Windows resets the brush origin. We don't need to. */
         break;
     }
-    return TRUE;
+    GDI_HEAP_UNLOCK( obj );
+    return result;
 }
 
 
 /***********************************************************************
  *           EnumObjects16    (GDI.71)
  */
-INT16 EnumObjects16( HDC16 hdc, INT16 nObjType, GOBJENUMPROC16 lpEnumFunc,
-                     LPARAM lParam )
+INT16 WINAPI EnumObjects16( HDC16 hdc, INT16 nObjType,
+                            GOBJENUMPROC16 lpEnumFunc, LPARAM lParam )
 {
     /* Solid colors to enumerate */
     static const COLORREF solid_colors[] =
@@ -573,8 +605,8 @@
 /***********************************************************************
  *           EnumObjects32    (GDI32.89)
  */
-INT32 EnumObjects32( HDC32 hdc, INT32 nObjType, GOBJENUMPROC32 lpEnumFunc,
-                     LPARAM lParam )
+INT32 WINAPI EnumObjects32( HDC32 hdc, INT32 nObjType,
+                            GOBJENUMPROC32 lpEnumFunc, LPARAM lParam )
 {
     /* Solid colors to enumerate */
     static const COLORREF solid_colors[] =
@@ -648,12 +680,19 @@
 
 /***********************************************************************
  *           IsGDIObject    (GDI.462)
+ * 
+ * returns type of object if valid (W95 system programming secrets p. 264-5)
  */
-BOOL16 IsGDIObject( HGDIOBJ16 handle )
+BOOL16 WINAPI IsGDIObject( HGDIOBJ16 handle )
 {
-    GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LIN_ADDR( handle );
+    GDIOBJHDR *object = (GDIOBJHDR *) GDI_HEAP_LOCK( handle );
     if (object)
-      return (object->wMagic>=PEN_MAGIC && object->wMagic<= METAFILE_DC_MAGIC);
+    {
+        UINT16 magic = object->wMagic;
+        GDI_HEAP_UNLOCK( handle );
+        if (magic >= PEN_MAGIC && magic <= METAFILE_DC_MAGIC)
+            return magic - PEN_MAGIC + 1;
+    }
     return FALSE;
 }
 
@@ -661,7 +700,7 @@
 /***********************************************************************
  *           MulDiv16   (GDI.128)
  */
-INT16 MulDiv16( INT16 foo, INT16 bar, INT16 baz )
+INT16 WINAPI MulDiv16( INT16 foo, INT16 bar, INT16 baz )
 {
     INT32 ret;
     if (!baz) return -32768;
@@ -674,7 +713,7 @@
 /***********************************************************************
  *           MulDiv32   (KERNEL32.391)
  */
-INT32 MulDiv32( INT32 foo, INT32 bar, INT32 baz )
+INT32 WINAPI MulDiv32( INT32 foo, INT32 bar, INT32 baz )
 {
 #ifdef __GNUC__
     long long ret;