Partly sync static.c with wine, reduce diff between ros and wine code. The leak fix is taken care of. Also go back from Get/SetWindowLongPtr to Get/SetWindowLong for LONG values. Using the *Ptr version is wrong for LONG values!

svn path=/trunk/; revision=53204
This commit is contained in:
Timo Kreuzer
2011-08-13 15:16:31 +00:00
parent d1613210c2
commit 769718b08d
2 changed files with 70 additions and 106 deletions
+46 -106
View File
@@ -55,15 +55,13 @@ static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style );
static void STATIC_PaintBitmapfn( HWND hwnd, HDC hdc, DWORD style );
static void STATIC_PaintEnhMetafn( HWND hwnd, HDC hdc, DWORD style );
static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style );
//static LRESULT WINAPI StaticWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
//static LRESULT WINAPI StaticWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
static COLORREF color_3dshadow, color_3ddkshadow, color_3dhighlight;
/* offsets for GetWindowLong for static private information */
#define HFONT_GWL_OFFSET 0
#define HICON_GWL_OFFSET (sizeof(HFONT))
#define UISTATE_GWL_OFFSET (HICON_GWL_OFFSET+sizeof(HICON))
#define UISTATE_GWL_OFFSET (HICON_GWL_OFFSET+sizeof(HICON)) // ReactOS: keep in sync with STATIC_UISTATE_GWL_OFFSET
#define STATIC_EXTRA_BYTES (UISTATE_GWL_OFFSET + sizeof(LONG))
typedef void (*pfPaint)( HWND hwnd, HDC hdc, DWORD style );
@@ -107,40 +105,6 @@ const struct builtin_class_descr STATIC_builtin_class =
0 /* brush */
};
/* REACTOS ONLY */
static __inline void set_ui_state( HWND hwnd, LONG flags )
{
SetWindowLongPtrW( hwnd, UISTATE_GWL_OFFSET, flags );
}
static __inline LONG get_ui_state( HWND hwnd )
{
return GetWindowLongPtrW( hwnd, UISTATE_GWL_OFFSET );
}
/* Retrieve the UI state for the control */
static BOOL STATIC_update_uistate(HWND hwnd, BOOL unicode)
{
LONG flags, prevflags;
if (unicode)
flags = DefWindowProcW(hwnd, WM_QUERYUISTATE, 0, 0);
else
flags = DefWindowProcA(hwnd, WM_QUERYUISTATE, 0, 0);
prevflags = get_ui_state(hwnd);
if (prevflags != flags)
{
set_ui_state(hwnd, flags);
return TRUE;
}
return FALSE;
}
/* END REACTOS ONLY */
static void setup_clipping(HWND hwnd, HDC hdc, HRGN *orig)
{
RECT rc;
@@ -172,28 +136,22 @@ static void restore_clipping(HDC hdc, HRGN hrgn)
/***********************************************************************
* STATIC_SetIcon
*
* Set the icon for an SS_ICON control. Modified for ReactOS
* Set the icon for an SS_ICON control.
*/
static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
{
HICON prevIcon;
ICONINFO info;
SIZE size;
if ((style & SS_TYPEMASK) != SS_ICON) return 0;
if (hicon && (!GetIconInfo(hicon, &info))) {
WARN("hicon != 0, but info == 0\n");
if (hicon && !get_icon_size( hicon, &size ))
{
WARN("hicon != 0, but invalid\n");
return 0;
}
prevIcon = (HICON)SetWindowLongPtrW( hwnd, HICON_GWL_OFFSET, (LONG_PTR)hicon );
if (hicon && !(style & SS_CENTERIMAGE) && !(style & SS_REALSIZECONTROL))
{
BITMAP bm;
if (!GetObjectW(info.hbmColor, sizeof(BITMAP), &bm))
{
return 0;
}
/* Windows currently doesn't implement SS_RIGHTJUST */
/*
if ((style & SS_RIGHTJUST) != 0)
@@ -205,12 +163,8 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
}
else */
{
SetWindowPos( hwnd, 0, 0, 0, bm.bmWidth, bm.bmHeight,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
SetWindowPos( hwnd, 0, 0, 0, size.cx, size.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER );
}
DeleteObject(info.hbmMask);
if (info.hbmColor) DeleteObject(info.hbmColor);
}
return prevIcon;
}
@@ -218,7 +172,7 @@ static HICON STATIC_SetIcon( HWND hwnd, HICON hicon, DWORD style )
/***********************************************************************
* STATIC_SetBitmap
*
* Set the bitmap for an SS_BITMAP control. Modified for ReactOS
* Set the bitmap for an SS_BITMAP control.
*/
static HBITMAP STATIC_SetBitmap( HWND hwnd, HBITMAP hBitmap, DWORD style )
{
@@ -331,13 +285,13 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
if (hInstance && ((ULONG_PTR)hInstance >> 16))
{
if ((style & SS_REALSIZEIMAGE) != 0)
hicon = LoadImageW(hInstance, name, IMAGE_ICON, 0, 0, LR_SHARED);
else
{
hicon = LoadIconW( hInstance, name );
if (!hicon) hicon = LoadCursorW( hInstance, name );
}
if ((style & SS_REALSIZEIMAGE) != 0)
hicon = LoadImageW(hInstance, name, IMAGE_ICON, 0, 0, LR_SHARED);
else
{
hicon = LoadIconW( hInstance, name );
if (!hicon) hicon = LoadCursorW( hInstance, name );
}
}
if (!hicon) hicon = LoadIconW( 0, name );
/* Windows doesn't try to load a standard cursor,
@@ -346,7 +300,6 @@ static HICON STATIC_LoadIconW( HINSTANCE hInstance, LPCWSTR name, DWORD style )
return hicon;
}
/***********************************************************************
* STATIC_TryPaintFcn
*
@@ -362,11 +315,11 @@ static VOID STATIC_TryPaintFcn(HWND hwnd, LONG full_style)
{
HDC hdc;
HRGN hOrigClipping;
hdc = GetDC( hwnd );
setup_clipping(hwnd, hdc, &hOrigClipping);
(staticPaintFunc[style])( hwnd, hdc, full_style );
restore_clipping(hdc, hOrigClipping);
restore_clipping(hdc, hOrigClipping);
ReleaseDC( hwnd, hdc );
}
}
@@ -420,11 +373,10 @@ static BOOL hasTextStyle( DWORD style )
/***********************************************************************
* StaticWndProc_common
*/
LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL unicode )
LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
{
LRESULT lResult = 0;
LONG full_style = GetWindowLongPtrW( hwnd, GWL_STYLE );
LONG full_style = GetWindowLongW( hwnd, GWL_STYLE );
LONG style = full_style & SS_TYPEMASK;
#ifdef __REACTOS__
PWND pWnd;
@@ -436,8 +388,10 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
{
NtUserSetWindowFNID(hwnd, FNID_STATIC);
}
}
#endif
}
#endif
if (!IsWindow( hwnd )) return 0;
switch (uMsg)
{
@@ -447,7 +401,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
ERR("Unknown style 0x%02lx\n", style );
return -1;
}
STATIC_update_uistate(hwnd, unicode);
STATIC_update_uistate(hwnd, unicode); // ReactOS r30727
STATIC_InitColours();
break;
@@ -470,8 +424,8 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
DefWindowProcA(hwnd, uMsg, wParam, lParam);
case WM_ERASEBKGND:
/* do all painting in WM_PAINT like Windows does */
return 1;
/* do all painting in WM_PAINT like Windows does */
return 1;
case WM_PRINTCLIENT:
case WM_PAINT:
@@ -510,47 +464,31 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
case WM_NCCREATE:
{
LPCSTR textA;
LPCWSTR textW;
HINSTANCE hInstance;
CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam;
if (full_style & SS_SUNKEN)
SetWindowLongPtrW( hwnd, GWL_EXSTYLE,
GetWindowLongPtrW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
if(unicode)
{
textA = NULL;
textW = ((LPCREATESTRUCTW)lParam)->lpszName;
}
else
{
textA = ((LPCREATESTRUCTA)lParam)->lpszName;
textW = NULL;
}
hInstance = (HINSTANCE)GetWindowLongPtrW( hwnd, GWLP_HINSTANCE );
SetWindowLongW( hwnd, GWL_EXSTYLE,
GetWindowLongW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
switch (style) {
case SS_ICON:
{
HICON hIcon;
if(unicode )
hIcon = STATIC_LoadIconW(hInstance, textW, full_style);
if (unicode || IS_INTRESOURCE(cs->lpszName))
hIcon = STATIC_LoadIconW(cs->hInstance, cs->lpszName, full_style);
else
hIcon = STATIC_LoadIconA(hInstance, textA, full_style);
hIcon = STATIC_LoadIconA(cs->hInstance, (LPCSTR)cs->lpszName, full_style);
STATIC_SetIcon(hwnd, hIcon, full_style);
}
break;
case SS_BITMAP:
if ((ULONG_PTR)hInstance >> 16)
if ((ULONG_PTR)cs->hInstance >> 16)
{
HBITMAP hBitmap;
if(unicode)
hBitmap = LoadBitmapW(hInstance, textW);
if (unicode || IS_INTRESOURCE(cs->lpszName))
hBitmap = LoadBitmapW(cs->hInstance, cs->lpszName);
else
hBitmap = LoadBitmapA(hInstance, textA);
hBitmap = LoadBitmapA(cs->hInstance, (LPCSTR)cs->lpszName);
STATIC_SetBitmap(hwnd, hBitmap, full_style);
}
break;
@@ -619,16 +557,16 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
case STM_SETIMAGE:
switch(wParam) {
case IMAGE_BITMAP:
if (style != SS_BITMAP) return 0;
if (style != SS_BITMAP) return 0; // ReactOS r43158
lResult = (LRESULT)STATIC_SetBitmap( hwnd, (HBITMAP)lParam, full_style );
break;
case IMAGE_ENHMETAFILE:
if (style != SS_ENHMETAFILE) return 0;
if (style != SS_ENHMETAFILE) return 0; // ReactOS r43158
lResult = (LRESULT)STATIC_SetEnhMetaFile( hwnd, (HENHMETAFILE)lParam, full_style );
break;
case IMAGE_ICON:
case IMAGE_CURSOR:
if (style != SS_ICON) return 0;
if (style != SS_ICON) return 0; // ReactOS r43158
lResult = (LRESULT)STATIC_SetIcon( hwnd, (HICON)lParam, full_style );
break;
default:
@@ -643,6 +581,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
STATIC_TryPaintFcn( hwnd, full_style );
break;
#ifdef __REACTOS__
case WM_UPDATEUISTATE:
if (unicode)
DefWindowProcW(hwnd, uMsg, wParam, lParam);
@@ -654,6 +593,7 @@ LRESULT WINAPI StaticWndProc_common( HWND hwnd, UINT uMsg, WPARAM wParam,
RedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ALLCHILDREN );
}
break;
#endif
default:
return unicode ? DefWindowProcW(hwnd, uMsg, wParam, lParam) :
@@ -745,7 +685,7 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
if (style & SS_NOPREFIX)
wFormat |= DT_NOPREFIX;
else if (get_ui_state(hwnd) & UISF_HIDEACCEL)
else if (GetWindowLongW(hwnd, UISTATE_GWL_OFFSET) & UISF_HIDEACCEL) // ReactOS r30727
wFormat |= DT_HIDEPREFIX;
if ((style & SS_TYPEMASK) != SS_SIMPLE)
@@ -781,9 +721,9 @@ static void STATIC_PaintTextfn( HWND hwnd, HDC hdc, DWORD style )
while ((len = InternalGetWindowText( hwnd, text, buf_size )) == buf_size - 1)
{
buf_size *= 2;
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))
goto no_TextOut;
buf_size *= 2;
if (!(text = HeapReAlloc( GetProcessHeap(), 0, text, buf_size * sizeof(WCHAR) )))
goto no_TextOut;
}
if (!len) goto no_TextOut;
@@ -851,6 +791,7 @@ static void STATIC_PaintRectfn( HWND hwnd, HDC hdc, DWORD style )
DeleteObject( hBrush );
}
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style )
{
RECT rc, iconRect;
@@ -969,4 +910,3 @@ static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
break;
}
}
@@ -214,4 +214,28 @@ PVOID FASTCALL ValidateHandle(HANDLE, UINT);
#define __EXCEPT_PAGE_FAULT else
#define __ENDTRY
#define STATIC_UISTATE_GWL_OFFSET (sizeof(HFONT)+sizeof(HICON))// see UISTATE_GWL_OFFSET in static.c
/* Retrieve the UI state for the control */
static __inline BOOL STATIC_update_uistate(HWND hwnd, BOOL unicode)
{
LONG flags, prevflags;
if (unicode)
flags = DefWindowProcW(hwnd, WM_QUERYUISTATE, 0, 0);
else
flags = DefWindowProcA(hwnd, WM_QUERYUISTATE, 0, 0);
prevflags = GetWindowLongW(hwnd, STATIC_UISTATE_GWL_OFFSET);
if (prevflags != flags)
{
SetWindowLongW(hwnd, STATIC_UISTATE_GWL_OFFSET, flags);
return TRUE;
}
return FALSE;
}
/* EOF */