Alexandre Julliard : user32: Make WINPROC_AllocProc take a unicode flag for consistency with the other winproc functions .

Alexandre Julliard julliard at winehq.org
Fri Dec 18 10:49:09 CST 2009


Module: wine
Branch: master
Commit: 77ab4354025cd5477c4f91a299deff5ff70bf8d1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=77ab4354025cd5477c4f91a299deff5ff70bf8d1

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Dec 18 12:41:59 2009 +0100

user32: Make WINPROC_AllocProc take a unicode flag for consistency with the other winproc functions.

---

 dlls/user32/class.c        |    7 +++----
 dlls/user32/controls.h     |    2 +-
 dlls/user32/message.c      |    4 ++--
 dlls/user32/msg16.c        |    5 +----
 dlls/user32/user_private.h |    2 +-
 dlls/user32/win.c          |    6 ++----
 dlls/user32/winproc.c      |   34 ++++++++++++++++------------------
 7 files changed, 26 insertions(+), 34 deletions(-)

diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 040f3c1..f7e0f25 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -551,7 +551,7 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
     classPtr->hIconSm       = wc->hIconSm;
     classPtr->hCursor       = wc->hCursor;
     classPtr->hbrBackground = wc->hbrBackground;
-    classPtr->winproc       = WINPROC_AllocProc( wc->lpfnWndProc, NULL );
+    classPtr->winproc       = WINPROC_AllocProc( wc->lpfnWndProc, FALSE );
     CLASS_SetMenuNameA( classPtr, wc->lpszMenuName );
     release_class_ptr( classPtr );
     return atom;
@@ -589,7 +589,7 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
     classPtr->hIconSm       = wc->hIconSm;
     classPtr->hCursor       = wc->hCursor;
     classPtr->hbrBackground = wc->hbrBackground;
-    classPtr->winproc       = WINPROC_AllocProc( NULL, wc->lpfnWndProc );
+    classPtr->winproc       = WINPROC_AllocProc( wc->lpfnWndProc, TRUE );
     CLASS_SetMenuNameW( classPtr, wc->lpszMenuName );
     release_class_ptr( classPtr );
     return atom;
