Make WIN_WindowFromPoint take a POINT instead of a POINT16.

Small bug fix in scope window handling.
Always check for message when QS_SENDMESSAGE is set.
This commit is contained in:
Alexandre Julliard 2001-05-22 19:55:20 +00:00
parent 30975c0c90
commit 5db8d2f48b
3 changed files with 29 additions and 36 deletions

View File

@ -38,7 +38,7 @@ extern LONG WINPOS_SendNCCalcSize(HWND hwnd, BOOL calcValidRect,
RECT *newClientRect );
extern LONG WINPOS_HandleWindowPosChanging16(struct tagWND *wndPtr, struct tagWINDOWPOS16 *winpos);
extern LONG WINPOS_HandleWindowPosChanging(struct tagWND *wndPtr, WINDOWPOS *winpos);
extern INT16 WINPOS_WindowFromPoint( struct tagWND* scopeWnd, POINT16 pt, struct tagWND **ppWnd );
extern INT16 WINPOS_WindowFromPoint( struct tagWND* scopeWnd, POINT pt, struct tagWND **ppWnd );
extern void WINPOS_CheckInternalPos( struct tagWND* wndPtr );
extern BOOL WINPOS_ActivateOtherWindow(struct tagWND* pWnd);
extern BOOL WINPOS_CreateInternalPosAtom(void);

View File

