mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2025-12-23 08:30:06 +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 */
|
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];
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue