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;