Esempio n. 1
0
void
miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy)
{
    BoxPtr pBox;
    int numRects;
    xEvent *pEvent, *pe;
    int i;

    pBox = RegionRects(pRgn);
    numRects = RegionNumRects(pRgn);
    if (!(pEvent = calloc(1, numRects * sizeof(xEvent))))
        return;

    for (i = numRects, pe = pEvent; --i >= 0; pe++, pBox++) {
        pe->u.u.type = Expose;
        pe->u.expose.window = pWin->drawable.id;
        pe->u.expose.x = pBox->x1 - dx;
        pe->u.expose.y = pBox->y1 - dy;
        pe->u.expose.width = pBox->x2 - pBox->x1;
        pe->u.expose.height = pBox->y2 - pBox->y1;
        pe->u.expose.count = i;
    }

#ifdef PANORAMIX
    if (!noPanoramiXExtension) {
        int scrnum = pWin->drawable.pScreen->myNum;
        int x = 0, y = 0;
        XID realWin = 0;

        if (!pWin->parent) {
            x = screenInfo.screens[scrnum]->x;
            y = screenInfo.screens[scrnum]->y;
            pWin = screenInfo.screens[0]->root;
            realWin = pWin->drawable.id;
        }
        else if (scrnum) {
            PanoramiXRes *win;

            win = PanoramiXFindIDByScrnum(XRT_WINDOW,
                                          pWin->drawable.id, scrnum);
            if (!win) {
                free(pEvent);
                return;
            }
            realWin = win->info[0].id;
            dixLookupWindow(&pWin, realWin, serverClient, DixSendAccess);
        }
        if (x || y || scrnum)
            for (i = 0; i < numRects; i++) {
                pEvent[i].u.expose.window = realWin;
                pEvent[i].u.expose.x += x;
                pEvent[i].u.expose.y += y;
            }
    }
#endif

    DeliverEvents(pWin, pEvent, numRects, NullWindow);

    free(pEvent);
}
Esempio n. 2
0
void
miSendGraphicsExpose(ClientPtr client, RegionPtr pRgn, XID drawable,
                     int major, int minor)
{
    if (pRgn && !RegionNil(pRgn)) {
        xEvent *pEvent;
        xEvent *pe;
        BoxPtr pBox;
        int i;
        int numRects;

        numRects = RegionNumRects(pRgn);
        pBox = RegionRects(pRgn);
        if (!(pEvent = calloc(numRects, sizeof(xEvent))))
            return;
        pe = pEvent;

        for (i = 1; i <= numRects; i++, pe++, pBox++) {
            pe->u.u.type = GraphicsExpose;
            pe->u.graphicsExposure.drawable = drawable;
            pe->u.graphicsExposure.x = pBox->x1;
            pe->u.graphicsExposure.y = pBox->y1;
            pe->u.graphicsExposure.width = pBox->x2 - pBox->x1;
            pe->u.graphicsExposure.height = pBox->y2 - pBox->y1;
            pe->u.graphicsExposure.count = numRects - i;
            pe->u.graphicsExposure.majorEvent = major;
            pe->u.graphicsExposure.minorEvent = minor;
        }
        /* GraphicsExpose is a "critical event", which TryClientEvents
         * handles specially. */
        TryClientEvents(client, NULL, pEvent, numRects,
                        (Mask) 0, NoEventMask, NullGrab);
        free(pEvent);
    }
    else {
        xEvent event = {
            .u.noExposure.drawable = drawable,
            .u.noExposure.majorEvent = major,
            .u.noExposure.minorEvent = minor
        };
        event.u.u.type = NoExpose;
        WriteEventsToClient(client, 1, &event);
    }
}

void
miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy)
{
    BoxPtr pBox;
    int numRects;
    xEvent *pEvent, *pe;
    int i;

    pBox = RegionRects(pRgn);
    numRects = RegionNumRects(pRgn);
    if (!(pEvent = calloc(1, numRects * sizeof(xEvent))))
        return;

    for (i = numRects, pe = pEvent; --i >= 0; pe++, pBox++) {
        pe->u.u.type = Expose;
        pe->u.expose.window = pWin->drawable.id;
        pe->u.expose.x = pBox->x1 - dx;
        pe->u.expose.y = pBox->y1 - dy;
        pe->u.expose.width = pBox->x2 - pBox->x1;
        pe->u.expose.height = pBox->y2 - pBox->y1;
        pe->u.expose.count = i;
    }

#ifdef PANORAMIX
    if (!noPanoramiXExtension) {
        int scrnum = pWin->drawable.pScreen->myNum;
        int x = 0, y = 0;
        XID realWin = 0;

        if (!pWin->parent) {
            x = screenInfo.screens[scrnum]->x;
            y = screenInfo.screens[scrnum]->y;
            pWin = screenInfo.screens[0]->root;
            realWin = pWin->drawable.id;
        }
        else if (scrnum) {
            PanoramiXRes *win;

            win = PanoramiXFindIDByScrnum(XRT_WINDOW,
                                          pWin->drawable.id, scrnum);
            if (!win) {
                free(pEvent);
                return;
            }
            realWin = win->info[0].id;
            dixLookupWindow(&pWin, realWin, serverClient, DixSendAccess);
        }
        if (x || y || scrnum)
            for (i = 0; i < numRects; i++) {
                pEvent[i].u.expose.window = realWin;
                pEvent[i].u.expose.x += x;
                pEvent[i].u.expose.y += y;
            }
    }
#endif

    DeliverEvents(pWin, pEvent, numRects, NullWindow);

    free(pEvent);
}