Handle top-level window changes properly in DND mode.

This commit is contained in:
David Reveman 2008-10-19 08:55:27 -04:00
parent 1b8d6ee499
commit e6d24e28de
3 changed files with 39 additions and 2 deletions

View file

@ -218,6 +218,7 @@ typedef struct _DMXScreenInfo {
Window scrnWin; /**< "Screen" window on backend display */
int scrnWidth; /**< Width of "screen" */
int scrnHeight; /**< Height of "screen" */
int scrnEventMask;
/** Default drawables for "screen" */
Drawable scrnDefDrawables[MAXFORMATS];

View file

@ -487,6 +487,10 @@ dmxBEDnDUpdatePosition (ScreenPtr pScreen,
{
Window root = DefaultRootWindow (dmxScreen->beDisplay);
XSelectInput (dmxScreen->beDisplay, root,
dmxScreen->scrnEventMask |
StructureNotifyMask | SubstructureNotifyMask);
dmxScreen->queryTree = xcb_query_tree (dmxScreen->connection,
root);
dmxAddRequest (&dmxScreen->request,
@ -514,6 +518,11 @@ dmxBEDnDHideProxyWindow (ScreenPtr pScreen)
UnmapWindow (pProxyWin, FALSE);
if (dmxScreen->dndChildren || dmxScreen->queryTree.sequence)
XSelectInput (dmxScreen->beDisplay,
DefaultRootWindow (dmxScreen->beDisplay),
dmxScreen->scrnEventMask);
if (dmxScreen->dndChildren)
{
xfree (dmxScreen->dndChildren);
@ -1275,8 +1284,32 @@ dmxScreenEventCheckDnD (ScreenPtr pScreen,
xcb_generic_event_t *event)
{
DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
xcb_map_notify_event_t *xmap = (xcb_map_notify_event_t *) event;
switch (event->response_type & ~0x80) {
case XCB_MAP_NOTIFY:
if (xmap->window == dmxScreen->rootWin)
return FALSE;
/* fall-through */
case XCB_UNMAP_NOTIFY:
case XCB_CONFIGURE_NOTIFY:
if (xmap->event != DefaultRootWindow (dmxScreen->beDisplay))
return FALSE;
if (dmxScreen->dndChildren)
{
xfree (dmxScreen->dndChildren);
dmxScreen->dndChildren = NULL;
dmxScreen->dndNChildren = 0;
}
dmxScreen->queryTree.sequence = 0;
if (dmxScreen->dndStatus)
dmxBEDnDUpdatePosition (pScreen, dmxScreen->dndX, dmxScreen->dndY);
break;
case XCB_CLIENT_MESSAGE: {
xcb_client_message_event_t *xclient =
(xcb_client_message_event_t *) event;

View file

@ -1033,6 +1033,8 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[])
dmxScreen->request.head = NULL;
dmxScreen->request.tail = &dmxScreen->request.head;
dmxScreen->scrnEventMask = 0;
dmxScreen->rootEventMask = ExposureMask | StructureNotifyMask |
SubstructureRedirectMask;
@ -1153,9 +1155,10 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[])
if (!dmxScreen->scrnWin && dmxScreen->beDisplay)
{
dmxScreen->scrnWin = DefaultRootWindow (dmxScreen->beDisplay);
dmxScreen->scrnEventMask |= StructureNotifyMask;
XSelectInput (dmxScreen->beDisplay,
dmxScreen->scrnWin,
StructureNotifyMask);
dmxScreen->scrnEventMask);
}
#ifdef MITSHM