diff --git a/dlls/gdi/gdi32.spec b/dlls/gdi/gdi32.spec index 397868e0591..00b646032b5 100644 --- a/dlls/gdi/gdi32.spec +++ b/dlls/gdi/gdi32.spec @@ -431,6 +431,15 @@ @ stdcall SetHookFlags16(long long) @ stdcall WriteSpool16(long ptr long) +################################################################ +# Wine internal extensions +# +# All functions must be prefixed with '__wine_' (for internal functions) +# or 'wine_' (for user-visible functions) to avoid namespace conflicts. + +# GDI objects +@ cdecl __wine_make_gdi_object_system(long long) + ################################################################ # Wine dll separation hacks, these will go away, don't use them # diff --git a/dlls/gdi/gdiobj.c b/dlls/gdi/gdiobj.c index fdd7c72f204..3ac5763ed2b 100644 --- a/dlls/gdi/gdiobj.c +++ b/dlls/gdi/gdiobj.c @@ -445,6 +445,26 @@ static const struct DefaultFontInfo default_fonts[] = }; +/************************************************************************* + * __wine_make_gdi_object_system (GDI32.@) + * + * USER has to tell GDI that its system brushes and pens are non-deletable. + * For a description of the GDI object magics and their flags, + * see "Undocumented Windows" (wrong about the OBJECT_NOSYSTEM flag, though). + */ +void __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set) +{ + GDIOBJHDR *ptr = GDI_GetObjPtr( handle, MAGIC_DONTCARE ); + + /* touch the "system" bit of the wMagic field of a GDIOBJHDR */ + if (set) + ptr->wMagic &= ~OBJECT_NOSYSTEM; + else + ptr->wMagic |= OBJECT_NOSYSTEM; + + GDI_ReleaseObj( handle ); +} + /****************************************************************************** * get_default_fonts */ @@ -604,7 +624,6 @@ BOOL GDI_Init(void) { HINSTANCE16 instance; HKEY hkey; - GDIOBJHDR *ptr; LOGFONTW default_gui_font; const struct DefaultFontInfo* deffonts; int i; @@ -659,9 +678,7 @@ BOOL GDI_Init(void) ERR( "could not create stock object %d\n", i ); return FALSE; } - ptr = GDI_GetObjPtr( stock_objects[i], MAGIC_DONTCARE ); - ptr->wMagic &= ~OBJECT_NOSYSTEM; - GDI_ReleaseObj( stock_objects[i] ); + __wine_make_gdi_object_system( stock_objects[i], TRUE ); } if (hkey) RegCloseKey( hkey ); diff --git a/windows/syscolor.c b/windows/syscolor.c index 3e082f0907e..53343be185e 100644 --- a/windows/syscolor.c +++ b/windows/syscolor.c @@ -27,13 +27,9 @@ #include "windef.h" #include "winbase.h" #include "wingdi.h" -#include "wine/winbase16.h" -#include "wine/winuser16.h" #include "winuser.h" -#include "wownt32.h" #include "winreg.h" #include "winternl.h" -#include "gdi.h" /* sic */ #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(syscolor); @@ -85,41 +81,7 @@ static const WORD wPattern55AA[] = HBRUSH SYSCOLOR_55AABrush = 0; - -/************************************************************************* - * SYSCOLOR_MakeObjectSystem - * - * OK, now for a very ugly hack. - * USER somehow has to tell GDI that its system brushes and pens are - * non-deletable. - * We don't want to export a function from GDI doing this for us, - * so we just do that ourselves by "wildly flipping some bits in memory". - * For a description of the GDI object magics and their flags, - * see "Undocumented Windows" (wrong about the OBJECT_NOSYSTEM flag, though). - */ -static void SYSCOLOR_MakeObjectSystem( HGDIOBJ16 handle, BOOL set) -{ - static WORD heap_sel = 0; - LPWORD ptr; - - if (!heap_sel) heap_sel = LoadLibrary16( "gdi" ); - if (heap_sel >= 32) - { - STACK16FRAME* stack16 = MapSL((SEGPTR)NtCurrentTeb()->WOW32Reserved); - HANDLE16 oldDS = stack16->ds; - - stack16->ds = heap_sel; - ptr = MapSL(LocalLock16(handle)); - - /* touch the "system" bit of the wMagic field of a GDIOBJHDR */ - if (set) - *ptr &= ~OBJECT_NOSYSTEM; - else - *ptr |= OBJECT_NOSYSTEM; - LocalUnlock16( handle ); - stack16->ds = oldDS; - } -} +extern void __wine_make_gdi_object_system( HGDIOBJ handle, BOOL set ); /************************************************************************* * SYSCOLOR_SetColor @@ -130,19 +92,19 @@ static void SYSCOLOR_SetColor( int index, COLORREF color ) SysColors[index] = color; if (SysColorBrushes[index]) { - SYSCOLOR_MakeObjectSystem( HBRUSH_16(SysColorBrushes[index]), FALSE); + __wine_make_gdi_object_system( SysColorBrushes[index], FALSE); DeleteObject( SysColorBrushes[index] ); } SysColorBrushes[index] = CreateSolidBrush( color ); - SYSCOLOR_MakeObjectSystem( HBRUSH_16(SysColorBrushes[index]), TRUE); + __wine_make_gdi_object_system( SysColorBrushes[index], TRUE); if (SysColorPens[index]) { - SYSCOLOR_MakeObjectSystem( HPEN_16(SysColorPens[index]), FALSE); + __wine_make_gdi_object_system( SysColorPens[index], FALSE); DeleteObject( SysColorPens[index] ); } SysColorPens[index] = CreatePen( PS_SOLID, 1, color ); - SYSCOLOR_MakeObjectSystem( HPEN_16(SysColorPens[index]), TRUE); + __wine_make_gdi_object_system( SysColorPens[index], TRUE); } @@ -192,7 +154,7 @@ void SYSCOLOR_Init(void) h55AABitmap = CreateBitmap( 8, 8, 1, 1, wPattern55AA ); SYSCOLOR_55AABrush = CreatePatternBrush( h55AABitmap ); - SYSCOLOR_MakeObjectSystem( HBRUSH_16(SYSCOLOR_55AABrush), TRUE ); + __wine_make_gdi_object_system( SYSCOLOR_55AABrush, TRUE ); }