Add forgotten files Added: vendor/wine/dlls/comctl32/current/theme_combo.c Added: vendor/wine/dlls/comctl32/current/theme_dialog.c Added: vendor/wine/dlls/comctl32/current/theme_edit.c Added: vendor/wine/dlls/comctl32/current/theme_listbox.c Added: vendor/wine/dlls/comctl32/current/theming.c _____
Added: vendor/wine/dlls/comctl32/current/theme_combo.c --- vendor/wine/dlls/comctl32/current/theme_combo.c 2005-09-05 20:07:46 UTC (rev 17662) +++ vendor/wine/dlls/comctl32/current/theme_combo.c 2005-09-05 20:12:18 UTC (rev 17663) @@ -0,0 +1,319 @@
+/* + * Theming - Combo box control + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "uxtheme.h" +#include "tmschema.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(themingcombo); + +/* Subclass-private state flags */ +#define STATE_NOREDRAW 1 +#define STATE_HOT 2 + +/* some constants for metrics, same as in user32 */ +#define COMBO_XBORDERSIZE 2 +#define COMBO_YBORDERSIZE 2 +#define COMBO_EDITBUTTONSPACE 0 +#define EDIT_CONTROL_PADDING 1 + +/* paint text of combobox, needed for read-only drop downs. */ +static void paint_text (HWND hwnd, HDC hdc, DWORD dwStyle, COMBOBOXINFO* cbi) +{ + INT id, size = 0; + LPWSTR pText = NULL; + UINT itemState = ODS_COMBOBOXEDIT; + HFONT font = (HFONT)SendMessageW (hwnd, WM_GETFONT, 0, 0); + HFONT hPrevFont = (font) ? SelectObject(hdc, font) : 0; + RECT rectEdit; + BOOL focused = GetFocus () == hwnd; + BOOL dropped = cbi->stateButton == STATE_SYSTEM_PRESSED; + + TRACE("\n"); + + /* follow Windows combobox that sends a bunch of text + * inquiries to its listbox while processing WM_PAINT. */ + + if( (id = SendMessageW (cbi->hwndList, LB_GETCURSEL, 0, 0) ) != LB_ERR ) + { + size = SendMessageW (cbi->hwndList, LB_GETTEXTLEN, id, 0); + if (size == LB_ERR) + FIXME("LB_ERR probably not handled yet\n"); + if( (pText = HeapAlloc( GetProcessHeap(), 0, (size + 1) * sizeof(WCHAR))) ) + { + /* size from LB_GETTEXTLEN may be too large, from LB_GETTEXT is accurate */ + size=SendMessageW (cbi->hwndList, LB_GETTEXT, (WPARAM)id, (LPARAM)pText); + pText[size] = '\0'; /* just in case */ + } else return; + } + else + if( !(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) ) + return; + + /* + * Give ourselves some space. + */ + CopyRect (&rectEdit, &cbi->rcItem); + InflateRect( &rectEdit, -1, -1 ); + + if(dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) + { + DRAWITEMSTRUCT dis; + HRGN clipRegion; + UINT ctlid = (UINT)GetWindowLongPtrW( hwnd, GWLP_ID ); + + /* setup state for DRAWITEM message. Owner will highlight */ + if ( focused && !dropped ) + itemState |= ODS_SELECTED | ODS_FOCUS; + + /* + * Save the current clip region. + * To retrieve the clip region, we need to create one "dummy" + * clip region. + */ + clipRegion = CreateRectRgnIndirect(&rectEdit); + + if (GetClipRgn(hdc, clipRegion)!=1) + { + DeleteObject(clipRegion); + clipRegion=NULL; + } + + if (!IsWindowEnabled(hwnd) & WS_DISABLED) itemState |= ODS_DISABLED; + + dis.CtlType = ODT_COMBOBOX; + dis.CtlID = ctlid; + dis.hwndItem = hwnd; + dis.itemAction = ODA_DRAWENTIRE; + dis.itemID = id; + dis.itemState = itemState; + dis.hDC = hdc; + dis.rcItem = rectEdit; + dis.itemData = SendMessageW(cbi->hwndList, LB_GETITEMDATA, + (WPARAM)id, 0 ); + + /* + * Clip the DC and have the parent draw the item. + */ + IntersectClipRect(hdc, + rectEdit.left, rectEdit.top, + rectEdit.right, rectEdit.bottom); + + SendMessageW(GetParent (hwnd), WM_DRAWITEM, ctlid, (LPARAM)&dis ); + + /* + * Reset the clipping region. + */ + SelectClipRgn(hdc, clipRegion); + } + else + { + static const WCHAR empty_stringW[] = { 0 }; + + if ( focused && !dropped ) { + + /* highlight */ + FillRect( hdc, &rectEdit, GetSysColorBrush(COLOR_HIGHLIGHT) ); + SetBkColor( hdc, GetSysColor( COLOR_HIGHLIGHT ) ); + SetTextColor( hdc, GetSysColor( COLOR_HIGHLIGHTTEXT ) ); + } + + ExtTextOutW( hdc, + rectEdit.left + 1, + rectEdit.top + 1, + ETO_OPAQUE | ETO_CLIPPED, + &rectEdit, + pText ? pText : empty_stringW , size, NULL ); + + if ( focused && !dropped ) + DrawFocusRect( hdc, &rectEdit ); + } + + if( hPrevFont ) + SelectObject(hdc, hPrevFont ); + + HeapFree( GetProcessHeap(), 0, pText ); +} + +/* paint the combobox */ +static LRESULT paint (HTHEME theme, HWND hwnd, HDC hParamDC, ULONG state) +{ + PAINTSTRUCT ps; + HDC hDC; + COMBOBOXINFO cbi; + DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE); + + hDC = (hParamDC) ? hParamDC + : BeginPaint( hwnd, &ps); + + TRACE("hdc=%p\n", hDC); + + if( hDC && !(state & STATE_NOREDRAW) ) + { + RECT frameRect; + int buttonState; + + cbi.cbSize = sizeof (cbi); + SendMessageW (hwnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)&cbi); + + /* paint border */ + if ((dwStyle & CBS_DROPDOWNLIST) != CBS_SIMPLE) + GetClientRect (hwnd, &frameRect); + else + { + CopyRect (&frameRect, &cbi.rcItem); + + InflateRect(&frameRect, + EDIT_CONTROL_PADDING + COMBO_XBORDERSIZE, + EDIT_CONTROL_PADDING + COMBO_YBORDERSIZE); + } + + DrawThemeBackground (theme, hDC, 0, + IsWindowEnabled (hwnd) ? CBXS_NORMAL : CBXS_DISABLED, &frameRect, NULL); + + /* paint button */ + if (cbi.stateButton != STATE_SYSTEM_INVISIBLE) + { + if (!IsWindowEnabled (hwnd)) + buttonState = CBXS_DISABLED; + else if (cbi.stateButton == STATE_SYSTEM_PRESSED) + buttonState = CBXS_PRESSED; + else if (state & STATE_HOT) + buttonState = CBXS_HOT; + else + buttonState = CBXS_NORMAL; + DrawThemeBackground (theme, hDC, CP_DROPDOWNBUTTON, buttonState, + &cbi.rcButton, NULL); + } + + /* paint text, if we need to */ + if ((dwStyle & CBS_DROPDOWNLIST) == CBS_DROPDOWNLIST) + paint_text (hwnd, hDC, dwStyle, &cbi); + } + + if( !hParamDC ) + EndPaint(hwnd, &ps); + + return 0; +} + + +/********************************************************************** + * The combo control subclass window proc. + */ +LRESULT CALLBACK THEMING_ComboSubclassProc (HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + const WCHAR* themeClass = WC_COMBOBOXW; + HTHEME theme; + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + OpenThemeData( hwnd, themeClass ); + return result; + + case WM_DESTROY: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + OpenThemeData( hwnd, themeClass ); + break; + + case WM_SYSCOLORCHANGE: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_PAINT: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + return paint (theme, hwnd, (HDC)wParam, dwRefData); + + case WM_SETREDRAW: + /* Since there doesn't seem to be WM_GETREDRAW, do redraw tracking in + * the subclass as well. */ + if( wParam ) + dwRefData &= ~STATE_NOREDRAW; + else + dwRefData |= STATE_NOREDRAW; + THEMING_SetSubclassData (hwnd, dwRefData); + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + case WM_MOUSEMOVE: + { + /* Dropdown button hot-tracking */ + COMBOBOXINFO cbi; + POINT pt = {LOWORD(lParam), HIWORD(lParam)}; + + cbi.cbSize = sizeof (cbi); + SendMessageW (hwnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)&cbi); + + if (cbi.stateButton != STATE_SYSTEM_INVISIBLE) + { + if (PtInRect (&cbi.rcButton, pt)) + { + if (!(dwRefData & STATE_HOT)) + { + dwRefData |= STATE_HOT; + THEMING_SetSubclassData (hwnd, dwRefData); + RedrawWindow (hwnd, &cbi.rcButton, 0, + RDW_INVALIDATE | RDW_UPDATENOW); + } + } + else + { + if (dwRefData & STATE_HOT) + { + dwRefData &= ~STATE_HOT; + THEMING_SetSubclassData (hwnd, dwRefData); + RedrawWindow (hwnd, &cbi.rcButton, 0, + RDW_INVALIDATE | RDW_UPDATENOW); + } + } + } + } + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + default: + /* Call old proc */ + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + } + return 0; +} Property changes on: vendor/wine/dlls/comctl32/current/theme_combo.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/dlls/comctl32/current/theme_dialog.c --- vendor/wine/dlls/comctl32/current/theme_dialog.c 2005-09-05 20:07:46 UTC (rev 17662) +++ vendor/wine/dlls/comctl32/current/theme_dialog.c 2005-09-05 20:12:18 UTC (rev 17663) @@ -0,0 +1,142 @@
+/* + * Theming - Dialogs + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "uxtheme.h" +#include "tmschema.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(themingdialog); + +/********************************************************************** + * The dialog subclass window proc. + */ +LRESULT CALLBACK THEMING_DialogSubclassProc (HWND hWnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + HTHEME theme = GetWindowTheme ( hWnd ); + static const WCHAR themeClass[] = { 'W','i','n','d','o','w',0 }; + BOOL themingActive = IsThemeDialogTextureEnabled (hWnd); + BOOL doTheming = themingActive && (theme != NULL); + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + theme = OpenThemeData( hWnd, themeClass ); + return result; + + case WM_DESTROY: + CloseThemeData ( theme ); + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + CloseThemeData ( theme ); + OpenThemeData( hWnd, themeClass ); + InvalidateRect( hWnd, NULL, TRUE ); + return 0; + + case WM_SYSCOLORCHANGE: + if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_ERASEBKGND: + if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + { + RECT rc; + DLGPROC dlgp = (DLGPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); + if (!dlgp (hWnd, msg, wParam, lParam)) + { + /* Draw background*/ + GetClientRect (hWnd, &rc); + if (IsThemePartDefined (theme, WP_DIALOG, 0)) + /* Although there is a theme for the WINDOW class/DIALOG part, + * but I[res] haven't seen Windows using it yet... Even when + * dialog theming is activated, the good ol' BTNFACE + * background seems to be used. */ +#if 0 + DrawThemeBackground (theme, (HDC)wParam, WP_DIALOG, 0, &rc, + NULL); +#endif + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + else + /* We might have gotten a TAB theme class, so check if we can + * draw as a tab page. */ + if (IsThemePartDefined (theme, TABP_BODY, 0)) + DrawThemeBackground (theme, (HDC)wParam, TABP_BODY, 0, &rc, + NULL); + else + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + } + return 1; + } + + case WM_CTLCOLORSTATIC: + if (!doTheming) return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + { + DLGPROC dlgp = (DLGPROC)GetWindowLongPtrW (hWnd, DWLP_DLGPROC); + LRESULT result = (LRESULT)dlgp (hWnd, msg, wParam, lParam); + if (!result) + { + /* Override defaults with more suitable values when themed */ + HDC controlDC = (HDC)wParam; + HWND controlWnd = (HWND)lParam; + WCHAR controlClass[32]; + RECT rc; + + GetClassNameW (controlWnd, controlClass, + sizeof(controlClass) / sizeof(controlClass[0])); + if (lstrcmpiW (controlClass, WC_STATICW) == 0) + { + /* Static control - draw parent background and set text to + * transparent, so it looks right on tab pages. */ + GetClientRect (controlWnd, &rc); + DrawThemeParentBackground (controlWnd, controlDC, &rc); + SetBkMode (controlDC, TRANSPARENT); + + /* Return NULL brush since we painted the BG already */ + return (LRESULT)GetStockObject (NULL_BRUSH); + } + else + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + + } + return result; + } + + default: + /* Call old proc */ + return THEMING_CallOriginalClass (hWnd, msg, wParam, lParam); + } + return 0; +} Property changes on: vendor/wine/dlls/comctl32/current/theme_dialog.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/dlls/comctl32/current/theme_edit.c --- vendor/wine/dlls/comctl32/current/theme_edit.c 2005-09-05 20:07:46 UTC (rev 17662) +++ vendor/wine/dlls/comctl32/current/theme_edit.c 2005-09-05 20:12:18 UTC (rev 17663) @@ -0,0 +1,134 @@
+/* + * Theming - Edit control + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "uxtheme.h" +#include "tmschema.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(themingedit); + +/* Draw themed border */ +static void nc_paint (HTHEME theme, HWND hwnd, HRGN region) +{ + HRGN cliprgn = region; + DWORD exStyle = GetWindowLongW (hwnd, GWL_EXSTYLE); + if (exStyle & WS_EX_CLIENTEDGE) + { + HDC dc; + RECT r; + int cxEdge = GetSystemMetrics (SM_CXEDGE), + cyEdge = GetSystemMetrics (SM_CYEDGE); + int part = EP_EDITTEXT; + int state = ETS_NORMAL; + DWORD dwStyle = GetWindowLongW (hwnd, GWL_STYLE); + + if (!IsWindowEnabled (hwnd)) + state = ETS_DISABLED; + else if (dwStyle & ES_READONLY) + state = ETS_READONLY; + else if (GetFocus() == hwnd) + state = ETS_FOCUSED; + + GetWindowRect(hwnd, &r); + + /* New clipping region passed to default proc to exclude border */ + cliprgn = CreateRectRgn (r.left + cxEdge, r.top + cyEdge, + r.right - cxEdge, r.bottom - cyEdge); + if (region != (HRGN)1) + CombineRgn (cliprgn, cliprgn, region, RGN_AND); + OffsetRect(&r, -r.left, -r.top); + + dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); + + if (IsThemeBackgroundPartiallyTransparent (theme, part, state)) + DrawThemeParentBackground(hwnd, dc, &r); + DrawThemeBackground (theme, dc, part, state, &r, 0); + ReleaseDC(hwnd, dc); + } + + /* Call default proc to get the scrollbars etc. also painted */ + DefWindowProcW (hwnd, WM_NCPAINT, (WPARAM)cliprgn, 0); +} + +/********************************************************************** + * The edit control subclass window proc. + */ +LRESULT CALLBACK THEMING_EditSubclassProc (HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + const WCHAR* themeClass = WC_EDITW; + HTHEME theme; + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + OpenThemeData( hwnd, themeClass ); + return result; + + case WM_DESTROY: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + OpenThemeData( hwnd, themeClass ); + break; + + case WM_SYSCOLORCHANGE: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_NCPAINT: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + nc_paint (theme, hwnd, (HRGN)wParam); + break; + + case WM_ENABLE: + theme = GetWindowTheme( hwnd ); + if (theme) RedrawWindow (hwnd, NULL, NULL, + RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + default: + /* Call old proc */ + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + } + return 0; +} Property changes on: vendor/wine/dlls/comctl32/current/theme_edit.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/dlls/comctl32/current/theme_listbox.c --- vendor/wine/dlls/comctl32/current/theme_listbox.c 2005-09-05 20:07:46 UTC (rev 17662) +++ vendor/wine/dlls/comctl32/current/theme_listbox.c 2005-09-05 20:12:18 UTC (rev 17663) @@ -0,0 +1,118 @@
+/* + * Theming - List box control + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdarg.h> +#include <string.h> +#include <stdlib.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "uxtheme.h" +#include "tmschema.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(theminglistbox); + +/* Draw themed border */ +static void nc_paint (HTHEME theme, HWND hwnd, HRGN region) +{ + HRGN cliprgn = region; + DWORD exStyle = GetWindowLongW (hwnd, GWL_EXSTYLE); + if (exStyle & WS_EX_CLIENTEDGE) + { + HDC dc; + RECT r; + int cxEdge = GetSystemMetrics (SM_CXEDGE), + cyEdge = GetSystemMetrics (SM_CYEDGE); + + GetWindowRect(hwnd, &r); + + /* New clipping region passed to default proc to exclude border */ + cliprgn = CreateRectRgn (r.left + cxEdge, r.top + cyEdge, + r.right - cxEdge, r.bottom - cyEdge); + if (region != (HRGN)1) + CombineRgn (cliprgn, cliprgn, region, RGN_AND); + OffsetRect(&r, -r.left, -r.top); + + dc = GetDCEx(hwnd, region, DCX_WINDOW|DCX_INTERSECTRGN); + OffsetRect(&r, -r.left, -r.top); + + if (IsThemeBackgroundPartiallyTransparent (theme, 0, 0)) + DrawThemeParentBackground(hwnd, dc, &r); + DrawThemeBackground (theme, dc, 0, 0, &r, 0); + ReleaseDC(hwnd, dc); + } + + /* Call default proc to get the scrollbars etc. painted */ + DefWindowProcW (hwnd, WM_NCPAINT, (WPARAM)cliprgn, 0); +} + +/********************************************************************** + * The list control subclass window proc. + */ +LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam, + ULONG_PTR dwRefData) +{ + const WCHAR* themeClass = WC_LISTBOXW; + HTHEME theme; + LRESULT result; + + switch (msg) + { + case WM_CREATE: + result = THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + OpenThemeData( hwnd, themeClass ); + return result; + + case WM_DESTROY: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + + case WM_THEMECHANGED: + theme = GetWindowTheme( hwnd ); + CloseThemeData ( theme ); + OpenThemeData( hwnd, themeClass ); + break; + + case WM_SYSCOLORCHANGE: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + /* Do nothing. When themed, a WM_THEMECHANGED will be received, too, + * which will do the repaint. */ + break; + + case WM_NCPAINT: + theme = GetWindowTheme( hwnd ); + if (!theme) return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + nc_paint (theme, hwnd, (HRGN)wParam); + break; + + default: + /* Call old proc */ + return THEMING_CallOriginalClass (hwnd, msg, wParam, lParam); + } + return 0; +} Property changes on: vendor/wine/dlls/comctl32/current/theme_listbox.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Added: vendor/wine/dlls/comctl32/current/theming.c --- vendor/wine/dlls/comctl32/current/theming.c 2005-09-05 20:07:46 UTC (rev 17662) +++ vendor/wine/dlls/comctl32/current/theming.c 2005-09-05 20:12:18 UTC (rev 17663) @@ -0,0 +1,169 @@
+/* + * Theming - Initialization + * + * Copyright (c) 2005 by Frank Richter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include <stdarg.h> + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "comctl32.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(theming); + +typedef LRESULT (CALLBACK* THEMING_SUBCLASSPROC)(HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); + +extern LRESULT CALLBACK THEMING_ComboSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); +extern LRESULT CALLBACK THEMING_DialogSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); +extern LRESULT CALLBACK THEMING_EditSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); +extern LRESULT CALLBACK THEMING_ListBoxSubclassProc (HWND, UINT, WPARAM, LPARAM, + ULONG_PTR); + +static const WCHAR dialogClass[] = {'#','3','2','7','7','0',0}; +static const WCHAR comboLboxClass[] = {'C','o','m','b','o','L','b','o','x',0}; + +static const struct ThemingSubclass +{ + const WCHAR* className; + THEMING_SUBCLASSPROC subclassProc; +} subclasses[] = { + /* Note: list must be sorted by class name */ + {dialogClass, THEMING_DialogSubclassProc}, + {WC_COMBOBOXW, THEMING_ComboSubclassProc}, + {comboLboxClass, THEMING_ListBoxSubclassProc}, + {WC_EDITW, THEMING_EditSubclassProc}, + {WC_LISTBOXW, THEMING_ListBoxSubclassProc} +}; + +#define NUM_SUBCLASSES (sizeof(subclasses)/sizeof(subclasses[0])) + +static WNDPROC originalProcs[NUM_SUBCLASSES]; +static ATOM atRefDataProp; +static ATOM atSubclassProp; + +/* Generate a number of subclass window procs. + * With a single proc alone, we can't really reliably find out the superclass, + * so have one for each subclass. The subclass number is also stored in a prop + * since it's needed by THEMING_CallOriginalClass(). Then, the the subclass + * proc and ref data are fetched and the proc called. + */ +#define MAKE_SUBCLASS_PROC(N) \ +static LRESULT CALLBACK subclass_proc ## N (HWND wnd, UINT msg, \ + WPARAM wParam, LPARAM lParam) \ +{ \ + LRESULT result; \ + ULONG_PTR refData; \ + SetPropW (wnd, MAKEINTATOMW (atSubclassProp), (HANDLE)N); \ + refData = (ULONG_PTR)GetPropW (wnd, MAKEINTATOMW (atRefDataProp)); \ + TRACE ("%d; (%p, %x, %x, %lx, %lx)\n", N, wnd, msg, wParam, lParam, \ + refData); \ + result = subclasses[N].subclassProc (wnd, msg, wParam, lParam, refData);\ + TRACE ("result = %lx\n", result); \ + return result; \ +} + +MAKE_SUBCLASS_PROC(0) +MAKE_SUBCLASS_PROC(1) +MAKE_SUBCLASS_PROC(2) +MAKE_SUBCLASS_PROC(3) +MAKE_SUBCLASS_PROC(4) + +const static WNDPROC subclassProcs[NUM_SUBCLASSES] = { + subclass_proc0, + subclass_proc1, + subclass_proc2, + subclass_proc3, + subclass_proc4 +}; + +/********************************************************************** * + * THEMING_Initialize + * + * Register classes for standard controls that will shadow the system + * classes. + */ +void THEMING_Initialize (void) +{ + int i; + static const WCHAR subclassPropName[] = + { 'C','C','3','2','T','h','e','m','i','n','g','S','u','b','C','l',0 }; + static const WCHAR refDataPropName[] = + { 'C','C','3','2','T','h','e','m','i','n','g','D','a','t','a',0 }; + + atSubclassProp = GlobalAddAtomW (subclassPropName); + atRefDataProp = GlobalAddAtomW (refDataPropName); + + for (i = 0; i < NUM_SUBCLASSES; i++) + { + WNDCLASSEXW class; + + class.cbSize = sizeof(class); + class.style |= CS_GLOBALCLASS; + GetClassInfoExW (NULL, subclasses[i].className, &class); + originalProcs[i] = class.lpfnWndProc; + class.lpfnWndProc = subclassProcs[i]; + + if (!class.lpfnWndProc) + { + ERR("Missing proc for class %s\n", + debugstr_w (subclasses[i].className)); + continue; + } + + if (!RegisterClassExW (&class)) + { + ERR("Could not re-register class %s: %lx\n", + debugstr_w (subclasses[i].className), GetLastError ()); + } + else + { + TRACE("Re-registered class %s\n", + debugstr_w (subclasses[i].className)); + } + } +} + +/********************************************************************** * + * THEMING_CallOriginalClass + * + * Determines the original window proc and calls it. + */ +LRESULT THEMING_CallOriginalClass (HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + INT_PTR subclass = (INT_PTR)GetPropW (wnd, MAKEINTATOMW (atSubclassProp)); + WNDPROC oldProc = originalProcs[subclass]; + return CallWindowProcW (oldProc, wnd, msg, wParam, lParam); +} + +/********************************************************************** * + * THEMING_SetSubclassData + * + * Update the "refData" value of the subclassed window. + */ +void THEMING_SetSubclassData (HWND wnd, ULONG_PTR refData) +{ + SetPropW (wnd, MAKEINTATOMW (atRefDataProp), (HANDLE)refData); +} Property changes on: vendor/wine/dlls/comctl32/current/theming.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native