[PATCH 2/2] composite: add panoramix support

Jamey Sharp jamey at minilop.net
Fri Nov 12 10:24:03 PST 2010


These uses of dixLookupResourceBy* are more complicated than they need
to be: those functions don't return BadValue for types that have had
SetResourceTypeErrorValue called.

So on an XRT_WINDOW lookup, for example, you can replace "(rc ==
BadValue) ? BadWindow : rc" with "rc".

I think the patch still works despite this but I went to a fair bit of
trouble to clean those up so I'd like to not see them come back. :-)

Jamey

On Wed, Nov 10, 2010 at 12:35 PM, Adam Jackson <ajax at redhat.com> wrote:
> From: David Reveman <davidr at novell.com>
>
> Taken from:
> 50d2d8c8969c165582d215c6e85c4be9eac02b6a
> dbffd0d44a33dcc84898c7a891d7ba212f65cbb8
> 9b5b102163b4eaa1b70647354fcab4f6e461c94c
> 75f9b98af31abf537ac6616c99f3797deb7ba017
> 07fba8b1f77a6bca44ea6568b346a18ce9d1e61d
>
> With minor style fixes, ported to dixLookupResourceByType, and ported
> away from client->noClientException and xalloc/xfree.
>
> v2: Fix a memory leak in PanoramiXCompositeNameWindowPixmap, spotted by
> James Jones.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>  Xext/panoramiX.c        |    7 +
>  composite/compext.c     |  361 ++++++++++++++++++++++++++++++++++++++++++++++-
>  composite/compint.h     |    3 +
>  composite/compoverlay.c |   17 ++-
>  composite/compwindow.c  |   22 +++-
>  configure.ac            |    2 +-
>  6 files changed, 398 insertions(+), 14 deletions(-)
>
> diff --git a/Xext/panoramiX.c b/Xext/panoramiX.c
> index 5a395fc..e6334bd 100644
> --- a/Xext/panoramiX.c
> +++ b/Xext/panoramiX.c
> @@ -56,6 +56,9 @@ Equipment Corporation.
>  #ifdef XFIXES
>  #include "xfixesint.h"
>  #endif
> +#ifdef COMPOSITE
> +#include "compint.h"
> +#endif
>  #include "modinit.h"
>  #include "protocol-versions.h"
>
> @@ -587,6 +590,10 @@ void PanoramiXExtensionInit(int argc, char *argv[])
>  #ifdef XFIXES
>     PanoramiXFixesInit ();
>  #endif
> +#ifdef COMPOSITE
> +    PanoramiXCompositeInit ();
> +#endif
> +
>  }
>
>  extern Bool CreateConnectionBlock(void);
> diff --git a/composite/compext.c b/composite/compext.c
> index 30d9dc2..f7205c8 100644
> --- a/composite/compext.c
> +++ b/composite/compext.c
> @@ -535,13 +535,6 @@ CompositeExtensionInit (void)
>        if (GetPictureScreenIfSet(pScreen) == NULL)
>            return;
>     }
> -#ifdef PANORAMIX
> -    /* Xinerama's rewriting of window drawing before Composite gets to it
> -     * breaks Composite.
> -     */
> -    if (!noPanoramiXExtension)
> -       return;
> -#endif
>
>     CompositeClientWindowType = CreateNewResourceType
>        (FreeCompositeClientWindow, "CompositeClientWindow");
> @@ -582,3 +575,357 @@ CompositeExtensionInit (void)
>     /* Initialization succeeded */
>     noCompositeExtension = FALSE;
>  }
> +
> +#ifdef PANORAMIX
> +#include "panoramiXsrv.h"
> +
> +int (*PanoramiXSaveCompositeVector[CompositeNumberRequests]) (ClientPtr);
> +
> +static int
> +PanoramiXCompositeRedirectWindow (ClientPtr client)
> +{
> +    PanoramiXRes *win;
> +    int rc = 0, j;
> +    REQUEST(xCompositeRedirectWindowReq);
> +
> +    REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    FOR_NSCREENS_FORWARD(j) {
> +       stuff->window = win->info[j].id;
> +       rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
> +       if (rc != Success) break;
> +    }
> +
> +    return rc;
> +}
> +
> +static int
> +PanoramiXCompositeRedirectSubwindows (ClientPtr client)
> +{
> +    PanoramiXRes *win;
> +    int rc = 0, j;
> +    REQUEST(xCompositeRedirectSubwindowsReq);
> +
> +    REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    FOR_NSCREENS_FORWARD(j) {
> +       stuff->window = win->info[j].id;
> +       rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
> +       if (rc != Success) break;
> +    }
> +
> +    return rc;
> +}
> +
> +static int
> +PanoramiXCompositeUnredirectWindow (ClientPtr client)
> +{
> +    PanoramiXRes *win;
> +    int rc = 0, j;
> +    REQUEST(xCompositeUnredirectWindowReq);
> +
> +    REQUEST_SIZE_MATCH(xCompositeUnredirectWindowReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    FOR_NSCREENS_FORWARD(j) {
> +       stuff->window = win->info[j].id;
> +       rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
> +       if (rc != Success) break;
> +    }
> +
> +    return rc;
> +}
> +
> +static int
> +PanoramiXCompositeUnredirectSubwindows (ClientPtr client)
> +{
> +    PanoramiXRes *win;
> +    int rc = 0, j;
> +    REQUEST(xCompositeUnredirectSubwindowsReq);
> +
> +    REQUEST_SIZE_MATCH(xCompositeUnredirectSubwindowsReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    FOR_NSCREENS_FORWARD(j) {
> +       rc = (*PanoramiXSaveCompositeVector[stuff->compositeReqType]) (client);
> +       if (rc != Success) break;
> +    }
> +
> +    return rc;
> +}
> +
> +static int
> +PanoramiXCompositeNameWindowPixmap (ClientPtr client)
> +{
> +    WindowPtr      pWin;
> +    CompWindowPtr   cw;
> +    PixmapPtr      pPixmap;
> +    int rc;
> +    PanoramiXRes *win, *newPix;
> +    int i;
> +    REQUEST(xCompositeNameWindowPixmapReq);
> +
> +    REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    LEGAL_NEW_RESOURCE (stuff->pixmap, client);
> +
> +    if(!(newPix = malloc(sizeof(PanoramiXRes))))
> +       return BadAlloc;
> +
> +    newPix->type = XRT_PIXMAP;
> +    newPix->u.pix.shared = FALSE;
> +    newPix->info[0].id = stuff->pixmap;
> +
> +    for (i = 1; i < PanoramiXNumScreens; i++)
> +       newPix->info[i].id = FakeClientID (client->index);
> +
> +    FOR_NSCREENS(i) {
> +       rc = dixLookupResourceByType ((void **) &pWin, win->info[i].id,
> +                                     RT_WINDOW, client, DixGetAttrAccess);
> +       if (rc != Success)
> +       {
> +           client->errorValue = stuff->window;
> +           free (newPix);
> +           return (rc == BadValue) ? BadWindow : rc;
> +       }
> +
> +       if (!pWin->viewable)
> +       {
> +           free (newPix);
> +           return BadMatch;
> +       }
> +
> +       cw = GetCompWindow (pWin);
> +       if (!cw)
> +       {
> +           free (newPix);
> +           return BadMatch;
> +       }
> +
> +       pPixmap = (*pWin->drawable.pScreen->GetWindowPixmap) (pWin);
> +       if (!pPixmap)
> +       {
> +           free (newPix);
> +           return BadMatch;
> +       }
> +
> +       if (!AddResource (newPix->info[i].id, RT_PIXMAP,
> +                         (pointer) pPixmap))
> +           return BadAlloc;
> +
> +       ++pPixmap->refcnt;
> +    }
> +
> +    if (!AddResource (stuff->pixmap, XRT_PIXMAP, (pointer) newPix))
> +       return BadAlloc;
> +
> +    return Success;
> +}
> +
> +
> +static int
> +PanoramiXCompositeGetOverlayWindow (ClientPtr client)
> +{
> +    REQUEST(xCompositeGetOverlayWindowReq);
> +    xCompositeGetOverlayWindowReply rep;
> +    WindowPtr pWin;
> +    ScreenPtr pScreen;
> +    CompScreenPtr cs;
> +    CompOverlayClientPtr pOc;
> +    int rc;
> +    PanoramiXRes *win, *overlayWin = NULL;
> +    int i;
> +
> +    REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    cs = GetCompScreen(screenInfo.screens[0]);
> +    if (!cs->pOverlayWin)
> +    {
> +       if(!(overlayWin = malloc(sizeof(PanoramiXRes))))
> +           return BadAlloc;
> +
> +       overlayWin->type = XRT_WINDOW;
> +       overlayWin->u.win.root = FALSE;
> +    }
> +
> +    FOR_NSCREENS_BACKWARD(i) {
> +       rc = dixLookupResourceByType((pointer *)&pWin, win->info[i].id,
> +                                    RT_WINDOW, client, DixGetAttrAccess);
> +       if (rc != Success)
> +       {
> +           client->errorValue = stuff->window;
> +           return (rc == BadValue) ? BadWindow : rc;
> +       }
> +       pScreen = pWin->drawable.pScreen;
> +
> +       /*
> +        * Create an OverlayClient structure to mark this client's
> +        * interest in the overlay window
> +        */
> +       pOc = compCreateOverlayClient(pScreen, client);
> +       if (pOc == NULL)
> +           return BadAlloc;
> +
> +       /*
> +        * Make sure the overlay window exists
> +        */
> +       cs = GetCompScreen(pScreen);
> +       if (cs->pOverlayWin == NULL)
> +           if (!compCreateOverlayWindow(pScreen))
> +           {
> +               FreeResource (pOc->resource, RT_NONE);
> +               return BadAlloc;
> +           }
> +
> +       rc = XaceHook(XACE_RESOURCE_ACCESS, client,
> +                     cs->pOverlayWin->drawable.id,
> +                     RT_WINDOW, cs->pOverlayWin, RT_NONE, NULL,
> +                     DixGetAttrAccess);
> +       if (rc != Success)
> +       {
> +           FreeResource (pOc->resource, RT_NONE);
> +           return rc;
> +       }
> +    }
> +
> +    if (overlayWin)
> +    {
> +       FOR_NSCREENS(i) {
> +           cs = GetCompScreen(screenInfo.screens[i]);
> +           overlayWin->info[i].id = cs->pOverlayWin->drawable.id;
> +       }
> +
> +       AddResource(overlayWin->info[0].id, XRT_WINDOW, overlayWin);
> +    }
> +
> +    cs = GetCompScreen(screenInfo.screens[0]);
> +
> +    rep.type = X_Reply;
> +    rep.sequenceNumber = client->sequence;
> +    rep.length = 0;
> +    rep.overlayWin = cs->pOverlayWin->drawable.id;
> +
> +    if (client->swapped)
> +    {
> +       int n;
> +       swaps(&rep.sequenceNumber, n);
> +       swapl(&rep.length, n);
> +       swapl(&rep.overlayWin, n);
> +    }
> +    (void) WriteToClient(client, sz_xCompositeGetOverlayWindowReply, (char *)&rep);
> +
> +    return Success;
> +}
> +
> +static int
> +PanoramiXCompositeReleaseOverlayWindow (ClientPtr client)
> +{
> +    REQUEST(xCompositeReleaseOverlayWindowReq);
> +    WindowPtr pWin;
> +    ScreenPtr pScreen;
> +    CompOverlayClientPtr pOc;
> +    PanoramiXRes *win;
> +    int i, rc;
> +
> +    REQUEST_SIZE_MATCH(xCompositeReleaseOverlayWindowReq);
> +
> +    if ((rc = dixLookupResourceByType((void **)&win, stuff->window, XRT_WINDOW,
> +                                     client, DixUnknownAccess))) {
> +       client->errorValue = stuff->window;
> +       return (rc == BadValue) ? BadWindow : rc;
> +    }
> +
> +    FOR_NSCREENS_BACKWARD(i) {
> +       if ((rc = dixLookupResourceByType((void **)&pWin, win->info[i].id,
> +                                         XRT_WINDOW, client,
> +                                         DixUnknownAccess))) {
> +           client->errorValue = stuff->window;
> +           return (rc == BadValue) ? BadWindow : rc;
> +       }
> +       pScreen = pWin->drawable.pScreen;
> +
> +       /*
> +        * Has client queried a reference to the overlay window
> +        * on this screen? If not, generate an error.
> +        */
> +       pOc = compFindOverlayClient (pWin->drawable.pScreen, client);
> +       if (pOc == NULL)
> +           return BadMatch;
> +
> +       /* The delete function will free the client structure */
> +       FreeResource (pOc->resource, RT_NONE);
> +    }
> +
> +    return Success;
> +}
> +
> +void
> +PanoramiXCompositeInit (void)
> +{
> +    int i;
> +
> +    for (i = 0; i < CompositeNumberRequests; i++)
> +       PanoramiXSaveCompositeVector[i] = ProcCompositeVector[i];
> +    /*
> +     * Stuff in Xinerama aware request processing hooks
> +     */
> +    ProcCompositeVector[X_CompositeRedirectWindow] =
> +       PanoramiXCompositeRedirectWindow;
> +    ProcCompositeVector[X_CompositeRedirectSubwindows] =
> +       PanoramiXCompositeRedirectSubwindows;
> +    ProcCompositeVector[X_CompositeUnredirectWindow] =
> +       PanoramiXCompositeUnredirectWindow;
> +    ProcCompositeVector[X_CompositeUnredirectSubwindows] =
> +       PanoramiXCompositeUnredirectSubwindows;
> +    ProcCompositeVector[X_CompositeNameWindowPixmap] =
> +       PanoramiXCompositeNameWindowPixmap;
> +    ProcCompositeVector[X_CompositeGetOverlayWindow] =
> +       PanoramiXCompositeGetOverlayWindow;
> +    ProcCompositeVector[X_CompositeReleaseOverlayWindow] =
> +       PanoramiXCompositeReleaseOverlayWindow;
> +}
> +
> +void
> +PanoramiXCompositeReset (void)
> +{
> +    int i;
> +
> +    for (i = 0; i < CompositeNumberRequests; i++)
> +       ProcCompositeVector[i] = PanoramiXSaveCompositeVector[i];
> +}
> +
> +#endif
> diff --git a/composite/compint.h b/composite/compint.h
> index 80083b0..ae41c44 100644
> --- a/composite/compint.h
> +++ b/composite/compint.h
> @@ -326,4 +326,7 @@ int
>  compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
>                 int bw, WindowPtr pSib);
>
> +void PanoramiXCompositeInit (void);
> +void PanoramiXCompositeReset (void);
> +
>  #endif /* _COMPINT_H_ */
> diff --git a/composite/compoverlay.c b/composite/compoverlay.c
> index 67b566c..3bace79 100644
> --- a/composite/compoverlay.c
> +++ b/composite/compoverlay.c
> @@ -48,6 +48,10 @@
>  #include "compint.h"
>  #include "xace.h"
>
> +#ifdef PANORAMIX
> +#include "panoramiXsrv.h"
> +#endif
> +
>  /*
>  * Delete the given overlay client list element from its screen list.
>  */
> @@ -128,10 +132,19 @@ compCreateOverlayWindow (ScreenPtr pScreen)
>     WindowPtr      pWin;
>     XID                    attrs[] = { None, TRUE }; /* backPixmap, overrideRedirect */
>     int                    result;
> +    int                    w = pScreen->width;
> +    int                    h = pScreen->height;
> +
> +#ifdef PANORAMIX
> +    if (!noPanoramiXExtension)
> +    {
> +       w = PanoramiXPixWidth;
> +       h = PanoramiXPixHeight;
> +    }
> +#endif
>
>     pWin = cs->pOverlayWin =
> -       CreateWindow (cs->overlayWid, pRoot,
> -                     0, 0, pScreen->width, pScreen->height, 0,
> +       CreateWindow (cs->overlayWid, pRoot, 0, 0, w, h, 0,
>                      InputOutput, CWBackPixmap | CWOverrideRedirect, &attrs[0],
>                      pRoot->drawable.depth,
>                      serverClient, pScreen->rootVisual, &result);
> diff --git a/composite/compwindow.c b/composite/compwindow.c
> index 8849dc3..f80b5db 100644
> --- a/composite/compwindow.c
> +++ b/composite/compwindow.c
> @@ -47,6 +47,10 @@
>
>  #include "compint.h"
>
> +#ifdef PANORAMIX
> +#include "panoramiXsrv.h"
> +#endif
> +
>  #ifdef COMPOSITE_DEBUG
>  static int
>  compCheckWindow (WindowPtr pWin, pointer data)
> @@ -172,16 +176,26 @@ updateOverlayWindow(ScreenPtr pScreen)
>        CompScreenPtr cs;
>        WindowPtr pWin; /* overlay window */
>        XID vlist[2];
> +       int w = pScreen->width;
> +       int h = pScreen->height;
> +
> +#ifdef PANORAMIX
> +       if (!noPanoramiXExtension)
> +       {
> +           w = PanoramiXPixWidth;
> +           h = PanoramiXPixHeight;
> +       }
> +#endif
>
>        cs = GetCompScreen(pScreen);
>        if ((pWin = cs->pOverlayWin) != NULL) {
> -               if ((pWin->drawable.width == pScreen->width) &&
> -                       (pWin->drawable.height == pScreen->height))
> +               if ((pWin->drawable.width == w) &&
> +                       (pWin->drawable.height == h))
>                        return Success;
>
>                /* Let's resize the overlay window. */
> -               vlist[0] = pScreen->width;
> -               vlist[1] = pScreen->height;
> +               vlist[0] = w;
> +               vlist[1] = h;
>                return ConfigureWindow(pWin, CWWidth | CWHeight, vlist, wClient(pWin));
>        }
>
> diff --git a/configure.ac b/configure.ac
> index e8f9473..b05f0c1 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1979,7 +1979,7 @@ if test "x$DMX" = xyes; then
>        fi
>        DMX_INCLUDES="$XEXT_INC $RENDER_INC $RECORD_INC"
>        XDMX_CFLAGS="$DMXMODULES_CFLAGS"
> -       XDMX_LIBS="$FB_LIB $MI_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $XEXT_LIB $MAIN_LIB $DIX_LIB $OS_LIB $FIXES_LIB"
> +       XDMX_LIBS="$FB_LIB $MI_LIB $RENDER_LIB $RECORD_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $MIEXT_SHADOW_LIB $MIEXT_DAMAGE_LIB $XEXT_LIB $COMPOSITE_LIB $DAMAGE_LIB $MAIN_LIB $DIX_LIB $CONFIG_LIB $OS_LIB $FIXES_LIB"
>        XDMX_SYS_LIBS="$DMXMODULES_LIBS"
>        AC_SUBST([XDMX_CFLAGS])
>        AC_SUBST([XDMX_LIBS])
> --
> 1.7.2.3
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>


More information about the xorg-devel mailing list