Change core enter/leave semantics for multiple pointers.
Send EnterNotify when first device enters the window, LeaveNotify when the last device leaves the window. Additional devices will not cause additional Enter/LeaveNotifies.
This commit is contained in:
parent
547d720938
commit
e7b47b1758
25
dix/events.c
25
dix/events.c
|
@ -2270,7 +2270,10 @@ DefineInitialRootWindow(WindowPtr win)
|
||||||
while (pDev)
|
while (pDev)
|
||||||
{
|
{
|
||||||
if (DevHasCursor(pDev))
|
if (DevHasCursor(pDev))
|
||||||
|
{
|
||||||
InitializeSprite(pDev, win);
|
InitializeSprite(pDev, win);
|
||||||
|
win->devPrivates[EnterLeavePrivatesIndex].val++;
|
||||||
|
}
|
||||||
pDev = pDev->next;
|
pDev = pDev->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3447,6 +3450,7 @@ EnterLeaveEvent(
|
||||||
GrabPtr grab = mouse->coreGrab.grab;
|
GrabPtr grab = mouse->coreGrab.grab;
|
||||||
GrabPtr devgrab = mouse->deviceGrab.grab;
|
GrabPtr devgrab = mouse->deviceGrab.grab;
|
||||||
Mask mask;
|
Mask mask;
|
||||||
|
long* inWindow; /* no of sprites inside pWin */
|
||||||
|
|
||||||
deviceEnterNotify *devEnterLeave;
|
deviceEnterNotify *devEnterLeave;
|
||||||
int mskidx;
|
int mskidx;
|
||||||
|
@ -3492,14 +3496,23 @@ EnterLeaveEvent(
|
||||||
IsParent(focus, pWin)))
|
IsParent(focus, pWin)))
|
||||||
event.u.enterLeave.flags |= ELFlagFocus;
|
event.u.enterLeave.flags |= ELFlagFocus;
|
||||||
|
|
||||||
|
inWindow = &pWin->devPrivates[EnterLeavePrivatesIndex].val;
|
||||||
|
|
||||||
|
(type == EnterNotify) ? (*inWindow)++ : (*inWindow)--;
|
||||||
|
|
||||||
if (mask & filters[type])
|
if (mask & filters[type])
|
||||||
{
|
{
|
||||||
if (grab)
|
/* only send core events for the first device to enter and the last
|
||||||
(void)TryClientEvents(rClient(grab), &event, 1, mask,
|
one to leave */
|
||||||
filters[type], grab);
|
if ((*inWindow) == (LeaveNotify - type))
|
||||||
else
|
{
|
||||||
(void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
|
if (grab)
|
||||||
NullGrab, 0);
|
(void)TryClientEvents(rClient(grab), &event, 1, mask,
|
||||||
|
filters[type], grab);
|
||||||
|
else
|
||||||
|
(void)DeliverEventsToWindow(pDev, pWin, &event, 1, filters[type],
|
||||||
|
NullGrab, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
devEnterLeave = (deviceEnterNotify*)&event;
|
devEnterLeave = (deviceEnterNotify*)&event;
|
||||||
|
|
|
@ -391,6 +391,8 @@ main(int argc, char *argv[], char *envp[])
|
||||||
FatalError("failed to create scratch GCs");
|
FatalError("failed to create scratch GCs");
|
||||||
if (!CreateDefaultStipple(i))
|
if (!CreateDefaultStipple(i))
|
||||||
FatalError("failed to create default stipple");
|
FatalError("failed to create default stipple");
|
||||||
|
if (!InitWindowPrivates(pScreen))
|
||||||
|
FatalError("Failed to init window privates.");
|
||||||
if (!CreateRootWindow(pScreen))
|
if (!CreateRootWindow(pScreen))
|
||||||
FatalError("failed to create root window");
|
FatalError("failed to create root window");
|
||||||
}
|
}
|
||||||
|
|
18
dix/window.c
18
dix/window.c
|
@ -155,6 +155,8 @@ _X_EXPORT int screenIsSaved = SCREEN_SAVER_OFF;
|
||||||
|
|
||||||
_X_EXPORT ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
|
_X_EXPORT ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
|
||||||
|
|
||||||
|
_X_EXPORT int EnterLeavePrivatesIndex = -1;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
extern void DeleteWindowFromAnyEvents();
|
extern void DeleteWindowFromAnyEvents();
|
||||||
extern Mask EventMaskForClient();
|
extern Mask EventMaskForClient();
|
||||||
|
@ -3969,6 +3971,22 @@ WindowParentHasDeviceCursor(WindowPtr pWin,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize some mandatory devPrivates for windows.
|
||||||
|
*
|
||||||
|
* At the moment, this includes only the enter/leave semaphore.
|
||||||
|
*
|
||||||
|
* Returns TRUE on success.
|
||||||
|
*/
|
||||||
|
_X_EXPORT Bool
|
||||||
|
InitWindowPrivates(ScreenPtr screen)
|
||||||
|
{
|
||||||
|
if (EnterLeavePrivatesIndex == -1)
|
||||||
|
EnterLeavePrivatesIndex = AllocateWindowPrivateIndex();
|
||||||
|
|
||||||
|
return AllocateWindowPrivate(screen, EnterLeavePrivatesIndex, 0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NOLOGOHACK
|
#ifndef NOLOGOHACK
|
||||||
static void
|
static void
|
||||||
DrawLogo(WindowPtr pWin)
|
DrawLogo(WindowPtr pWin)
|
||||||
|
|
|
@ -268,4 +268,6 @@ extern void DisableMapUnmapEvents(
|
||||||
extern void EnableMapUnmapEvents(
|
extern void EnableMapUnmapEvents(
|
||||||
WindowPtr /* pWin */ );
|
WindowPtr /* pWin */ );
|
||||||
|
|
||||||
|
Bool InitWindowPrivates(
|
||||||
|
ScreenPtr /* screen */);
|
||||||
#endif /* WINDOW_H */
|
#endif /* WINDOW_H */
|
||||||
|
|
|
@ -216,6 +216,7 @@ typedef struct _ScreenSaverStuff {
|
||||||
|
|
||||||
extern int screenIsSaved;
|
extern int screenIsSaved;
|
||||||
extern ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
|
extern ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
|
||||||
|
extern int EnterLeavePrivatesIndex;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* this is the configuration parameter "NO_BACK_SAVE"
|
* this is the configuration parameter "NO_BACK_SAVE"
|
||||||
|
|
Loading…
Reference in New Issue