From 87f83f8618105eaa5fcd9d03399118c106707a74 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 17 Dec 2009 12:56:50 +0100 Subject: [PATCH] user32: Pre-allocate the window procedure for the button class. --- dlls/user32/button.c | 28 ++++------------------------ dlls/user32/controls.h | 9 +++++++++ dlls/user32/winproc.c | 27 ++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/dlls/user32/button.c b/dlls/user32/button.c index 42163eb3124..6e68785342f 100644 --- a/dlls/user32/button.c +++ b/dlls/user32/button.c @@ -113,8 +113,6 @@ static void GB_Paint( HWND hwnd, HDC hDC, UINT action ); static void UB_Paint( HWND hwnd, HDC hDC, UINT action ); static void OB_Paint( HWND hwnd, HDC hDC, UINT action ); static void BUTTON_CheckAutoRadioButton( HWND hwnd ); -static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); -static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); #define MAX_BTN_TYPE 12 @@ -164,8 +162,8 @@ const struct builtin_class_descr BUTTON_builtin_class = { buttonW, /* name */ CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, /* style */ - ButtonWndProcA, /* procA */ - ButtonWndProcW, /* procW */ + NULL, /* procA */ + BUILTIN_WINPROC(WINPROC_BUTTON), /* procW */ NB_EXTRA_BYTES, /* extra */ IDC_ARROW, /* cursor */ 0 /* brush */ @@ -238,6 +236,8 @@ LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LONG state; HANDLE oldHbitmap; + if (!IsWindow( hWnd )) return 0; + pt.x = (short)LOWORD(lParam); pt.y = (short)HIWORD(lParam); @@ -545,26 +545,6 @@ LRESULT ButtonWndProc_common(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, return 0; } -/*********************************************************************** - * ButtonWndProcW - */ -static LRESULT WINAPI ButtonWndProcW( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - if (!IsWindow( hWnd )) return 0; - return wow_handlers.button_proc( hWnd, uMsg, wParam, lParam, TRUE ); -} - - -/*********************************************************************** - * ButtonWndProcA - */ -static LRESULT WINAPI ButtonWndProcA( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) -{ - if (!IsWindow( hWnd )) return 0; - return wow_handlers.button_proc( hWnd, uMsg, wParam, lParam, FALSE ); -} - - /********************************************************************** * Convert button styles to flags used by DrawText. */ diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h index 45dd2d0824e..501520f086c 100644 --- a/dlls/user32/controls.h +++ b/dlls/user32/controls.h @@ -31,6 +31,15 @@ #define WINSWITCH_CLASS_ATOM MAKEINTATOM(32771) /* WinSwitch */ #define ICONTITLE_CLASS_ATOM MAKEINTATOM(32772) /* IconTitle */ +enum builtin_winprocs +{ + WINPROC_BUTTON = 0, + NB_BUILTIN_WINPROCS +}; + +#define WINPROC_HANDLE (~0u >> 16) +#define BUILTIN_WINPROC(index) ((WNDPROC)(ULONG_PTR)((index) | (WINPROC_HANDLE << 16))) + /* Built-in class descriptor */ struct builtin_class_descr { diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index 0bde5309798..dd3e2346279 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -44,7 +44,6 @@ typedef struct tagWINDOWPROC WNDPROC procW; /* Unicode window proc */ } WINDOWPROC; -#define WINPROC_HANDLE (~0u >> 16) #define MAX_WINPROCS 4096 #define BUILTIN_WINPROCS 9 /* first BUILTIN_WINPROCS entries are reserved for builtin procs */ #define MAX_WINPROC_RECURSION 64 @@ -52,8 +51,15 @@ typedef struct tagWINDOWPROC WNDPROC EDIT_winproc_handle = 0; -static WINDOWPROC winproc_array[MAX_WINPROCS]; -static UINT builtin_used; +static LRESULT WINAPI ButtonWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); +static LRESULT WINAPI ButtonWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); + +static WINDOWPROC winproc_array[MAX_WINPROCS] = +{ + { ButtonWndProcA, ButtonWndProcW }, /* WINPROC_BUTTON */ +}; + +static UINT builtin_used = NB_BUILTIN_WINPROCS; static UINT winproc_used = BUILTIN_WINPROCS; static CRITICAL_SECTION winproc_cs; @@ -1032,6 +1038,21 @@ INT_PTR WINPROC_CallDlgProcW( DLGPROC func, HWND hwnd, UINT msg, WPARAM wParam, } +/*********************************************************************** + * Window procedures for builtin classes + */ + +static LRESULT WINAPI ButtonWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + return wow_handlers.button_proc( hwnd, msg, wParam, lParam, FALSE ); +} + +static LRESULT WINAPI ButtonWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + return wow_handlers.button_proc( hwnd, msg, wParam, lParam, TRUE ); +} + + /********************************************************************** * UserRegisterWowHandlers (USER32.@) *