mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-01-10 09:20:16 +01:00
Fix a number of issues with how client message events were handled.
This commit is contained in:
parent
f273c1f691
commit
7ea245b7a4
1 changed files with 69 additions and 45 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue