mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-23 07:20:04 +01:00
Handle top-level window changes properly in DND mode.
This commit is contained in:
parent
1b8d6ee499
commit
e6d24e28de
3 changed files with 39 additions and 2 deletions
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue