コード例 #1
0
ファイル: sleepuntil.c プロジェクト: XQuartz/xorg-server
static void
SertafiedBlockHandler(void *data, void *wt)
{
    SertafiedPtr pReq, pNext;
    unsigned long delay;
    TimeStamp now;

    if (!pPending)
        return;
    now.milliseconds = GetTimeInMillis();
    now.months = currentTime.months;
    if ((int) (now.milliseconds - currentTime.milliseconds) < 0)
        now.months++;
    for (pReq = pPending; pReq; pReq = pNext) {
        pNext = pReq->next;
        if (CompareTimeStamps(pReq->revive, now) == LATER)
            break;
        FreeResource(pReq->id, RT_NONE);

        /* AttendClient() may have been called via the resource delete
         * function so a client may have input to be processed and so
         *  set delay to 0 to prevent blocking in WaitForSomething().
         */
        AdjustWaitForDelay(wt, 0);
    }
    pReq = pPending;
    if (!pReq)
        return;
    delay = pReq->revive.milliseconds - now.milliseconds;
    AdjustWaitForDelay(wt, delay);
}
コード例 #2
0
ファイル: animcur.c プロジェクト: eriytt/xserver-xsdl
static void
AnimCurScreenBlockHandler (int screenNum,
			   pointer blockData,
			   pointer pTimeout,
			   pointer pReadmask)
{
    ScreenPtr		pScreen = screenInfo.screens[screenNum];
    AnimCurScreenPtr    as = GetAnimCurScreen(pScreen);
    DeviceIntPtr        dev;
    Bool                activeDevice = FALSE;
    CARD32              now = 0, 
                        soonest = ~0; /* earliest time to wakeup again */

    for (dev = inputInfo.devices; dev; dev = dev->next)
    {
	if (IsPointerDevice(dev) && pScreen == dev->spriteInfo->anim.pScreen)
	{
	    if (!activeDevice) {
                now = GetTimeInMillis ();
                activeDevice = TRUE;
            }

	    if ((INT32) (now - dev->spriteInfo->anim.time) >= 0)
	    {
		AnimCurPtr ac  = GetAnimCur(dev->spriteInfo->anim.pCursor);
		int        elt = (dev->spriteInfo->anim.elt + 1) % ac->nelt;
		DisplayCursorProcPtr DisplayCursor;

		/*
		 * Not a simple Unwrap/Wrap as this
		 * isn't called along the DisplayCursor 
		 * wrapper chain.
		 */
		DisplayCursor = pScreen->DisplayCursor;
		pScreen->DisplayCursor = as->DisplayCursor;
		(void) (*pScreen->DisplayCursor) (dev,
						  pScreen, 
						  ac->elts[elt].pCursor);
		as->DisplayCursor = pScreen->DisplayCursor;
		pScreen->DisplayCursor = DisplayCursor;

		dev->spriteInfo->anim.elt = elt;
		dev->spriteInfo->anim.time = now + ac->elts[elt].delay;
	    }

	    if (soonest > dev->spriteInfo->anim.time)
		soonest = dev->spriteInfo->anim.time;
	}
    }

    if (activeDevice)
        AdjustWaitForDelay (pTimeout, soonest - now);

    Unwrap (as, pScreen, BlockHandler);
    (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
    if (activeDevice)
        Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
    else
        as->BlockHandler = NULL;
}
コード例 #3
0
ファイル: xdmcp.c プロジェクト: halfline/xserver
 /*ARGSUSED*/ static void
XdmcpBlockHandler(void *data, /* unused */
                  struct timeval **wt, void *pReadmask)
{
    fd_set *last_select_mask = (fd_set *) pReadmask;
    CARD32 millisToGo;

    if (state == XDM_OFF)
        return;
    FD_SET(xdmcpSocket, last_select_mask);
#if defined(IPv6) && defined(AF_INET6)
    if (xdmcpSocket6 >= 0)
        FD_SET(xdmcpSocket6, last_select_mask);
#endif
    if (timeOutTime == 0)
        return;
    millisToGo = timeOutTime - GetTimeInMillis();
    if ((int) millisToGo < 0)
        millisToGo = 0;
    AdjustWaitForDelay(wt, millisToGo);
}
コード例 #4
0
ファイル: ephyr.c プロジェクト: XQuartz/xorg-server
static void
ephyrScreenBlockHandler(ScreenPtr pScreen, void *timeout)
{
    KdScreenPriv(pScreen);
    KdScreenInfo *screen = pScreenPriv->screen;
    EphyrScrPriv *scrpriv = screen->driver;

    pScreen->BlockHandler = scrpriv->BlockHandler;
    (*pScreen->BlockHandler)(pScreen, timeout);
    scrpriv->BlockHandler = pScreen->BlockHandler;
    pScreen->BlockHandler = ephyrScreenBlockHandler;

    if (scrpriv->pDamage)
        ephyrInternalDamageRedisplay(pScreen);

    if (hostx_has_queued_event()) {
        if (!QueueWorkProc(ephyrEventWorkProc, NULL, NULL))
            FatalError("cannot queue event processing in ephyr block handler");
        AdjustWaitForDelay(timeout, 0);
    }
}
コード例 #5
0
ファイル: animcur.c プロジェクト: BackupTheBerlios/dri-ex-svn
static void
AnimCurScreenBlockHandler (int screenNum,
			   pointer blockData,
			   pointer pTimeout,
			   pointer pReadmask)
{
    ScreenPtr		pScreen = screenInfo.screens[screenNum];
    AnimCurScreenPtr    as = GetAnimCurScreen(pScreen);

    if (pScreen == animCurState.pScreen)
    {
	CARD32		now = GetTimeInMillis ();

	if ((INT32) (now - animCurState.time) >= 0)
	{
	    AnimCurPtr		    ac = GetAnimCur(animCurState.pCursor);
	    int			    elt = (animCurState.elt + 1) % ac->nelt;
	    DisplayCursorProcPtr    DisplayCursor;

	    /*
	     * Not a simple Unwrap/Wrap as this
	     * isn't called along the DisplayCursor 
	     * wrapper chain.
	     */
	    DisplayCursor = pScreen->DisplayCursor;
	    pScreen->DisplayCursor = as->DisplayCursor;
	    (void) (*pScreen->DisplayCursor) (pScreen, ac->elts[elt].pCursor);
	    as->DisplayCursor = pScreen->DisplayCursor;
	    pScreen->DisplayCursor = DisplayCursor;

	    animCurState.elt = elt;
	    animCurState.time = now + ac->elts[elt].delay;
	}
	AdjustWaitForDelay (pTimeout, animCurState.time - now);
    }
    Unwrap (as, pScreen, BlockHandler);
    (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask);
    Wrap (as, pScreen, BlockHandler, AnimCurScreenBlockHandler);
}