Solved a deadlock between global lock and wnd lock in event.c.

This commit is contained in:
Francois Boisvert 1999-04-15 15:22:23 +00:00 committed by Alexandre Julliard
parent ef66ee6b01
commit e5811f0eb1

View file

@ -85,23 +85,23 @@ static const char * const event_names[] =
static void EVENT_ProcessEvent( XEvent *event );
/* Event handlers */
static void EVENT_Key( WND *pWnd, XKeyEvent *event );
static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event );
static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event );
static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event );
static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event );
static void EVENT_Expose( WND *pWnd, XExposeEvent *event );
static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event );
static void EVENT_ConfigureNotify( WND *pWnd, XConfigureEvent *event );
static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event);
static void EVENT_SelectionClear( WND *pWnd, XSelectionClearEvent *event);
static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event );
static void EVENT_MapNotify( WND* wnd, XMapEvent *event );
static void EVENT_UnmapNotify( WND* wnd, XUnmapEvent *event );
static void EVENT_Key( HWND hWnd, XKeyEvent *event );
static void EVENT_ButtonPress( HWND hWnd, XButtonEvent *event );
static void EVENT_ButtonRelease( HWND hWnd, XButtonEvent *event );
static void EVENT_MotionNotify( HWND hWnd, XMotionEvent *event );
static void EVENT_FocusIn( HWND hWnd, XFocusChangeEvent *event );
static void EVENT_FocusOut( HWND hWnd, XFocusChangeEvent *event );
static void EVENT_Expose( HWND hWnd, XExposeEvent *event );
static void EVENT_GraphicsExpose( HWND hWnd, XGraphicsExposeEvent *event );
static void EVENT_ConfigureNotify( HWND hWnd, XConfigureEvent *event );
static void EVENT_SelectionRequest( HWND hWnd, XSelectionRequestEvent *event);
static void EVENT_SelectionClear( HWND hWnd, XSelectionClearEvent *event);
static void EVENT_ClientMessage( HWND hWnd, XClientMessageEvent *event );
static void EVENT_MapNotify( HWND pWnd, XMapEvent *event );
static void EVENT_UnmapNotify( HWND pWnd, XUnmapEvent *event );
/* Usable only with OLVWM - compile option perhaps?
static void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event );
static void EVENT_EnterNotify( HWND hWnd, XCrossingEvent *event );
*/
static void EVENT_GetGeometry( Window win, int *px, int *py,
@ -385,6 +385,7 @@ void X11DRV_EVENT_Synchronize()
static void EVENT_ProcessEvent( XEvent *event )
{
WND *pWnd;
HWND hWnd;
switch (event->type)
{
@ -419,28 +420,38 @@ static void EVENT_ProcessEvent( XEvent *event )
pWnd = NULL; /* Not for a registered window */
}
}
WIN_LockWndPtr(pWnd);
if(!pWnd)
hWnd = 0;
else
hWnd = pWnd->hwndSelf;
if ( !pWnd && event->xany.window != X11DRV_GetXRootWindow() )
ERR( event, "Got event %s for unknown Window %08lx\n",
event_names[event->type], event->xany.window );
else
TRACE( event, "Got event %s for hwnd %04x\n",
event_names[event->type], pWnd? pWnd->hwndSelf : 0 );
event_names[event->type], hWnd );
WIN_ReleaseWndPtr(pWnd);
switch(event->type)
{
case KeyPress:
case KeyRelease:
EVENT_Key( pWnd, (XKeyEvent*)event );
EVENT_Key( hWnd, (XKeyEvent*)event );
break;
case ButtonPress:
EVENT_ButtonPress( pWnd, (XButtonEvent*)event );
EVENT_ButtonPress( hWnd, (XButtonEvent*)event );
break;
case ButtonRelease:
EVENT_ButtonRelease( pWnd, (XButtonEvent*)event );
EVENT_ButtonRelease( hWnd, (XButtonEvent*)event );
break;
case MotionNotify:
@ -454,50 +465,50 @@ static void EVENT_ProcessEvent( XEvent *event )
*/
while (TSXCheckTypedWindowEvent(display,((XAnyEvent *)event)->window,
MotionNotify, event));
EVENT_MotionNotify( pWnd, (XMotionEvent*)event );
EVENT_MotionNotify( hWnd, (XMotionEvent*)event );
break;
case FocusIn:
if (!pWnd) return;
EVENT_FocusIn( pWnd, (XFocusChangeEvent*)event );
if (!hWnd) return;
EVENT_FocusIn( hWnd, (XFocusChangeEvent*)event );
break;
case FocusOut:
if (!pWnd) return;
EVENT_FocusOut( pWnd, (XFocusChangeEvent*)event );
if (!hWnd) return;
EVENT_FocusOut( hWnd, (XFocusChangeEvent*)event );
break;
case Expose:
EVENT_Expose( pWnd, (XExposeEvent *)event );
EVENT_Expose( hWnd, (XExposeEvent *)event );
break;
case GraphicsExpose:
EVENT_GraphicsExpose( pWnd, (XGraphicsExposeEvent *)event );
EVENT_GraphicsExpose( hWnd, (XGraphicsExposeEvent *)event );
break;
case ConfigureNotify:
if (!pWnd) return;
EVENT_ConfigureNotify( pWnd, (XConfigureEvent*)event );
if (!hWnd) return;
EVENT_ConfigureNotify( hWnd, (XConfigureEvent*)event );
break;
case SelectionRequest:
if (!pWnd) return;
EVENT_SelectionRequest( pWnd, (XSelectionRequestEvent *)event );
if (!hWnd) return;
EVENT_SelectionRequest( hWnd, (XSelectionRequestEvent *)event );
break;
case SelectionClear:
if (!pWnd) return;
EVENT_SelectionClear( pWnd, (XSelectionClearEvent*) event );
if (!hWnd) return;
EVENT_SelectionClear( hWnd, (XSelectionClearEvent*) event );
break;
case ClientMessage:
if (!pWnd) return;
EVENT_ClientMessage( pWnd, (XClientMessageEvent *) event );
if (!hWnd) return;
EVENT_ClientMessage( hWnd, (XClientMessageEvent *) event );
break;
#if 0
case EnterNotify:
EVENT_EnterNotify( pWnd, (XCrossingEvent *) event );
EVENT_EnterNotify( hWnd, (XCrossingEvent *) event );
break;
#endif
@ -505,21 +516,20 @@ static void EVENT_ProcessEvent( XEvent *event )
break;
case MapNotify:
if (!pWnd) return;
EVENT_MapNotify( pWnd, (XMapEvent *)event );
if (!hWnd) return;
EVENT_MapNotify( hWnd, (XMapEvent *)event );
break;
case UnmapNotify:
if (!pWnd) return;
EVENT_UnmapNotify( pWnd, (XUnmapEvent *)event );
if (!hWnd) return;
EVENT_UnmapNotify( hWnd, (XUnmapEvent *)event );
break;
default:
WARN(event, "Unprocessed event %s for hwnd %04x\n",
event_names[event->type], pWnd? pWnd->hwndSelf : 0 );
event_names[event->type], hWnd );
break;
}
WIN_ReleaseWndPtr(pWnd);
}
/***********************************************************************
@ -587,10 +597,11 @@ static unsigned __td_lookup( Window w, Window* list, unsigned max )
return i;
}
static BOOL EVENT_QueryZOrder( WND* pWndCheck )
static BOOL EVENT_QueryZOrder( HWND hWndCheck)
{
BOOL bRet = FALSE;
HWND hwndInsertAfter = HWND_TOP;
WND *pWndCheck = WIN_FindWndPtr(hWndCheck);
WND *pDesktop = WIN_GetDesktop();
WND *pWnd, *pWndZ = WIN_LockWndPtr(pDesktop->child);
Window w, parent, *children = NULL;
@ -598,6 +609,7 @@ static BOOL EVENT_QueryZOrder( WND* pWndCheck )
if( !__check_query_condition(&pWndZ, &pWnd) )
{
WIN_ReleaseWndPtr(pWndCheck);
WIN_ReleaseWndPtr(pDesktop->child);
WIN_ReleaseDesktop();
return TRUE;
@ -650,10 +662,10 @@ static BOOL EVENT_QueryZOrder( WND* pWndCheck )
if( children ) TSXFree( children );
WIN_ReleaseWndPtr(pWnd);
WIN_ReleaseWndPtr(pWndZ);
WIN_ReleaseWndPtr(pWndCheck);
return bRet;
}
/***********************************************************************
* EVENT_XStateToKeyState
*
@ -698,17 +710,19 @@ BOOL X11DRV_EVENT_QueryPointer(DWORD *posX, DWORD *posY, DWORD *state)
/***********************************************************************
* EVENT_Expose
*/
static void EVENT_Expose( WND *pWnd, XExposeEvent *event )
static void EVENT_Expose( HWND hWnd, XExposeEvent *event )
{
RECT rect;
WND *pWnd = WIN_FindWndPtr(hWnd);
/* Make position relative to client area instead of window */
rect.left = event->x - (pWnd? (pWnd->rectClient.left - pWnd->rectWindow.left) : 0);
rect.top = event->y - (pWnd? (pWnd->rectClient.top - pWnd->rectWindow.top) : 0);
rect.right = rect.left + event->width;
rect.bottom = rect.top + event->height;
WIN_ReleaseWndPtr(pWnd);
Callout.RedrawWindow( pWnd? pWnd->hwndSelf : 0, &rect, 0,
Callout.RedrawWindow( hWnd, &rect, 0,
RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN | RDW_ERASE |
(event->count ? 0 : RDW_ERASENOW) );
}
@ -720,9 +734,10 @@ static void EVENT_Expose( WND *pWnd, XExposeEvent *event )
* This is needed when scrolling area is partially obscured
* by non-Wine X window.
*/
static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event )
static void EVENT_GraphicsExpose( HWND hWnd, XGraphicsExposeEvent *event )
{
RECT rect;
WND *pWnd = WIN_FindWndPtr(hWnd);
/* Make position relative to client area instead of window */
rect.left = event->x - (pWnd? (pWnd->rectClient.left - pWnd->rectWindow.left) : 0);
@ -730,7 +745,9 @@ static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event )
rect.right = rect.left + event->width;
rect.bottom = rect.top + event->height;
Callout.RedrawWindow( pWnd? pWnd->hwndSelf : 0, &rect, 0,
WIN_ReleaseWndPtr(pWnd);
Callout.RedrawWindow( hWnd, &rect, 0,
RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_ERASE |
(event->count ? 0 : RDW_ERASENOW) );
}
@ -741,25 +758,30 @@ static void EVENT_GraphicsExpose( WND *pWnd, XGraphicsExposeEvent *event )
*
* Handle a X key event
*/
static void EVENT_Key( WND *pWnd, XKeyEvent *event )
static void EVENT_Key( HWND hWnd, XKeyEvent *event )
{
WND *pWnd = WIN_FindWndPtr(hWnd);
X11DRV_KEYBOARD_HandleEvent( pWnd, event );
WIN_ReleaseWndPtr(pWnd);
}
/***********************************************************************
* EVENT_MotionNotify
*/
static void EVENT_MotionNotify( WND *pWnd, XMotionEvent *event )
static void EVENT_MotionNotify( HWND hWnd, XMotionEvent *event )
{
WND *pWnd = WIN_FindWndPtr(hWnd);
int xOffset = pWnd? pWnd->rectWindow.left : 0;
int yOffset = pWnd? pWnd->rectWindow.top : 0;
WIN_ReleaseWndPtr(pWnd);
MOUSE_SendEvent( MOUSEEVENTF_MOVE,
xOffset + event->x, yOffset + event->y,
EVENT_XStateToKeyState( event->state ),
event->time - MSG_WineStartTicks,
pWnd? pWnd->hwndSelf : 0 );
hWnd);
}
@ -783,16 +805,19 @@ void X11DRV_EVENT_DummyMotionNotify(void)
/***********************************************************************
* EVENT_ButtonPress
*/
static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event )
static void EVENT_ButtonPress( HWND hWnd, XButtonEvent *event )
{
static WORD statusCodes[NB_BUTTONS] =
{ MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN };
int buttonNum = event->button - 1;
WND *pWnd = WIN_FindWndPtr(hWnd);
int xOffset = pWnd? pWnd->rectWindow.left : 0;
int yOffset = pWnd? pWnd->rectWindow.top : 0;
WORD keystate;
WIN_ReleaseWndPtr(pWnd);
if (buttonNum >= NB_BUTTONS) return;
/*
@ -821,23 +846,25 @@ static void EVENT_ButtonPress( WND *pWnd, XButtonEvent *event )
xOffset + event->x, yOffset + event->y,
keystate,
event->time - MSG_WineStartTicks,
pWnd? pWnd->hwndSelf : 0 );
hWnd);
}
/***********************************************************************
* EVENT_ButtonRelease
*/
static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event )
static void EVENT_ButtonRelease( HWND hWnd, XButtonEvent *event )
{
static WORD statusCodes[NB_BUTTONS] =
{ MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP };
int buttonNum = event->button - 1;
WND *pWnd = WIN_FindWndPtr(hWnd);
int xOffset = pWnd? pWnd->rectWindow.left : 0;
int yOffset = pWnd? pWnd->rectWindow.top : 0;
WORD keystate;
WIN_ReleaseWndPtr(pWnd);
if (buttonNum >= NB_BUTTONS) return;
/*
@ -866,28 +893,26 @@ static void EVENT_ButtonRelease( WND *pWnd, XButtonEvent *event )
xOffset + event->x, yOffset + event->y,
keystate,
event->time - MSG_WineStartTicks,
pWnd? pWnd->hwndSelf : 0 );
hWnd);
}
/**********************************************************************
* EVENT_FocusIn
*/
static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event )
static void EVENT_FocusIn( HWND hWnd, XFocusChangeEvent *event )
{
if (Options.managed) EVENT_QueryZOrder( pWnd );
if (Options.managed) EVENT_QueryZOrder( hWnd );
if (event->detail != NotifyPointer)
{
HWND hwnd = pWnd->hwndSelf;
if (hwnd != GetActiveWindow())
if (hWnd != GetActiveWindow())
{
WINPOS_ChangeActiveWindow( hwnd, FALSE );
WINPOS_ChangeActiveWindow( hWnd, FALSE );
X11DRV_KEYBOARD_UpdateState();
}
if ((hwnd != GetFocus()) && !IsChild( hwnd, GetFocus()))
SetFocus( hwnd );
if ((hWnd != GetFocus()) && !IsChild( hWnd, GetFocus()))
SetFocus( hWnd );
}
}
@ -897,18 +922,16 @@ static void EVENT_FocusIn( WND *pWnd, XFocusChangeEvent *event )
*
* Note: only top-level override-redirect windows get FocusOut events.
*/
static void EVENT_FocusOut( WND *pWnd, XFocusChangeEvent *event )
static void EVENT_FocusOut( HWND hWnd, XFocusChangeEvent *event )
{
if (event->detail != NotifyPointer)
{
HWND hwnd = pWnd->hwndSelf;
if (hwnd == GetActiveWindow())
if (hWnd == GetActiveWindow())
{
SendMessageA( hwnd, WM_CANCELMODE, 0, 0 );
SendMessageA( hWnd, WM_CANCELMODE, 0, 0 );
WINPOS_ChangeActiveWindow( 0, FALSE );
}
if ((hwnd == GetFocus()) || IsChild( hwnd, GetFocus()))
if ((hWnd == GetFocus()) || IsChild( hWnd, GetFocus()))
SetFocus( 0 );
}
}
@ -971,7 +994,7 @@ static void EVENT_GetGeometry( Window win, int *px, int *py,
* The ConfigureNotify event is only selected on top-level windows
* when the -managed flag is used.
*/
static void EVENT_ConfigureNotify( WND *pWnd, XConfigureEvent *event )
static void EVENT_ConfigureNotify( HWND hWnd, XConfigureEvent *event )
{
WINDOWPOS winpos;
RECT newWindowRect, newClientRect;
@ -980,6 +1003,7 @@ static void EVENT_ConfigureNotify( WND *pWnd, XConfigureEvent *event )
int x, y;
unsigned int width, height;
WND *pWnd = WIN_FindWndPtr(hWnd);
assert (pWnd->flags & WIN_MANAGED);
/* We don't rely on the event geometry info, because it is relative
@ -993,7 +1017,7 @@ TRACE(win, "%04x adjusted to (%i,%i)-(%i,%i)\n", pWnd->hwndSelf,
/* Fill WINDOWPOS struct */
winpos.flags = SWP_NOACTIVATE | SWP_NOZORDER;
winpos.hwnd = pWnd->hwndSelf;
winpos.hwnd = hWnd;
winpos.x = x;
winpos.y = y;
winpos.cx = width;
@ -1015,7 +1039,11 @@ TRACE(win, "%04x adjusted to (%i,%i)-(%i,%i)\n", pWnd->hwndSelf,
/* Send WM_WINDOWPOSCHANGING */
SendMessageA( winpos.hwnd, WM_WINDOWPOSCHANGING, 0, (LPARAM)&winpos );
if (!IsWindow( winpos.hwnd )) return;
if (!IsWindow( winpos.hwnd ))
{
WIN_ReleaseWndPtr(pWnd);
return;
}
/* Calculate new position and size */
newWindowRect.left = x;
@ -1027,7 +1055,11 @@ TRACE(win, "%04x adjusted to (%i,%i)-(%i,%i)\n", pWnd->hwndSelf,
&pWnd->rectWindow, &pWnd->rectClient,
&winpos, &newClientRect );
if (!IsWindow( winpos.hwnd )) return;
if (!IsWindow( winpos.hwnd ))
{
WIN_ReleaseWndPtr(pWnd);
return;
}
oldWindowRect = pWnd->rectWindow;
oldClientRect = pWnd->rectClient;
@ -1043,6 +1075,8 @@ TRACE(win, "%04x adjusted to (%i,%i)-(%i,%i)\n", pWnd->hwndSelf,
RedrawWindow( winpos.hwnd, NULL, 0, RDW_FRAME | RDW_ALLCHILDREN |
RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW );
WIN_ReleaseWndPtr(pWnd);
SendMessageA( winpos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM)&winpos );
if (!IsWindow( winpos.hwnd )) return;
@ -1051,14 +1085,14 @@ TRACE(win, "%04x adjusted to (%i,%i)-(%i,%i)\n", pWnd->hwndSelf,
WIN_UnlinkWindow( winpos.hwnd );
WIN_LinkWindow( winpos.hwnd, HWND_BOTTOM);
}
else EVENT_QueryZOrder( pWnd ); /* try to outsmart window manager */
else EVENT_QueryZOrder( hWnd ); /* try to outsmart window manager */
}
/***********************************************************************
* EVENT_SelectionRequest
*/
static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
static void EVENT_SelectionRequest( HWND hWnd, XSelectionRequestEvent *event )
{
XSelectionEvent result;
Atom rprop = None;
@ -1084,7 +1118,7 @@ static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
{
/* open to make sure that clipboard is available */
BOOL couldOpen = OpenClipboard( pWnd->hwndSelf );
BOOL couldOpen = OpenClipboard( hWnd );
char* lpstr = 0;
hText = GetClipboardData16(CF_TEXT);
@ -1131,10 +1165,10 @@ static void EVENT_SelectionRequest( WND *pWnd, XSelectionRequestEvent *event )
/***********************************************************************
* EVENT_SelectionClear
*/
static void EVENT_SelectionClear( WND *pWnd, XSelectionClearEvent *event )
static void EVENT_SelectionClear( HWND hWnd, XSelectionClearEvent *event )
{
if (event->selection != XA_PRIMARY) return;
X11DRV_CLIPBOARD_ReleaseSelection( event->window, pWnd->hwndSelf );
X11DRV_CLIPBOARD_ReleaseSelection( event->window, hWnd );
}
@ -1143,7 +1177,7 @@ static void EVENT_SelectionClear( WND *pWnd, XSelectionClearEvent *event )
*
* don't know if it still works (last Changlog is from 96/11/04)
*/
static void EVENT_DropFromOffiX( WND *pWnd, XClientMessageEvent *event )
static void EVENT_DropFromOffiX( HWND hWnd, XClientMessageEvent *event )
{
unsigned long data_length;
unsigned long aux_long;
@ -1163,14 +1197,17 @@ static void EVENT_DropFromOffiX( WND *pWnd, XClientMessageEvent *event )
SEGPTR spDragInfo = (SEGPTR) WIN16_GlobalLock16(hDragInfo);
Window w_aux_root, w_aux_child;
WND* pDropWnd;
WND* pWnd;
if( !lpDragInfo || !spDragInfo ) return;
pWnd = WIN_FindWndPtr(hWnd);
TSXQueryPointer( display, X11DRV_WND_GetXWindow(pWnd), &w_aux_root, &w_aux_child,
&x, &y, (int *) &u.pt_aux.x, (int *) &u.pt_aux.y,
(unsigned int*)&aux_long);
lpDragInfo->hScope = pWnd->hwndSelf;
lpDragInfo->hScope = hWnd;
lpDragInfo->pt.x = (INT16)x; lpDragInfo->pt.y = (INT16)y;
/* find out drop point and drop window */
@ -1180,10 +1217,12 @@ static void EVENT_DropFromOffiX( WND *pWnd, XClientMessageEvent *event )
{ bAccept = pWnd->dwExStyle & WS_EX_ACCEPTFILES; x = y = 0; }
else
{
bAccept = DRAG_QueryUpdate( pWnd->hwndSelf, spDragInfo, TRUE );
bAccept = DRAG_QueryUpdate( hWnd, spDragInfo, TRUE );
x = lpDragInfo->pt.x; y = lpDragInfo->pt.y;
}
pDropWnd = WIN_FindWndPtr( lpDragInfo->hScope );
WIN_ReleaseWndPtr(pWnd);
GlobalFree16( hDragInfo );
if( bAccept )
@ -1244,7 +1283,7 @@ static void EVENT_DropFromOffiX( WND *pWnd, XClientMessageEvent *event )
p += strlen(p) + 1;
}
*p_drop = '\0';
PostMessage16( pWnd->hwndSelf, WM_DROPFILES,
PostMessage16( hWnd, WM_DROPFILES,
(WPARAM16)hDrop, 0L );
}
}
@ -1264,9 +1303,10 @@ static void EVENT_DropFromOffiX( WND *pWnd, XClientMessageEvent *event )
*
* event->data.l[3], event->data.l[4] contains drop x,y position
*/
static void EVENT_DropURLs( WND *pWnd, XClientMessageEvent *event )
static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event )
{
WND *pDropWnd;
WND *pWnd;
unsigned long data_length;
unsigned long aux_long, drop_len = 0;
unsigned char *p_data = NULL; /* property data */
@ -1283,10 +1323,15 @@ static void EVENT_DropURLs( WND *pWnd, XClientMessageEvent *event )
HDROP h32;
} hDrop;
pWnd = WIN_FindWndPtr(hWnd);
drop32 = pWnd->flags & WIN_ISWIN32;
if (!(pWnd->dwExStyle & WS_EX_ACCEPTFILES))
{
WIN_ReleaseWndPtr(pWnd);
return;
}
WIN_ReleaseWndPtr(pWnd);
TSXGetWindowProperty( display, DefaultRootWindow(display),
dndSelection, 0, 65535, FALSE,
@ -1318,7 +1363,8 @@ static void EVENT_DropURLs( WND *pWnd, XClientMessageEvent *event )
if( drop_len && drop_len < 65535 ) {
TSXQueryPointer( display, X11DRV_GetXRootWindow(), &u.w_aux, &u.w_aux,
&x, &y, &u.i, &u.i, &u.i);
pDropWnd = WIN_FindWndPtr( pWnd->hwndSelf );
pDropWnd = WIN_FindWndPtr( hWnd );
if (drop32) {
LPDROPFILESTRUCT lpDrop;
@ -1389,11 +1435,11 @@ static void EVENT_DropURLs( WND *pWnd, XClientMessageEvent *event )
* PostMessage16 and WPARAM32 would be truncated to WPARAM16
*/
GlobalUnlock(hDrop.h32);
SendMessageA( pWnd->hwndSelf, WM_DROPFILES,
SendMessageA( hWnd, WM_DROPFILES,
(WPARAM)hDrop.h32, 0L );
} else {
GlobalUnlock16(hDrop.h16);
PostMessage16( pWnd->hwndSelf, WM_DROPFILES,
PostMessage16( hWnd, WM_DROPFILES,
(WPARAM16)hDrop.h16, 0L );
}
}
@ -1406,18 +1452,18 @@ static void EVENT_DropURLs( WND *pWnd, XClientMessageEvent *event )
/**********************************************************************
* EVENT_ClientMessage
*/
static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
static void EVENT_ClientMessage( HWND hWnd, XClientMessageEvent *event )
{
if (event->message_type != None && event->format == 32) {
if ((event->message_type == wmProtocols) &&
(((Atom) event->data.l[0]) == wmDeleteWindow))
SendMessage16( pWnd->hwndSelf, WM_SYSCOMMAND, SC_CLOSE, 0 );
SendMessage16( hWnd, WM_SYSCOMMAND, SC_CLOSE, 0 );
else if ( event->message_type == dndProtocol &&
(event->data.l[0] == DndFile || event->data.l[0] == DndFiles) )
EVENT_DropFromOffiX(pWnd, event);
EVENT_DropFromOffiX(hWnd, event);
else if ( event->message_type == dndProtocol &&
event->data.l[0] == DndURL )
EVENT_DropURLs(pWnd, event);
EVENT_DropURLs(hWnd, event);
else {
#if 0
/* enable this if you want to see the message */
@ -1448,7 +1494,7 @@ static void EVENT_ClientMessage( WND *pWnd, XClientMessageEvent *event )
* self-managed mode with private colormap
*/
#if 0
void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event )
void EVENT_EnterNotify( HWND hWnd, XCrossingEvent *event )
{
if( !Options.managed && X11DRV_GetXRootWindow() == DefaultRootWindow(display) &&
(COLOR_GetSystemPaletteFlags() & COLOR_PRIVATE) && GetFocus() )
@ -1459,15 +1505,16 @@ void EVENT_EnterNotify( WND *pWnd, XCrossingEvent *event )
/**********************************************************************
* EVENT_MapNotify
*/
void EVENT_MapNotify( WND* wnd, XMapEvent *event )
void EVENT_MapNotify( HWND hWnd, XMapEvent *event )
{
HWND hwndFocus = GetFocus();
WND *wndFocus = WIN_FindWndPtr(hwndFocus);
WND *pWnd = WIN_FindWndPtr(hWnd);
if (pWnd->flags & WIN_MANAGED)
pWnd->dwStyle &= ~WS_MINIMIZE;
WIN_ReleaseWndPtr(pWnd);
if (wnd->flags & WIN_MANAGED)
wnd->dwStyle &= ~WS_MINIMIZE;
if (hwndFocus && IsChild( wnd->hwndSelf, hwndFocus ))
if (hwndFocus && IsChild( hWnd, hwndFocus ))
X11DRV_WND_SetFocus(wndFocus);
WIN_ReleaseWndPtr(wndFocus);
@ -1479,13 +1526,15 @@ void EVENT_MapNotify( WND* wnd, XMapEvent *event )
/**********************************************************************
* EVENT_MapNotify
*/
void EVENT_UnmapNotify( WND* wnd, XUnmapEvent *event )
void EVENT_UnmapNotify( HWND hWnd, XUnmapEvent *event )
{
if (wnd->flags & WIN_MANAGED)
WND *pWnd = WIN_FindWndPtr(hWnd);
if (pWnd->flags & WIN_MANAGED)
{
EndMenu();
wnd->dwStyle |= WS_MINIMIZE;
pWnd->dwStyle |= WS_MINIMIZE;
}
WIN_ReleaseWndPtr(pWnd);
}