Take advantage of the new winproc handling to move some more functions

to 16-bit files.
TIMER_IsTimerValid is no longer necessary now that winprocs are never
freed.
This commit is contained in:
Alexandre Julliard 2004-11-28 15:10:28 +00:00
parent 675f701dbd
commit 7469973023
6 changed files with 146 additions and 214 deletions

View File

@ -260,17 +260,9 @@ LONG WINAPI DispatchMessage16( const MSG16* msg )
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
{
if (msg->lParam)
{
/* before calling window proc, verify whether timer is still valid;
there's a slim chance that the application kills the timer
between GetMessage and DispatchMessage API calls */
if (!TIMER_IsTimerValid(hwnd, (UINT) msg->wParam, (WNDPROC)msg->lParam))
return 0; /* invalid winproc */
return CallWindowProc16( (WNDPROC16)msg->lParam, msg->hwnd,
msg->message, msg->wParam, GetTickCount() );
}
}
if (!(wndPtr = WIN_GetPtr( hwnd )))
{

View File

@ -132,6 +132,5 @@ extern void CLASS_FreeModuleClasses( HMODULE16 hModule );
/* Timer functions */
extern void TIMER_RemoveWindowTimers( HWND hwnd );
extern void TIMER_RemoveThreadTimers(void);
extern BOOL TIMER_IsTimerValid( HWND hwnd, UINT_PTR id, WNDPROC proc );
#endif /* __WINE_WINPROC_H */

View File

@ -22,6 +22,7 @@
#include "wownt32.h"
#include "user.h"
#include "win.h"
#include "winproc.h"
#include "stackframe.h"
/* handle <--> handle16 conversions */
@ -67,6 +68,26 @@ INT16 WINAPI MessageBox16( HWND16 hwnd, LPCSTR text, LPCSTR title, UINT16 type )
}
/***********************************************************************
* SetTimer (USER.10)
*/
UINT16 WINAPI SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, TIMERPROC16 proc )
{
TIMERPROC proc32 = (TIMERPROC)WINPROC_AllocProc( (WNDPROC)proc, WIN_PROC_16 );
return SetTimer( WIN_Handle32(hwnd), id, timeout, proc32 );
}
/***********************************************************************
* SetSystemTimer (USER.11)
*/
UINT16 WINAPI SetSystemTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout, TIMERPROC16 proc )
{
TIMERPROC proc32 = (TIMERPROC)WINPROC_AllocProc( (WNDPROC)proc, WIN_PROC_16 );
return SetSystemTimer( WIN_Handle32(hwnd), id, timeout, proc32 );
}
/**************************************************************************
* KillTimer (USER.12)
*/
@ -413,6 +434,29 @@ BOOL16 WINAPI MoveWindow16( HWND16 hwnd, INT16 x, INT16 y, INT16 cx, INT16 cy, B
}
/***********************************************************************
* RegisterClass (USER.57)
*/
ATOM WINAPI RegisterClass16( const WNDCLASS16 *wc )
{
WNDCLASSEX16 wcex;
wcex.cbSize = sizeof(wcex);
wcex.style = wc->style;
wcex.lpfnWndProc = wc->lpfnWndProc;
wcex.cbClsExtra = wc->cbClsExtra;
wcex.cbWndExtra = wc->cbWndExtra;
wcex.hInstance = wc->hInstance;
wcex.hIcon = wc->hIcon;
wcex.hCursor = wc->hCursor;
wcex.hbrBackground = wc->hbrBackground;
wcex.lpszMenuName = wc->lpszMenuName;
wcex.lpszClassName = wc->lpszClassName;
wcex.hIconSm = 0;
return RegisterClassEx16( &wcex );
}
/**************************************************************************
* GetClassName (USER.58)
*/
@ -1270,6 +1314,66 @@ BOOL16 WINAPI SetWindowPlacement16( HWND16 hwnd, const WINDOWPLACEMENT16 *wp16 )
}
/***********************************************************************
* RegisterClassEx (USER.397)
*/
ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
{
WNDCLASSEXA wc32;
wc32.cbSize = sizeof(wc32);
wc32.style = wc->style;
wc32.lpfnWndProc = WINPROC_AllocProc( (WNDPROC)wc->lpfnWndProc, WIN_PROC_16 );
wc32.cbClsExtra = wc->cbClsExtra;
wc32.cbWndExtra = wc->cbWndExtra;
wc32.hInstance = HINSTANCE_32(GetExePtr(wc->hInstance));
if (!wc32.hInstance) wc32.hInstance = HINSTANCE_32(GetModuleHandle16(NULL));
wc32.hIcon = HICON_32(wc->hIcon);
wc32.hCursor = HCURSOR_32(wc->hCursor);
wc32.hbrBackground = HBRUSH_32(wc->hbrBackground);
wc32.lpszMenuName = MapSL(wc->lpszMenuName);
wc32.lpszClassName = MapSL(wc->lpszClassName);
wc32.hIconSm = HICON_32(wc->hIconSm);
return RegisterClassExA( &wc32 );
}
/***********************************************************************
* GetClassInfoEx (USER.398)
*
* FIXME: this is just a guess, I have no idea if GetClassInfoEx() is the
* same in Win16 as in Win32. --AJ
*/
BOOL16 WINAPI GetClassInfoEx16( HINSTANCE16 hInst16, SEGPTR name, WNDCLASSEX16 *wc )
{
WNDCLASSEXA wc32;
HINSTANCE hInstance;
BOOL ret;
if (hInst16 == GetModuleHandle16("user")) hInstance = user32_module;
else hInstance = HINSTANCE_32(GetExePtr( hInst16 ));
ret = GetClassInfoExA( hInstance, MapSL(name), &wc32 );
if (ret)
{
WNDPROC proc = WINPROC_AllocProc( wc32.lpfnWndProc, WIN_PROC_32A );
wc->lpfnWndProc = WINPROC_GetProc( proc, WIN_PROC_16 );
wc->style = wc32.style;
wc->cbClsExtra = wc32.cbClsExtra;
wc->cbWndExtra = wc32.cbWndExtra;
wc->hInstance = (wc32.hInstance == user32_module) ? GetModuleHandle16("user") : HINSTANCE_16(wc32.hInstance);
wc->hIcon = HICON_16(wc32.hIcon);
wc->hIconSm = HICON_16(wc32.hIconSm);
wc->hCursor = HCURSOR_16(wc32.hCursor);
wc->hbrBackground = HBRUSH_16(wc32.hbrBackground);
wc->lpszClassName = 0;
wc->lpszMenuName = MapLS(wc32.lpszMenuName); /* FIXME: leak */
}
return ret;
}
/**************************************************************************
* ChildWindowFromPointEx (USER.399)
*/
@ -1296,6 +1400,41 @@ INT16 WINAPI GetPriorityClipboardFormat16( UINT16 *list, INT16 count )
}
/***********************************************************************
* UnregisterClass (USER.403)
*/
BOOL16 WINAPI UnregisterClass16( LPCSTR className, HINSTANCE16 hInstance )
{
if (hInstance == GetModuleHandle16("user")) hInstance = 0;
return UnregisterClassA( className, HINSTANCE_32(GetExePtr( hInstance )) );
}
/***********************************************************************
* GetClassInfo (USER.404)
*/
BOOL16 WINAPI GetClassInfo16( HINSTANCE16 hInst16, SEGPTR name, WNDCLASS16 *wc )
{
WNDCLASSEX16 wcex;
UINT16 ret = GetClassInfoEx16( hInst16, name, &wcex );
if (ret)
{
wc->style = wcex.style;
wc->lpfnWndProc = wcex.lpfnWndProc;
wc->cbClsExtra = wcex.cbClsExtra;
wc->cbWndExtra = wcex.cbWndExtra;
wc->hInstance = wcex.hInstance;
wc->hIcon = wcex.hIcon;
wc->hCursor = wcex.hCursor;
wc->hbrBackground = wcex.hbrBackground;
wc->lpszMenuName = wcex.lpszMenuName;
wc->lpszClassName = wcex.lpszClassName;
}
return ret;
}
/**************************************************************************
* TrackPopupMenu (USER.416)
*/