@@ -903,8 +903,7 @@ static ULONG_PTR CLASS_SetClassLong( HWND hwnd, INT offset, LONG_PTR newval,
         break;
     case GCLP_WNDPROC:
         retval = (ULONG_PTR)WINPROC_GetProc( class->winproc, unicode );
-        class->winproc = WINPROC_AllocProc( unicode ? NULL : (WNDPROC)newval,
-                                            unicode ? (WNDPROC)newval : NULL );
+        class->winproc = WINPROC_AllocProc( (WNDPROC)newval, unicode );
         break;
     case GCLP_HBRBACKGROUND:
         retval = (ULONG_PTR)class->hbrBackground;
diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index f9a17e8..3bde456 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -110,7 +110,7 @@ struct wow_handlers32
     LRESULT (*scrollbar_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
     LRESULT (*static_proc)(HWND,UINT,WPARAM,LPARAM,BOOL);
     HWND    (*create_window)(CREATESTRUCTW*,LPCWSTR,HINSTANCE,UINT);
-    WNDPROC (*alloc_winproc)(WNDPROC,WNDPROC);
+    WNDPROC (*alloc_winproc)(WNDPROC,BOOL);
 };
 
 extern struct wow_handlers16 wow_handlers DECLSPEC_HIDDEN;
diff --git a/dlls/user32/message.c b/dlls/user32/message.c
index ffe7f76..d6fd5af 100644
--- a/dlls/user32/message.c
+++ b/dlls/user32/message.c
@@ -3589,7 +3589,7 @@ UINT_PTR WINAPI SetTimer( HWND hwnd, UINT_PTR id, UINT timeout, TIMERPROC proc )
     UINT_PTR ret;
     WNDPROC winproc = 0;
 
-    if (proc) winproc = WINPROC_AllocProc( (WNDPROC)proc, NULL );
+    if (proc) winproc = WINPROC_AllocProc( (WNDPROC)proc, FALSE );
 
     SERVER_START_REQ( set_win_timer )
     {
@@ -3620,7 +3620,7 @@ UINT_PTR WINAPI SetSystemTimer( HWND hwnd, UINT_PTR id, UINT timeout, TIMERPROC
     UINT_PTR ret;
     WNDPROC winproc = 0;
 
-    if (proc) winproc = WINPROC_AllocProc( (WNDPROC)proc, NULL );
+    if (proc) winproc = WINPROC_AllocProc( (WNDPROC)proc, FALSE );
 
     SERVER_START_REQ( set_win_timer )
     {
diff --git a/dlls/user32/msg16.c b/dlls/user32/msg16.c
index 0e57988..c3365e8 100644
--- a/dlls/user32/msg16.c
+++ b/dlls/user32/msg16.c
@@ -231,10 +231,7 @@ done:
  */
 WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode )
 {
-    WNDPROC winproc;
-
-    if (unicode) winproc = wow_handlers32.alloc_winproc( NULL, proc );
-    else winproc = wow_handlers32.alloc_winproc( proc, NULL );
+    WNDPROC winproc = wow_handlers32.alloc_winproc( proc, unicode );
 
     if ((ULONG_PTR)winproc >> 16 != WINPROC_HANDLE) return (WNDPROC16)winproc;
     return alloc_win16_thunk( winproc );
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index e5db691..fc92f25 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -239,7 +239,7 @@ typedef LRESULT (*winproc_callback16_t)( HWND16 hwnd, UINT16 msg, WPARAM16 wp, L
 extern WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode ) DECLSPEC_HIDDEN;
 extern WNDPROC WINPROC_AllocProc16( WNDPROC16 func ) DECLSPEC_HIDDEN;
 extern WNDPROC WINPROC_GetProc( WNDPROC proc, BOOL unicode ) DECLSPEC_HIDDEN;
-extern WNDPROC WINPROC_AllocProc( WNDPROC funcA, WNDPROC funcW ) DECLSPEC_HIDDEN;
+extern WNDPROC WINPROC_AllocProc( WNDPROC func, BOOL unicode ) DECLSPEC_HIDDEN;
 extern BOOL WINPROC_IsUnicode( WNDPROC proc, BOOL def_val ) DECLSPEC_HIDDEN;
 
 extern LRESULT WINPROC_CallProcAtoW( winproc_callback_t callback, HWND hwnd, UINT msg,
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 9712beb..7834501 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -2099,8 +2099,7 @@ LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, UINT size, LONG_PTR newval, B
         WNDPROC proc;
         UINT old_flags = wndPtr->flags;
         retval = WIN_GetWindowLong( hwnd, offset, size, unicode );
-        if (unicode) proc = WINPROC_AllocProc( NULL, (WNDPROC)newval );
-        else proc = WINPROC_AllocProc( (WNDPROC)newval, NULL );
+        proc = WINPROC_AllocProc( (WNDPROC)newval, unicode );
         if (proc) wndPtr->winproc = proc;
         if (WINPROC_IsUnicode( proc, unicode )) wndPtr->flags |= WIN_ISUNICODE;
         else wndPtr->flags &= ~WIN_ISUNICODE;
@@ -2122,8 +2121,7 @@ LONG_PTR WIN_SetWindowLong( HWND hwnd, INT offset, UINT size, LONG_PTR newval, B
         {
             WNDPROC *ptr = (WNDPROC *)((char *)wndPtr->wExtra + DWLP_DLGPROC);
             retval = (ULONG_PTR)WINPROC_GetProc( *ptr, unicode );
-            if (unicode) *ptr = WINPROC_AllocProc( NULL, (WNDPROC)newval );
-            else *ptr = WINPROC_AllocProc( (WNDPROC)newval, NULL );
+            *ptr = WINPROC_AllocProc( (WNDPROC)newval, unicode );
             WIN_ReleasePtr( wndPtr );
             return retval;
         }
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c
index 7bdb91d..36f8279 100644
--- a/dlls/user32/winproc.c
+++ b/dlls/user32/winproc.c
@@ -104,21 +104,20 @@ static inline void free_buffer( void *static_buffer, void *buffer )
 
 /* find an existing winproc for a given function and type */
 /* FIXME: probably should do something more clever than a linear search */
-static inline WINDOWPROC *find_winproc( WNDPROC funcA, WNDPROC funcW )
+static inline WINDOWPROC *find_winproc( WNDPROC func, BOOL unicode )
 {
     unsigned int i;
 
     for (i = 0; i < NB_BUILTIN_AW_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;
+        if (winproc_array[i].procA != func && winproc_array[i].procW != func) continue;
         return &winproc_array[i];
     }
     for (i = NB_BUILTIN_AW_WINPROCS; i < winproc_used; i++)
     {
-        if (funcA && winproc_array[i].procA != funcA) continue;
-        if (funcW && winproc_array[i].procW != funcW) continue;
+        if (!unicode && winproc_array[i].procA != func) continue;
+        if (unicode && winproc_array[i].procW != func) continue;
         return &winproc_array[i];
     }
     return NULL;
@@ -142,32 +141,31 @@ static inline WNDPROC proc_to_handle( WINDOWPROC *proc )
 }
 
 /* allocate and initialize a new winproc */
-static inline WINDOWPROC *alloc_winproc( WNDPROC funcA, WNDPROC funcW )
+static inline WINDOWPROC *alloc_winproc( WNDPROC func, BOOL unicode )
 {
     WINDOWPROC *proc;
 
     /* check if the function is already a win proc */
-    if (funcA && (proc = handle_to_proc( funcA ))) return proc;
-    if (funcW && (proc = handle_to_proc( funcW ))) return proc;
-    if (!funcA && !funcW) return NULL;
+    if (!func) return NULL;
+    if ((proc = handle_to_proc( func ))) return proc;
 
     EnterCriticalSection( &winproc_cs );
 
     /* check if we already have a winproc for that function */
-    if (!(proc = find_winproc( funcA, funcW )))
+    if (!(proc = find_winproc( func, unicode )))
     {
         if (winproc_used < MAX_WINPROCS)
         {
             proc = &winproc_array[winproc_used++];
-            proc->procA = funcA;
-            proc->procW = funcW;
+            if (unicode) proc->procW = func;
+            else proc->procA = func;
             TRACE( "allocated %p for %c %p (%d/%d used)\n",
-                   proc_to_handle(proc), funcA ? 'A' : 'W', funcA ? funcA : funcW,
+                   proc_to_handle(proc), unicode ? 'W' : 'A', func,
                    winproc_used, MAX_WINPROCS );
         }
-        else FIXME( "too many winprocs, cannot allocate one for %p/%p\n", funcA, funcW );
+        else FIXME( "too many winprocs, cannot allocate one for %p\n", func );
     }
-    else TRACE( "reusing %p for %p/%p\n", proc_to_handle(proc), funcA, funcW );
+    else TRACE( "reusing %p for %p\n", proc_to_handle(proc), func );
 
     LeaveCriticalSection( &winproc_cs );
     return proc;
@@ -304,12 +302,12 @@ WNDPROC WINPROC_GetProc( WNDPROC proc, BOOL unicode )
  * lot of windows, it will usually only have a limited number of window procedures, so the
  * array won't grow too large, and this way we avoid the need to track allocations per window.
  */
-WNDPROC WINPROC_AllocProc( WNDPROC funcA, WNDPROC funcW )
+WNDPROC WINPROC_AllocProc( WNDPROC func, BOOL unicode )
 {
     WINDOWPROC *proc;
 
-    if (!(proc = alloc_winproc( funcA, funcW ))) return NULL;
-    if (proc == WINPROC_PROC16) return funcA ? funcA : funcW;
+    if (!(proc = alloc_winproc( func, unicode ))) return NULL;
+    if (proc == WINPROC_PROC16) return func;
     return proc_to_handle( proc );
 }
 




More information about the wine-cvs mailing list