Alexandre Julliard : user32: Pre-allocate the window procedure for DefWindowProc.
Alexandre Julliard
julliard at winehq.org
Thu Dec 17 10:37:11 CST 2009
Module: wine
Branch: master
Commit: 1b2ea8b2e9b4ed9c0a185aafefa83ecb394ac06d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1b2ea8b2e9b4ed9c0a185aafefa83ecb394ac06d
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Dec 17 13:01:42 2009 +0100
user32: Pre-allocate the window procedure for DefWindowProc.
---
dlls/user32/class.c | 3 ---
dlls/user32/controls.h | 1 +
dlls/user32/winproc.c | 20 +++++---------------
3 files changed, 6 insertions(+), 18 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 3c211db..e8ca0e5 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -423,9 +423,6 @@ void CLASS_RegisterBuiltinClasses(void)
register_builtin( &MESSAGE_builtin_class );
register_builtin( &SCROLL_builtin_class );
register_builtin( &STATIC_builtin_class );
-
- /* the DefWindowProc winprocs are magic too */
- WINPROC_AllocProc( DefWindowProcA, DefWindowProcW );
}
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 2df4f45..9abc997 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -35,6 +35,7 @@ enum builtin_winprocs
{
WINPROC_BUTTON = 0,
WINPROC_COMBO,
+ WINPROC_DEFWND,
WINPROC_DIALOG,
WINPROC_EDIT,
WINPROC_LISTBOX,
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index d71dca2..5bfd407 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -45,7 +45,6 @@ typedef struct tagWINDOWPROC
} WINDOWPROC;
#define MAX_WINPROCS 4096
-#define BUILTIN_WINPROCS 9 /* first BUILTIN_WINPROCS entries are reserved for builtin procs */
#define MAX_WINPROC_RECURSION 64
#define WINPROC_PROC16 ((WINDOWPROC *)1) /* placeholder for 16-bit window procs */
@@ -68,6 +67,7 @@ static WINDOWPROC winproc_array[MAX_WINPROCS] =
{
{ ButtonWndProcA, ButtonWndProcW }, /* WINPROC_BUTTON */
{ ComboWndProcA, ComboWndProcW }, /* WINPROC_COMBO */
+ { DefWindowProcA, DefWindowProcW }, /* WINPROC_DEFWND */
{ DefDlgProcA, DefDlgProcW }, /* WINPROC_DIALOG */
{ EditWndProcA, EditWndProcW }, /* WINPROC_EDIT */
{ ListBoxWndProcA, ListBoxWndProcW }, /* WINPROC_LISTBOX */
@@ -76,8 +76,7 @@ static WINDOWPROC winproc_array[MAX_WINPROCS] =
{ StaticWndProcA, StaticWndProcW }, /* WINPROC_STATIC */
};
-static UINT builtin_used = NB_BUILTIN_WINPROCS;
-static UINT winproc_used = BUILTIN_WINPROCS;
+static UINT winproc_used = NB_BUILTIN_WINPROCS;
static CRITICAL_SECTION winproc_cs;
static CRITICAL_SECTION_DEBUG critsect_debug =
@@ -105,14 +104,14 @@ static inline WINDOWPROC *find_winproc( WNDPROC funcA, WNDPROC funcW )
{
unsigned int i;
- for (i = 0; i < builtin_used; i++)
+ for (i = 0; i < NB_BUILTIN_WINPROCS; i++)
{
/* match either proc, some apps confuse A and W */
if (funcA && winproc_array[i].procA != funcA && winproc_array[i].procW != funcA) continue;
if (funcW && winproc_array[i].procA != funcW && winproc_array[i].procW != funcW) continue;
return &winproc_array[i];
}
- for (i = BUILTIN_WINPROCS; i < winproc_used; i++)
+ for (i = NB_BUILTIN_WINPROCS; i < winproc_used; i++)
{
if (funcA && winproc_array[i].procA != funcA) continue;
if (funcW && winproc_array[i].procW != funcW) continue;
@@ -153,16 +152,7 @@ static inline WINDOWPROC *alloc_winproc( WNDPROC funcA, WNDPROC funcW )
/* check if we already have a winproc for that function */
if (!(proc = find_winproc( funcA, funcW )))
{
- if (funcA && funcW)
- {
- assert( builtin_used < BUILTIN_WINPROCS );
- proc = &winproc_array[builtin_used++];
- proc->procA = funcA;
- proc->procW = funcW;
- TRACE( "allocated %p for builtin %p/%p (%d/%d used)\n",
- proc_to_handle(proc), funcA, funcW, builtin_used, BUILTIN_WINPROCS );
- }
- else if (winproc_used < MAX_WINPROCS)
+ if (winproc_used < MAX_WINPROCS)
{
proc = &winproc_array[winproc_used++];
proc->procA = funcA;
More information about the wine-cvs
mailing list