View File

@ -27,13 +27,11 @@
#include <stdlib.h>
#include <string.h>
#include "wine/winbase16.h"
#include "winerror.h"
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "wine/winuser16.h"
#include "wownt32.h"
#include "wine/unicode.h"
#include "win.h"
#include "user.h"
@ -514,29 +512,6 @@ void CLASS_AddWindow( CLASS *class, WND *win, WINDOWPROCTYPE type )
}
/***********************************************************************
* RegisterClass (USER.57)
*/
ATOM WINAPI RegisterClass16( const WNDCLASS16 *wc )
{
WNDCLASSEX16 wcex;
wcex.cbSize = sizeof(wcex);
wcex.style = wc->style;
wcex.lpfnWndProc = wc->lpfnWndProc;
wcex.cbClsExtra = wc->cbClsExtra;
wcex.cbWndExtra = wc->cbWndExtra;
wcex.hInstance = wc->hInstance;
wcex.hIcon = wc->hIcon;
wcex.hCursor = wc->hCursor;
wcex.hbrBackground = wc->hbrBackground;
wcex.lpszMenuName = wc->lpszMenuName;
wcex.lpszClassName = wc->lpszClassName;
wcex.hIconSm = 0;
return RegisterClassEx16( &wcex );
}
/***********************************************************************
* RegisterClassA (USER32.@)
* RETURNS
@ -586,40 +561,6 @@ ATOM WINAPI RegisterClassW( const WNDCLASSW* wc )
}
/***********************************************************************
* RegisterClassEx (USER.397)
*/
ATOM WINAPI RegisterClassEx16( const WNDCLASSEX16 *wc )
{
ATOM atom;
CLASS *classPtr;
HINSTANCE hInstance;
if (!(hInstance = HINSTANCE_32(GetExePtr(wc->hInstance))))
hInstance = HINSTANCE_32(GetModuleHandle16(NULL));
if (!(atom = GlobalAddAtomA( MapSL(wc->lpszClassName) ))) return 0;
if (!(classPtr = CLASS_RegisterClass( atom, hInstance, !(wc->style & CS_GLOBALCLASS),
wc->style, wc->cbClsExtra, wc->cbWndExtra )))
return 0;
TRACE("atom=%04x wndproc=%p hinst=%p bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
atom, wc->lpfnWndProc, hInstance,
wc->hbrBackground, wc->style, wc->cbClsExtra,
wc->cbWndExtra, classPtr );
classPtr->hIcon = HICON_32(wc->hIcon);
classPtr->hIconSm = HICON_32(wc->hIconSm);
classPtr->hCursor = HCURSOR_32(wc->hCursor);
classPtr->hbrBackground = HBRUSH_32(wc->hbrBackground);
classPtr->winprocA = WINPROC_AllocProc( (WNDPROC)wc->lpfnWndProc, WIN_PROC_16 );
CLASS_SetMenuNameA( classPtr, MapSL(wc->lpszMenuName) );
release_class_ptr( classPtr );
return atom;
}
/***********************************************************************
* RegisterClassExA (USER32.@)
*/
@ -696,15 +637,6 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
}
/***********************************************************************
* UnregisterClass (USER.403)
*/
BOOL16 WINAPI UnregisterClass16( LPCSTR className, HINSTANCE16 hInstance )
{
if (hInstance == GetModuleHandle16("user")) hInstance = 0;
return UnregisterClassA( className, HINSTANCE_32(GetExePtr( hInstance )) );
}
/***********************************************************************
* UnregisterClassA (USER32.@)
*/
@ -1168,31 +1100,6 @@ UINT WINAPI RealGetWindowClassW( HWND hwnd, LPWSTR buffer, UINT count )
}
/***********************************************************************
* GetClassInfo (USER.404)
*/
BOOL16 WINAPI GetClassInfo16( HINSTANCE16 hInst16, SEGPTR name, WNDCLASS16 *wc )
{
WNDCLASSEX16 wcex;
UINT16 ret = GetClassInfoEx16( hInst16, name, &wcex );
if (ret)
{
wc->style = wcex.style;
wc->lpfnWndProc = wcex.lpfnWndProc;
wc->cbClsExtra = wcex.cbClsExtra;
wc->cbWndExtra = wcex.cbWndExtra;
wc->hInstance = wcex.hInstance;
wc->hIcon = wcex.hIcon;
wc->hCursor = wcex.hCursor;
wc->hbrBackground = wcex.hbrBackground;
wc->lpszMenuName = wcex.lpszMenuName;
wc->lpszClassName = wcex.lpszClassName;
}
return ret;
}
/***********************************************************************
* GetClassInfoA (USER32.@)
*/
@ -1243,43 +1150,6 @@ BOOL WINAPI GetClassInfoW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSW *wc )
}
/***********************************************************************
* GetClassInfoEx (USER.398)
*
* FIXME: this is just a guess, I have no idea if GetClassInfoEx() is the
* same in Win16 as in Win32. --AJ
*/
BOOL16 WINAPI GetClassInfoEx16( HINSTANCE16 hInst16, SEGPTR name, WNDCLASSEX16 *wc )
{
ATOM atom = HIWORD(name) ? GlobalFindAtomA( MapSL(name) ) : LOWORD(name);
CLASS *classPtr;
HINSTANCE hInstance;
if (hInst16 == GetModuleHandle16("user")) hInstance = user32_module;
else hInstance = HINSTANCE_32(GetExePtr( hInst16 ));
TRACE("%p %s %x %p\n", hInstance, debugstr_a( MapSL(name) ), atom, wc);
if (!atom || !(classPtr = CLASS_FindClassByAtom( atom, hInstance ))) return FALSE;
wc->style = classPtr->style;
wc->lpfnWndProc = CLASS_GetProc( classPtr, WIN_PROC_16 );
wc->cbClsExtra = (INT16)classPtr->cbClsExtra;
wc->cbWndExtra = (INT16)classPtr->cbWndExtra;
wc->hInstance = (classPtr->hInstance == user32_module) ? GetModuleHandle16("user") : HINSTANCE_16(classPtr->hInstance);
wc->hIcon = HICON_16(classPtr->hIcon);
wc->hIconSm = HICON_16(classPtr->hIconSm);
wc->hCursor = HCURSOR_16(classPtr->hCursor);
wc->hbrBackground = HBRUSH_16(classPtr->hbrBackground);
wc->lpszClassName = (SEGPTR)0;
wc->lpszMenuName = CLASS_GetMenuName16( classPtr );
wc->lpszClassName = name;
release_class_ptr( classPtr );
/* We must return the atom of the class here instead of just TRUE. */
return atom;
}
/***********************************************************************
* GetClassInfoExA (USER32.@)
*/

