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 */ Window scrnWin; /**< "Screen" window on backend display */
int scrnWidth; /**< Width of "screen" */ int scrnWidth; /**< Width of "screen" */
int scrnHeight; /**< Height of "screen" */ int scrnHeight; /**< Height of "screen" */
int scrnEventMask;
/** Default drawables for "screen" */ /** Default drawables for "screen" */
Drawable scrnDefDrawables[MAXFORMATS]; Drawable scrnDefDrawables[MAXFORMATS];

View file

@ -487,6 +487,10 @@ dmxBEDnDUpdatePosition (ScreenPtr pScreen,
{ {
Window root = DefaultRootWindow (dmxScreen->beDisplay); Window root = DefaultRootWindow (dmxScreen->beDisplay);
XSelectInput (dmxScreen->beDisplay, root,
dmxScreen->scrnEventMask |
StructureNotifyMask | SubstructureNotifyMask);
dmxScreen->queryTree = xcb_query_tree (dmxScreen->connection, dmxScreen->queryTree = xcb_query_tree (dmxScreen->connection,
root); root);
dmxAddRequest (&dmxScreen->request, dmxAddRequest (&dmxScreen->request,
@ -514,6 +518,11 @@ dmxBEDnDHideProxyWindow (ScreenPtr pScreen)
UnmapWindow (pProxyWin, FALSE); UnmapWindow (pProxyWin, FALSE);
if (dmxScreen->dndChildren || dmxScreen->queryTree.sequence)
XSelectInput (dmxScreen->beDisplay,
DefaultRootWindow (dmxScreen->beDisplay),
dmxScreen->scrnEventMask);
if (dmxScreen->dndChildren) if (dmxScreen->dndChildren)
{ {
xfree (dmxScreen->dndChildren); xfree (dmxScreen->dndChildren);
@ -1275,8 +1284,32 @@ dmxScreenEventCheckDnD (ScreenPtr pScreen,
xcb_generic_event_t *event) xcb_generic_event_t *event)
{ {
DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum]; DMXScreenInfo *dmxScreen = &dmxScreens[pScreen->myNum];
xcb_map_notify_event_t *xmap = (xcb_map_notify_event_t *) event;
switch (event->response_type & ~0x80) { 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: { case XCB_CLIENT_MESSAGE: {
xcb_client_message_event_t *xclient = xcb_client_message_event_t *xclient =
(xcb_client_message_event_t *) event; (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.head = NULL;
dmxScreen->request.tail = &dmxScreen->request.head; dmxScreen->request.tail = &dmxScreen->request.head;
dmxScreen->scrnEventMask = 0;
dmxScreen->rootEventMask = ExposureMask | StructureNotifyMask | dmxScreen->rootEventMask = ExposureMask | StructureNotifyMask |
SubstructureRedirectMask; SubstructureRedirectMask;
@ -1153,9 +1155,10 @@ Bool dmxScreenInit(int idx, ScreenPtr pScreen, int argc, char *argv[])
if (!dmxScreen->scrnWin && dmxScreen->beDisplay) if (!dmxScreen->scrnWin && dmxScreen->beDisplay)
{ {
dmxScreen->scrnWin = DefaultRootWindow (dmxScreen->beDisplay); dmxScreen->scrnWin = DefaultRootWindow (dmxScreen->beDisplay);
dmxScreen->scrnEventMask |= StructureNotifyMask;
XSelectInput (dmxScreen->beDisplay, XSelectInput (dmxScreen->beDisplay,
dmxScreen->scrnWin, dmxScreen->scrnWin,
StructureNotifyMask); dmxScreen->scrnEventMask);
} }
#ifdef MITSHM #ifdef MITSHM