On Mon, Mar 31, 2014 at 11:59:47PM -0700, Keith Packard wrote: > Kristian Høgsberg <[email protected]> writes: > > > This allows DDXen to override the window picking to account for > > native windows not seen by the X server. The bulk of the picking logic > > is exposed as a new helper function, miSpriteTrace(). This function > > completes the sprite trace filled out by the caller, and can be set up > > to start the search from a given toplevel window. > > I guess I was hoping for a minimal patch that just added an XYToWindow > screen function and then had the existing XYToWindow call that so that > all existing XYToWindow calls would 'just work'. I'm also not quite sure > what the device argument to the new function is for; that really isn't > part of this operation. > > How about this version instead? >
That works for me, let's replace my patch with this one in the series. Kristian > From 8dc42ff7a901b0811a1c8878c5e5b0fbb6107074 Mon Sep 17 00:00:00 2001 > From: Keith Packard <[email protected]> > Date: Mon, 31 Mar 2014 23:55:25 -0700 > Subject: [PATCH] Make XYToWindow a screen function > > This allows DDXen to override the window picking to account for > native windows not seen by the X server. The bulk of the picking logic > is exposed as a new helper function, miSpriteTrace(). This function > completes the sprite trace filled out by the caller, and can be set up > to start the search from a given toplevel window. > > v2: Leave existing XYToWindow API in place for API compatibility > > Signed-off-by: Keith Packard <[email protected]> > --- > dix/events.c | 46 +++--------------------------------- > include/input.h | 1 + > include/scrnintstr.h | 4 ++++ > mi/mi.h | 4 ++++ > mi/miscrinit.c | 1 + > mi/miwindow.c | 66 > ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 6 files changed, 79 insertions(+), 43 deletions(-) > > diff --git a/dix/events.c b/dix/events.c > index f05dada..125a0ee 100644 > --- a/dix/events.c > +++ b/dix/events.c > @@ -2835,7 +2835,7 @@ DeliverEvents(WindowPtr pWin, xEvent *xE, int count, > WindowPtr otherParent) > return deliveries; > } > > -static Bool > +Bool > PointInBorderSize(WindowPtr pWin, int x, int y) > { > BoxRec box; > @@ -2876,49 +2876,9 @@ PointInBorderSize(WindowPtr pWin, int x, int y) > WindowPtr > XYToWindow(SpritePtr pSprite, int x, int y) > { > - WindowPtr pWin; > - BoxRec box; > + ScreenPtr pScreen = RootWindow(pSprite)->drawable.pScreen; > > - pSprite->spriteTraceGood = 1; /* root window still there */ > - pWin = RootWindow(pSprite)->firstChild; > - while (pWin) { > - if ((pWin->mapped) && > - (x >= pWin->drawable.x - wBorderWidth(pWin)) && > - (x < pWin->drawable.x + (int) pWin->drawable.width + > - wBorderWidth(pWin)) && > - (y >= pWin->drawable.y - wBorderWidth(pWin)) && > - (y < pWin->drawable.y + (int) pWin->drawable.height + > - wBorderWidth(pWin)) > - /* When a window is shaped, a further check > - * is made to see if the point is inside > - * borderSize > - */ > - && (!wBoundingShape(pWin) || PointInBorderSize(pWin, x, y)) > - && (!wInputShape(pWin) || > - RegionContainsPoint(wInputShape(pWin), > - x - pWin->drawable.x, > - y - pWin->drawable.y, &box)) > -#ifdef ROOTLESS > - /* In rootless mode windows may be offscreen, even when > - * they're in X's stack. (E.g. if the native window system > - * implements some form of virtual desktop system). > - */ > - && !pWin->rootlessUnhittable > -#endif > - ) { > - if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize) { > - pSprite->spriteTraceSize += 10; > - pSprite->spriteTrace = realloc(pSprite->spriteTrace, > - pSprite->spriteTraceSize * > - sizeof(WindowPtr)); > - } > - pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin; > - pWin = pWin->firstChild; > - } > - else > - pWin = pWin->nextSib; > - } > - return DeepestSpriteWin(pSprite); > + return (*pScreen->XYToWindow)(pScreen, pSprite, x, y); > } > > /** > diff --git a/include/input.h b/include/input.h > index 36463f2..cbf949b 100644 > --- a/include/input.h > +++ b/include/input.h > @@ -607,6 +607,7 @@ extern int GetXI2MaskByte(XI2Mask *mask, DeviceIntPtr > dev, int event_type); > void FixUpEventFromWindow(SpritePtr pSprite, > xEvent *xE, > WindowPtr pWin, Window child, Bool calcChild); > +extern Bool PointInBorderSize(WindowPtr pWin, int x, int y); > extern WindowPtr XYToWindow(SpritePtr pSprite, int x, int y); > extern int EventIsDeliverable(DeviceIntPtr dev, int evtype, WindowPtr win); > extern Bool ActivatePassiveGrab(DeviceIntPtr dev, GrabPtr grab, > diff --git a/include/scrnintstr.h b/include/scrnintstr.h > index 86da789..5197c79 100644 > --- a/include/scrnintstr.h > +++ b/include/scrnintstr.h > @@ -353,6 +353,9 @@ typedef Bool (*StopPixmapTrackingProcPtr)(PixmapPtr, > PixmapPtr); > > typedef Bool (*ReplaceScanoutPixmapProcPtr)(DrawablePtr, PixmapPtr, Bool); > > +typedef WindowPtr (*XYToWindowProcPtr)(ScreenPtr pScreen, > + SpritePtr pSprite, int x, int y); > + > typedef struct _Screen { > int myNum; /* index of this instance in Screens[] */ > ATOM id; > @@ -513,6 +516,7 @@ typedef struct _Screen { > struct xorg_list offload_head; > > ReplaceScanoutPixmapProcPtr ReplaceScanoutPixmap; > + XYToWindowProcPtr XYToWindow; > } ScreenRec; > > static inline RegionPtr > diff --git a/mi/mi.h b/mi/mi.h > index 950ee38..1209a16 100644 > --- a/mi/mi.h > +++ b/mi/mi.h > @@ -507,6 +507,10 @@ extern _X_EXPORT void miMarkUnrealizedWindow(WindowPtr > /*pChild */ , > extern _X_EXPORT void miSegregateChildren(WindowPtr pWin, RegionPtr pReg, > int depth); > > +extern _X_EXPORT WindowPtr miSpriteTrace(SpritePtr pSprite, int x, int y); > + > +extern _X_EXPORT WindowPtr miXYToWindow(ScreenPtr pScreen, SpritePtr > pSprite, int x, int y); > + > /* mizerarc.c */ > > extern _X_EXPORT void miZeroPolyArc(DrawablePtr /*pDraw */ , > diff --git a/mi/miscrinit.c b/mi/miscrinit.c > index 6aed52f..00c15f7 100644 > --- a/mi/miscrinit.c > +++ b/mi/miscrinit.c > @@ -272,6 +272,7 @@ miScreenInit(ScreenPtr pScreen, void *pbits, /* pointer > to screen bits */ > pScreen->ChangeBorderWidth = miChangeBorderWidth; > pScreen->SetShape = miSetShape; > pScreen->MarkUnrealizedWindow = miMarkUnrealizedWindow; > + pScreen->XYToWindow = miXYToWindow; > > miSetZeroLineBias(pScreen, DEFAULTZEROLINEBIAS); > > diff --git a/mi/miwindow.c b/mi/miwindow.c > index 697ffbc..951b8c5 100644 > --- a/mi/miwindow.c > +++ b/mi/miwindow.c > @@ -57,6 +57,7 @@ SOFTWARE. > #include "scrnintstr.h" > #include "pixmapstr.h" > #include "mivalidate.h" > +#include "inputstr.h" > > void > miClearToBackground(WindowPtr pWin, > @@ -758,3 +759,68 @@ miSegregateChildren(WindowPtr pWin, RegionPtr pReg, int > depth) > miSegregateChildren(pChild, pReg, depth); > } > } > + > +WindowPtr > +miSpriteTrace(SpritePtr pSprite, int x, int y) > +{ > + WindowPtr pWin; > + BoxRec box; > + > + pWin = DeepestSpriteWin(pSprite); > + while (pWin) { > + if ((pWin->mapped) && > + (x >= pWin->drawable.x - wBorderWidth(pWin)) && > + (x < pWin->drawable.x + (int) pWin->drawable.width + > + wBorderWidth(pWin)) && > + (y >= pWin->drawable.y - wBorderWidth(pWin)) && > + (y < pWin->drawable.y + (int) pWin->drawable.height + > + wBorderWidth(pWin)) > + /* When a window is shaped, a further check > + * is made to see if the point is inside > + * borderSize > + */ > + && (!wBoundingShape(pWin) || PointInBorderSize(pWin, x, y)) > + && (!wInputShape(pWin) || > + RegionContainsPoint(wInputShape(pWin), > + x - pWin->drawable.x, > + y - pWin->drawable.y, &box)) > +#ifdef ROOTLESS > + /* In rootless mode windows may be offscreen, even when > + * they're in X's stack. (E.g. if the native window system > + * implements some form of virtual desktop system). > + */ > + && !pWin->rootlessUnhittable > +#endif > + ) { > + if (pSprite->spriteTraceGood >= pSprite->spriteTraceSize) { > + pSprite->spriteTraceSize += 10; > + pSprite->spriteTrace = realloc(pSprite->spriteTrace, > + pSprite->spriteTraceSize * > + sizeof(WindowPtr)); > + } > + pSprite->spriteTrace[pSprite->spriteTraceGood++] = pWin; > + pWin = pWin->firstChild; > + } > + else > + pWin = pWin->nextSib; > + } > + return DeepestSpriteWin(pSprite); > +} > + > +/** > + * Traversed from the root window to the window at the position x/y. While > + * traversing, it sets up the traversal history in the spriteTrace array. > + * After completing, the spriteTrace history is set in the following way: > + * spriteTrace[0] ... root window > + * spriteTrace[1] ... top level window that encloses x/y > + * ... > + * spriteTrace[spriteTraceGood - 1] ... window at x/y > + * > + * @returns the window at the given coordinates. > + */ > +WindowPtr > +miXYToWindow(ScreenPtr pScreen, SpritePtr pSprite, int x, int y) > +{ > + pSprite->spriteTraceGood = 1; /* root window still there */ > + return miSpriteTrace(pSprite, x, y); > +} > -- > 1.9.0 > > > -- > [email protected] _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
