Author: tkreuzer Date: Sat Aug 13 15:16:31 2011 New Revision: 53204
URL: http://svn.reactos.org/svn/reactos?rev=53204&view=rev Log: [USER32] 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!
Modified: trunk/reactos/dll/win32/user32/controls/static.c trunk/reactos/dll/win32/user32/include/user32p.h
Modified: trunk/reactos/dll/win32/user32/controls/static.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/controls/s... ============================================================================== --- trunk/reactos/dll/win32/user32/controls/static.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/controls/static.c [iso-8859-1] Sat Aug 13 15:16:31 2011 @@ -55,15 +55,13 @@ 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 @@ 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_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 @@ } else */ { - SetWindowPos( hwnd, 0, 0, 0, bm.bmWidth, bm.bmHeight, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); - } - - DeleteObject(info.hbmMask); - if (info.hbmColor) DeleteObject(info.hbmColor); + SetWindowPos( hwnd, 0, 0, 0, size.cx, size.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER ); + } } return prevIcon; } @@ -218,7 +172,7 @@ /*********************************************************************** * 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 @@
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 @@ return hicon; }
- /*********************************************************************** * STATIC_TryPaintFcn * @@ -362,11 +315,11 @@ { 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 @@ /*********************************************************************** * 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 @@ { NtUserSetWindowFNID(hwnd, FNID_STATIC); } - } -#endif + } +#endif + + if (!IsWindow( hwnd )) return 0;
switch (uMsg) { @@ -447,7 +401,7 @@ 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 @@ 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 @@
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 @@ 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 @@ STATIC_TryPaintFcn( hwnd, full_style ); break;
+#ifdef __REACTOS__ case WM_UPDATEUISTATE: if (unicode) DefWindowProcW(hwnd, uMsg, wParam, lParam); @@ -654,6 +593,7 @@ 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 @@
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 @@
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; @@ -850,6 +790,7 @@ } DeleteObject( hBrush ); } +
static void STATIC_PaintIconfn( HWND hwnd, HDC hdc, DWORD style ) { @@ -969,4 +910,3 @@ break; } } -
Modified: trunk/reactos/dll/win32/user32/include/user32p.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/us... ============================================================================== --- trunk/reactos/dll/win32/user32/include/user32p.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/include/user32p.h [iso-8859-1] Sat Aug 13 15:16:31 2011 @@ -214,4 +214,28 @@ #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 */