View File

@ -757,13 +757,6 @@ LONG WINAPI DispatchMessageA( const MSG* msg )
if (msg->lParam)
{
/* HOOK_CallHooks32A( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
/* before calling window proc, verify whether timer is still valid;
there's a slim chance that the application kills the timer
between GetMessage and DispatchMessage API calls */
if (!TIMER_IsTimerValid(msg->hwnd, (UINT) msg->wParam, (WNDPROC)msg->lParam))
return 0; /* invalid winproc */
return CallWindowProcA( (WNDPROC)msg->lParam, msg->hwnd,
msg->message, msg->wParam, GetTickCount() );
}
@ -835,13 +828,6 @@ LONG WINAPI DispatchMessageW( const MSG* msg )
if (msg->lParam)
{
/* HOOK_CallHooks32W( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */
/* before calling window proc, verify whether timer is still valid;
there's a slim chance that the application kills the timer
between GetMessage and DispatchMessage API calls */
if (!TIMER_IsTimerValid(msg->hwnd, (UINT) msg->wParam, (WNDPROC)msg->lParam))
return 0; /* invalid winproc */
return CallWindowProcW( (WNDPROC)msg->lParam, msg->hwnd,
msg->message, msg->wParam, GetTickCount() );
}

View File

@ -46,7 +46,6 @@ typedef struct tagTIMER
UINT msg; /* WM_TIMER or WM_SYSTIMER */
UINT id;
UINT timeout;
WNDPROC proc;
} TIMER;
#define NB_TIMERS 34
@ -123,8 +122,7 @@ void TIMER_RemoveThreadTimers(void)
/***********************************************************************
* TIMER_SetTimer
*/
static UINT_PTR TIMER_SetTimer( HWND hwnd, UINT_PTR id, UINT timeout,
WNDPROC proc, WINDOWPROCTYPE type, BOOL sys )
static UINT_PTR TIMER_SetTimer( HWND hwnd, UINT_PTR id, UINT timeout, TIMERPROC proc, BOOL sys )
{
int i;
TIMER * pTimer;
@ -171,7 +169,7 @@ static UINT_PTR TIMER_SetTimer( HWND hwnd, UINT_PTR id, UINT timeout,
if (!hwnd) id = i + 1;
if (proc) winproc = WINPROC_AllocProc( proc, type );
if (proc) winproc = WINPROC_AllocProc( (WNDPROC)proc, WIN_PROC_32A );
SERVER_START_REQ( set_win_timer )
{
@ -191,10 +189,9 @@ static UINT_PTR TIMER_SetTimer( HWND hwnd, UINT_PTR id, UINT timeout,
pTimer->msg = sys ? WM_SYSTIMER : WM_TIMER;
pTimer->id = id;
pTimer->timeout = timeout;
pTimer->proc = winproc;
TRACE("Timer added: %p, %p, %04x, %04x, %p\n",
pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, pTimer->proc );
pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, winproc );
LeaveCriticalSection( &csTimer );
@ -247,74 +244,23 @@ static BOOL TIMER_KillTimer( HWND hwnd, UINT_PTR id, BOOL sys )
}
/***********************************************************************
* SetTimer (USER.10)
*/
UINT16 WINAPI SetTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout,
TIMERPROC16 proc )
{
TRACE("%04x %d %d %08lx\n",
hwnd, id, timeout, (LONG)proc );
return TIMER_SetTimer( WIN_Handle32(hwnd), id, timeout, (WNDPROC)proc,
WIN_PROC_16, FALSE );
}
/***********************************************************************
* SetTimer (USER32.@)
*/
UINT_PTR WINAPI SetTimer( HWND hwnd, UINT_PTR id, UINT timeout,
TIMERPROC proc )
UINT_PTR WINAPI SetTimer( HWND hwnd, UINT_PTR id, UINT timeout, TIMERPROC proc )
{
TRACE("%p %d %d %p\n", hwnd, id, timeout, proc );
return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC)proc, WIN_PROC_32A, FALSE );
}
/***********************************************************************
* TIMER_IsTimerValid
*/
BOOL TIMER_IsTimerValid( HWND hwnd, UINT_PTR id, WNDPROC proc )
{
int i;
TIMER *pTimer;
BOOL ret = FALSE;
hwnd = WIN_GetFullHandle( hwnd );
EnterCriticalSection( &csTimer );
for (i = 0, pTimer = TimersArray; i < NB_TIMERS; i++, pTimer++)
if ((pTimer->hwnd == hwnd) && (pTimer->id == id) && (pTimer->proc == proc))
{
ret = TRUE;
break;
}
LeaveCriticalSection( &csTimer );
return ret;
}
/***********************************************************************
* SetSystemTimer (USER.11)
*/
UINT16 WINAPI SetSystemTimer16( HWND16 hwnd, UINT16 id, UINT16 timeout,
TIMERPROC16 proc )
{
TRACE("%04x %d %d %08lx\n",
hwnd, id, timeout, (LONG)proc );
return TIMER_SetTimer( WIN_Handle32(hwnd), id, timeout, (WNDPROC)proc, WIN_PROC_16, TRUE );
return TIMER_SetTimer( hwnd, id, timeout, proc, FALSE );
}
/***********************************************************************
* SetSystemTimer (USER32.@)
*/
UINT_PTR WINAPI SetSystemTimer( HWND hwnd, UINT_PTR id, UINT timeout,
TIMERPROC proc )
UINT_PTR WINAPI SetSystemTimer( HWND hwnd, UINT_PTR id, UINT timeout, TIMERPROC proc )
{
TRACE("%p %d %d %p\n", hwnd, id, timeout, proc );
return TIMER_SetTimer( hwnd, id, timeout, (WNDPROC)proc, WIN_PROC_32A, TRUE );
return TIMER_SetTimer( hwnd, id, timeout, proc, TRUE );
}