@ -11,6 +11,7 @@
#include <sys/types.h>
#include "wine/winbase16.h"
#include "wine/winuser16.h"
#include "message.h"
#include "winerror.h"
#include "server.h"
@ -26,9 +27,7 @@
#include "user.h"
#include "thread.h"
#include "task.h"
#include "options.h"
#include "controls.h"
#include "struct32.h"
#include "debugtools.h"
DEFAULT_DEBUG_CHANNEL(msg);
@ -114,7 +113,7 @@ static DWORD MSG_TranslateMouseMsg( HWND hTopWnd, DWORD first, DWORD last,
HWND hWnd;
INT16 ht, hittest;
UINT message = msg->message;
POINT16 pt;
POINT pt = msg->pt;
HANDLE16 hQ = GetFastQueue16();
MESSAGEQUEUE *queue = QUEUE_Lock(hQ);
int mouseClick = ((message == WM_LBUTTONDOWN) ||
@ -124,8 +123,6 @@ static DWORD MSG_TranslateMouseMsg( HWND hTopWnd, DWORD first, DWORD last,
/* Find the window to dispatch this mouse message to */
CONV_POINT32TO16( &msg->pt, &pt );
hWnd = GetCapture();
/* If no capture HWND, find window which contains the mouse position.
@ -194,7 +191,7 @@ static DWORD MSG_TranslateMouseMsg( HWND hTopWnd, DWORD first, DWORD last,
}
}
/* save mouse position */
CONV_POINT16TO32( &pt, screen_pt );
*screen_pt = pt;
if (hittest != HTCLIENT)
{
@ -202,7 +199,7 @@ static DWORD MSG_TranslateMouseMsg( HWND hTopWnd, DWORD first, DWORD last,
msg->wParam = hittest;
}
else
ScreenToClient16( hWnd, &pt );
ScreenToClient( hWnd, &pt );
/* check message filter */
@ -604,8 +601,7 @@ static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, DWORD first, DWORD last,
if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST))
{
HWND hWndScope = (HWND)qmsg->extraInfo;
WND *tmpWnd = (Options.managed && IsWindow(hWndScope) )
? WIN_FindWndPtr(hWndScope) : WIN_GetDesktop();
WND *tmpWnd = IsWindow(hWndScope) ? WIN_FindWndPtr(hWndScope) : WIN_GetDesktop();
status = MSG_TranslateMouseMsg(hwnd, first, last, msg, remove, tmpWnd,
&hittest, &screen_pt, &mouseClick );
@ -1025,7 +1021,7 @@ static BOOL MSG_PeekMessage( int type, LPMSG msg_out, HWND hwnd,
/* Now find a normal message */
retry:
if (wakeBits & (QS_POSTMESSAGE|QS_TIMER|QS_PAINT))
if (wakeBits & (QS_SENDMESSAGE|QS_POSTMESSAGE|QS_TIMER|QS_PAINT))
{
QMSG qmsg;
if (QUEUE_FindMsg( hwnd, first, last, flags & PM_REMOVE, FALSE, &qmsg ))

View File

@ -419,33 +419,32 @@ BOOL WINAPI ScreenToClient( HWND hwnd, LPPOINT lppnt )
*
* Find the window and hittest for a given point.
*/
INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT pt, WND **ppWnd )
{
WND *wndPtr;
INT16 hittest = HTERROR;
INT16 retvalue;
POINT16 xy = pt;
POINT xy = pt;
TRACE("scope %04x %d,%d\n", wndScope->hwndSelf, pt.x, pt.y);
TRACE("scope %04x %ld,%ld\n", wndScope->hwndSelf, pt.x, pt.y);
*ppWnd = NULL;
wndPtr = WIN_LockWndPtr(wndScope->child);
if( wndScope->dwStyle & WS_DISABLED )
{
retvalue = HTERROR;
goto end;
retvalue = HTERROR;
goto end;
}
if( wndScope->dwExStyle & WS_EX_MANAGED)
{
/* In managed mode we have to check wndScope first as it is also
* a window which received the mouse event. */
if( pt.x < wndScope->rectClient.left || pt.x >= wndScope->rectClient.right ||
pt.y < wndScope->rectClient.top || pt.y >= wndScope->rectClient.bottom )
goto hittest;
}
MapWindowPoints16( GetDesktopWindow16(), wndScope->hwndSelf, &xy, 1 );
if (wndScope->parent)
MapWindowPoints( GetDesktopWindow(), wndScope->parent->hwndSelf, &xy, 1 );
if (xy.x < wndScope->rectClient.left || pt.x >= wndScope->rectClient.right ||
xy.y < wndScope->rectClient.top || pt.y >= wndScope->rectClient.bottom)
goto hittest;
xy.x -= wndScope->rectClient.left;
xy.y -= wndScope->rectClient.top;
for (;;)
{
@ -467,7 +466,7 @@ INT16 WINPOS_WindowFromPoint( WND* wndScope, POINT16 pt, WND **ppWnd )
(xy.y >= wndPtr->rectWindow.top) &&
(xy.y < wndPtr->rectWindow.bottom))))
{
TRACE("%d,%d is inside %04x\n", xy.x, xy.y, wndPtr->hwndSelf);
TRACE("%ld,%ld is inside %04x\n", xy.x, xy.y, wndPtr->hwndSelf);
*ppWnd = wndPtr; /* Got a suitable window */
/* If window is minimized or disabled, return at once */
@ -505,8 +504,8 @@ hittest:
/* Send the WM_NCHITTEST message (only if to the same task) */
if ((*ppWnd)->hmemTaskQ == GetFastQueue16())
{
hittest = (INT16)SendMessage16( (*ppWnd)->hwndSelf, WM_NCHITTEST,
0, MAKELONG( pt.x, pt.y ) );
hittest = SendMessageA( (*ppWnd)->hwndSelf, WM_NCHITTEST,
0, MAKELONG( pt.x, pt.y ) );
if (hittest != HTTRANSPARENT)
{
retvalue = hittest; /* Found the window */
@ -542,10 +541,10 @@ end:
*/
HWND16 WINAPI WindowFromPoint16( POINT16 pt )
{
WND *pWnd;
WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd );
WIN_ReleaseDesktop();
return pWnd->hwndSelf;
POINT pt32;
CONV_POINT16TO32( &pt, &pt32 );
return WindowFromPoint( pt32 );
}
@ -555,9 +554,7 @@ HWND16 WINAPI WindowFromPoint16( POINT16 pt )
HWND WINAPI WindowFromPoint( POINT pt )
{
WND *pWnd;
POINT16 pt16;
CONV_POINT32TO16( &pt, &pt16 );
WINPOS_WindowFromPoint( WIN_GetDesktop(), pt16, &pWnd );
WINPOS_WindowFromPoint( WIN_GetDesktop(), pt, &pWnd );
WIN_ReleaseDesktop();
return (HWND)pWnd->hwndSelf;
}