Module: wine Branch: refs/heads/master Commit: 56220c246bbe86826c540c6508217eb5e6e62697 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=56220c246bbe86826c540c65...
Author: Alexandre Julliard julliard@winehq.org Date: Wed May 10 16:55:55 2006 +0200
user: Have WINPROC_GetProc16 allocate a new winproc if necessary.
---
dlls/user/class.c | 5 ++-- dlls/user/msg16.c | 2 +- dlls/user/win.c | 4 ++- dlls/user/winproc.c | 64 +++++++++++++++++++++++++++++---------------------- dlls/user/winproc.h | 2 +- dlls/user/wnd16.c | 3 +- 6 files changed, 43 insertions(+), 37 deletions(-)
diff --git a/dlls/user/class.c b/dlls/user/class.c index e9aec25..f1f82cf 100644 --- a/dlls/user/class.c +++ b/dlls/user/class.c @@ -151,9 +151,8 @@ static BOOL set_server_info( HWND hwnd, */ static WNDPROC16 CLASS_GetProc16( CLASS *classPtr ) { - WNDPROC proc = classPtr->winprocA; - if (!proc) proc = classPtr->winprocW; - return WINPROC_GetProc16( proc ); + if (classPtr->winprocA) return WINPROC_GetProc16( classPtr->winprocA, FALSE ); + else return WINPROC_GetProc16( classPtr->winprocW, TRUE ); }
diff --git a/dlls/user/msg16.c b/dlls/user/msg16.c index db3da01..e61fef3 100644 --- a/dlls/user/msg16.c +++ b/dlls/user/msg16.c @@ -369,7 +369,7 @@ LONG WINAPI DispatchMessage16( const MSG else SetLastError( ERROR_INVALID_WINDOW_HANDLE ); return 0; } - winproc = WINPROC_GetProc16( wndPtr->winproc ); + winproc = WINPROC_GetProc16( wndPtr->winproc, wndPtr->flags & WIN_ISUNICODE ); WIN_ReleasePtr( wndPtr );
SPY_EnterMessage( SPY_DISPATCHMESSAGE16, hwnd, msg->message, msg->wParam, msg->lParam ); diff --git a/dlls/user/win.c b/dlls/user/win.c index 5a785c5..d79cd03 100644 --- a/dlls/user/win.c +++ b/dlls/user/win.c @@ -2162,7 +2162,7 @@ LONG WINAPI GetWindowLong16( HWND16 hwnd } } retvalue = GetWindowLongA( WIN_Handle32(hwnd), offset ); - if (is_winproc) retvalue = (LONG_PTR)WINPROC_GetProc16( (WNDPROC)retvalue ); + if (is_winproc) retvalue = (LONG_PTR)WINPROC_GetProc16( (WNDPROC)retvalue, FALSE ); return retvalue; }
@@ -2212,7 +2212,7 @@ LONG WINAPI SetWindowLong16( HWND16 hwnd { WNDPROC new_proc = WINPROC_AllocProc16( (WNDPROC16)newval ); WNDPROC old_proc = (WNDPROC)SetWindowLongA( WIN_Handle32(hwnd), offset, (LONG_PTR)new_proc ); - return (LONG)WINPROC_GetProc16( (WNDPROC)old_proc ); + return (LONG)WINPROC_GetProc16( (WNDPROC)old_proc, FALSE ); } else return SetWindowLongA( WIN_Handle32(hwnd), offset, newval ); } diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c index ba01127..d01f137 100644 --- a/dlls/user/winproc.c +++ b/dlls/user/winproc.c @@ -144,8 +144,8 @@ static inline WINDOWPROC *find_winproc( return NULL; }
-/* allocate and initialize a new winproc */ -static inline WINDOWPROC *alloc_winproc(void) +/* initialize a new winproc */ +static inline WINDOWPROC *init_winproc(void) { WINDOWPROC *proc;
@@ -217,6 +217,36 @@ static inline WNDPROC proc_to_handle( WI return (WNDPROC)(ULONG_PTR)((proc - winproc_array) | (WINPROC_HANDLE << 16)); }
+/* allocate and initialize a new winproc */ +static inline WINDOWPROC *alloc_winproc( WNDPROC func, BOOL unicode ) +{ + WINDOWPROC *proc; + + if (!func) return NULL; + + /* check if the function is already a win proc */ + 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( func, unicode ))) + { + if ((proc = init_winproc())) + { + proc->type = unicode ? WIN_PROC_32W : WIN_PROC_32A; + proc->u.proc32 = func; + TRACE( "allocated %p for %p %c (%d/%d used)\n", + proc_to_handle(proc), func, unicode ? 'W' : 'A', winproc_used, MAX_WINPROCS ); + } + else FIXME( "too many winprocs, cannot allocate one for %p %c\n", func, unicode ? 'W' : 'A' ); + } + else TRACE( "reusing %p for %p %c\n", proc_to_handle(proc), func, unicode ? 'W' : 'A' ); + + LeaveCriticalSection( &winproc_cs ); + return proc; +} +
#ifdef __i386__ /* Some window procedures modify register they shouldn't, or are not @@ -456,9 +486,9 @@ static LRESULT WINAPI WINPROC_CallWndPro * * Get a window procedure pointer that can be passed to the Windows program. */ -WNDPROC16 WINPROC_GetProc16( WNDPROC proc ) +WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode ) { - WINDOWPROC *ptr = handle_to_proc( proc ); + WINDOWPROC *ptr = alloc_winproc( proc, unicode );
if (!ptr) return 0;
@@ -507,7 +537,7 @@ WNDPROC WINPROC_AllocProc16( WNDPROC16 f /* then check if we already have a winproc for that function */ if (!(proc = find_winproc16( func ))) { - if ((proc = alloc_winproc())) + if ((proc = init_winproc())) { proc->type = WIN_PROC_16; proc->u.proc16 = func; @@ -537,29 +567,7 @@ WNDPROC WINPROC_AllocProc( WNDPROC func, { WINDOWPROC *proc;
- if (!func) return NULL; - - /* check if the function is already a win proc */ - if (!(proc = handle_to_proc( func ))) - { - EnterCriticalSection( &winproc_cs ); - - /* then check if we already have a winproc for that function */ - if (!(proc = find_winproc( func, unicode ))) - { - if ((proc = alloc_winproc())) - { - proc->type = unicode ? WIN_PROC_32W : WIN_PROC_32A; - proc->u.proc32 = func; - TRACE( "allocated %p for %p %c (%d/%d used)\n", - proc_to_handle(proc), func, unicode ? 'W' : 'A', winproc_used, MAX_WINPROCS ); - } - else FIXME( "too many winprocs, cannot allocate one for %p %c\n", func, unicode ? 'W' : 'A' ); - } - else TRACE( "reusing %p for %p %c\n", proc_to_handle(proc), func, unicode ? 'W' : 'A' ); - - LeaveCriticalSection( &winproc_cs ); - } + if (!(proc = alloc_winproc( func, unicode ))) return NULL; return proc_to_handle( proc ); }
diff --git a/dlls/user/winproc.h b/dlls/user/winproc.h index 58943ba..12b9a25 100644 --- a/dlls/user/winproc.h +++ b/dlls/user/winproc.h @@ -44,7 +44,7 @@ typedef struct
struct tagWINDOWPROC;
-extern WNDPROC16 WINPROC_GetProc16( WNDPROC proc ); +extern WNDPROC16 WINPROC_GetProc16( WNDPROC proc, BOOL unicode ); extern WNDPROC WINPROC_AllocProc16( WNDPROC16 func ); extern WNDPROC WINPROC_GetProc( WNDPROC proc, BOOL unicode ); extern WNDPROC WINPROC_AllocProc( WNDPROC func, BOOL unicode ); diff --git a/dlls/user/wnd16.c b/dlls/user/wnd16.c index 327c956..5471f36 100644 --- a/dlls/user/wnd16.c +++ b/dlls/user/wnd16.c @@ -1357,8 +1357,7 @@ BOOL16 WINAPI GetClassInfoEx16( HINSTANC
if (ret) { - WNDPROC proc = WINPROC_AllocProc( wc32.lpfnWndProc, FALSE ); - wc->lpfnWndProc = WINPROC_GetProc16( proc ); + wc->lpfnWndProc = WINPROC_GetProc16( wc32.lpfnWndProc, FALSE ); wc->style = wc32.style; wc->cbClsExtra = wc32.cbClsExtra; wc->cbWndExtra = wc32.cbWndExtra;