Fix a number of issues with how client message events were handled.

This commit is contained in:
David Reveman 2008-07-16 17:28:10 -04:00
parent f273c1f691
commit 7ea245b7a4

View file

@ -1633,6 +1633,33 @@ dmxScreenExpose (ScreenPtr pScreen)
}
}
static Bool
dmxManagerPredicate (Display *xdisplay,
XEvent *X,
XPointer arg)
{
Window *xWindow = (Window *) arg;
switch (X->type) {
case CirculateRequest:
*xWindow = X->xcirculaterequest.window;
break;
case ConfigureRequest:
*xWindow = X->xconfigurerequest.window;
break;
case MapRequest:
*xWindow = X->xmaprequest.window;
break;
case ClientMessage:
*xWindow = X->xclient.window;
break;
default:
return FALSE;
}
return TRUE;
}
static void
dmxScreenManage (ScreenPtr pScreen)
{
@ -1654,31 +1681,15 @@ dmxScreenManage (ScreenPtr pScreen)
#endif
XLIB_PROLOGUE (dmxScreen);
status = XCheckMaskEvent (dmxScreen->beDisplay,
SubstructureRedirectMask,
&X);
status = XCheckIfEvent (dmxScreen->beDisplay,
&X,
dmxManagerPredicate,
(XPointer) &xWindow);
XLIB_EPILOGUE (dmxScreen);
if (!status)
break;
switch (X.type) {
case CirculateRequest:
xWindow = X.xcirculaterequest.window;
break;
case ConfigureRequest:
xWindow = X.xconfigurerequest.window;
break;
case MapRequest:
xWindow = X.xmaprequest.window;
break;
case ClientMessage:
xWindow = X.xclient.window;
break;
default:
xWindow = None;
}
pChild = WindowTable[pScreen->myNum];
for (;;)
@ -1704,10 +1715,11 @@ dmxScreenManage (ScreenPtr pScreen)
continue;
}
while (!pChild->nextSib && (pChild != WindowTable[0]))
while (!pChild->nextSib &&
(pChild != WindowTable[pScreen->myNum]))
pChild = pChild->parent;
if (pChild == WindowTable[0])
if (pChild == WindowTable[pScreen->myNum])
break;
pChild = pChild->nextSib;
@ -1722,6 +1734,8 @@ dmxScreenManage (ScreenPtr pScreen)
)
{
XID vlist[8];
char *name = NULL;
Atom type;
int mask, i = 0;
int status = Success;
xEvent x;
@ -1838,16 +1852,27 @@ dmxScreenManage (ScreenPtr pScreen)
x.u.u.detail = X.xclient.format;
x.u.clientMessage.window = pChild->drawable.id;
/* ROUNDTRIP: if name is not cached by xlib */
XLIB_PROLOGUE (dmxScreen);
name = XGetAtomName (dmxScreen->beDisplay,
X.xclient.message_type);
XLIB_EPILOGUE (dmxScreen);
if (!name)
break;
type = MakeAtom (name, strlen (name), TRUE);
switch (X.xclient.format) {
case 8:
x.u.clientMessage.u.b.type = X.xclient.message_type;
x.u.clientMessage.u.b.type = type;
for (i = 0; i < 20; i++)
x.u.clientMessage.u.b.bytes[i] =
X.xclient.data.b[i];
break;
case 16:
x.u.clientMessage.u.s.type = X.xclient.message_type;
x.u.clientMessage.u.s.type = type;
x.u.clientMessage.u.s.shorts0 = X.xclient.data.s[0];
x.u.clientMessage.u.s.shorts1 = X.xclient.data.s[1];
@ -1861,7 +1886,7 @@ dmxScreenManage (ScreenPtr pScreen)
x.u.clientMessage.u.s.shorts9 = X.xclient.data.s[9];
break;
case 32:
x.u.clientMessage.u.l.type = X.xclient.message_type;
x.u.clientMessage.u.l.type = type;
x.u.clientMessage.u.l.longs0 = X.xclient.data.l[0];
x.u.clientMessage.u.l.longs1 = X.xclient.data.l[1];
@ -1871,33 +1896,26 @@ dmxScreenManage (ScreenPtr pScreen)
break;
}
/* client messages are always forwarded to the root
window as there's no way for us to know which
windows they were originally intended for */
pWin = WindowTable[pScreen->myNum];
#ifdef PANORAMIX
if (!noPanoramiXExtension)
{
x.u.clientMessage.window = win->info[0].id;
if (dixLookupWindow (&pWin,
win->info[0].id,
serverClient,
DixReadAccess) == Success)
DeliverEventsToWindow (PickPointer (serverClient),
pWin,
&x,
1,
SubstructureRedirectMask |
SubstructureNotifyMask,
NullGrab, 0);
pWin = WindowTable[0];
}
else
#endif
DeliverEventsToWindow (PickPointer (serverClient),
pChild,
&x,
1,
SubstructureRedirectMask |
SubstructureNotifyMask,
NullGrab, 0);
DeliverEventsToWindow (PickPointer (serverClient),
pWin,
&x,
1,
SubstructureRedirectMask |
SubstructureNotifyMask,
NullGrab, 0);
break;
}
@ -1913,12 +1931,14 @@ dmxScreenManage (ScreenPtr pScreen)
switch (X.type) {
case CirculateRequest:
XLIB_PROLOGUE (dmxScreen);
if (X.xcirculaterequest.place == PlaceOnTop)
XRaiseWindow (dmxScreen->beDisplay,
X.xcirculaterequest.window);
else
XLowerWindow (dmxScreen->beDisplay,
X.xcirculaterequest.window);
XLIB_EPILOGUE (dmxScreen);
break;
case ConfigureRequest:
xwc.x = X.xconfigurerequest.x;
@ -1929,13 +1949,17 @@ dmxScreenManage (ScreenPtr pScreen)
xwc.sibling = X.xconfigurerequest.above;
xwc.stack_mode = X.xconfigurerequest.detail;
XLIB_PROLOGUE (dmxScreen);
XConfigureWindow (dmxScreen->beDisplay,
X.xconfigurerequest.window,
X.xconfigurerequest.value_mask,
&xwc);
XLIB_EPILOGUE (dmxScreen);
break;
case MapRequest:
XLIB_PROLOGUE (dmxScreen);
XMapWindow (dmxScreen->beDisplay, X.xmaprequest.window);
XLIB_EPILOGUE (dmxScreen);
break;
case ClientMessage:
break;