⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 events.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 5 页
字号:
    register    WindowPtr win;    register    GrabPtr grab = inputInfo.pointer->grab;    if (syncEvents.playingEvents)	return;    if (grab)    {	if (grab->cursor)	{	    ChangeToCursor(grab->cursor);	    return;	}	if (IsParent(grab->window, sprite.win))	    win = sprite.win;	else	    win = grab->window;    }    else	win = sprite.win;    for (; win; win = win->parent)	if (win->optional && win->optional->cursor != NullCursor)	{	    ChangeToCursor(win->optional->cursor);	    return;	}}WindowPtrGetCurrentRootWindow(){    return ROOT;}WindowPtrGetSpriteWindow(){    return sprite.win;}CursorPtrGetSpriteCursor(){    return sprite.current;}voidGetSpritePosition(px, py)    int *px, *py;{    *px = sprite.hotPhys.x;    *py = sprite.hotPhys.y;}#define TIMESLOP (5 * 60 * 1000) /* 5 minutes */static void#if NeedFunctionPrototypesMonthChangedOrBadTime(register xEvent *xE)#elseMonthChangedOrBadTime(xE)    register xEvent *xE;#endif{    /* If the ddx/OS is careless about not processing timestamped events from     * different sources in sorted order, then it's possible for time to go     * backwards when it should not.  Here we ensure a decent time.     */    if ((currentTime.milliseconds - xE->u.keyButtonPointer.time) > TIMESLOP)	currentTime.months++;    else	xE->u.keyButtonPointer.time = currentTime.milliseconds;}#define NoticeTime(xE) { \    if ((xE)->u.keyButtonPointer.time < currentTime.milliseconds) \	MonthChangedOrBadTime(xE); \    currentTime.milliseconds = (xE)->u.keyButtonPointer.time; \    lastDeviceEventTime = currentTime; }voidNoticeEventTime(xE)    register xEvent *xE;{    if (!syncEvents.playingEvents)	NoticeTime(xE);}/************************************************************************** *            The following procedures deal with synchronous events       * **************************************************************************/voidEnqueueEvent(xE, device, count)    xEvent		*xE;    DeviceIntPtr	device;    int			count;{    register QdEventPtr tail = *syncEvents.pendtail;    register QdEventPtr qe;    xEvent		*qxE;    NoticeTime(xE);    if (DeviceEventCallback)    {	DeviceEventInfoRec eventinfo;	/*  The RECORD spec says that the root window field of motion events	 *  must be valid.  At this point, it hasn't been filled in yet, so	 *  we do it here.  The long expression below is necessary to get	 *  the current root window; the apparently reasonable alternative	 *  GetCurrentRootWindow()->drawable.id doesn't give you the right	 *  answer on the first motion event after a screen change because	 *  the data that GetCurrentRootWindow relies on hasn't been	 *  updated yet.	 */	if (xE->u.u.type == MotionNotify)	    xE->u.keyButtonPointer.root =		WindowTable[sprite.hotPhys.pScreen->myNum]->drawable.id;	eventinfo.events = xE;	eventinfo.count = count;	CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);    }    if (xE->u.u.type == MotionNotify)    {	sprite.hotPhys.x = xE->u.keyButtonPointer.rootX;	sprite.hotPhys.y = xE->u.keyButtonPointer.rootY;	/* do motion compression */	if (tail &&	    (tail->event->u.u.type == MotionNotify) &&	    (tail->pScreen == sprite.hotPhys.pScreen))	{	    tail->event->u.keyButtonPointer.rootX = sprite.hotPhys.x;	    tail->event->u.keyButtonPointer.rootY = sprite.hotPhys.y;	    tail->event->u.keyButtonPointer.time = xE->u.keyButtonPointer.time;	    tail->months = currentTime.months;	    return;	}    }    qe = (QdEventPtr)xalloc(sizeof(QdEventRec) + (count * sizeof(xEvent)));    if (!qe)	return;    qe->next = (QdEventPtr)NULL;    qe->device = device;    qe->pScreen = sprite.hotPhys.pScreen;    qe->months = currentTime.months;    qe->event = (xEvent *)(qe + 1);    qe->evcount = count;    for (qxE = qe->event; --count >= 0; qxE++, xE++)	*qxE = *xE;    if (tail)	syncEvents.pendtail = &tail->next;    *syncEvents.pendtail = qe;}static void#if NeedFunctionPrototypesPlayReleasedEvents(void)#elsePlayReleasedEvents()#endif{    register QdEventPtr *prev, qe;    register DeviceIntPtr dev;    prev = &syncEvents.pending;    while ( (qe = *prev) )    {	if (!qe->device->sync.frozen)	{	    *prev = qe->next;	    if (*syncEvents.pendtail == *prev)		syncEvents.pendtail = prev;	    if (qe->event->u.u.type == MotionNotify)		CheckVirtualMotion(qe, NullWindow);	    syncEvents.time.months = qe->months;	    syncEvents.time.milliseconds = qe->event->u.keyButtonPointer.time;	    (*qe->device->public.processInputProc)(qe->event, qe->device,						   qe->evcount);	    xfree(qe);	    for (dev = inputInfo.devices; dev && dev->sync.frozen; dev = dev->next)		;	    if (!dev)		break;	    /* Playing the event may have unfrozen another device. */	    /* So to play it safe, restart at the head of the queue */	    prev = &syncEvents.pending;	}	else	    prev = &qe->next;    } }static void#if NeedFunctionPrototypesFreezeThaw(register DeviceIntPtr dev, Bool frozen)#elseFreezeThaw(dev, frozen)    register DeviceIntPtr dev;    Bool frozen;#endif{    dev->sync.frozen = frozen;    if (frozen)	dev->public.processInputProc = dev->public.enqueueInputProc;    else	dev->public.processInputProc = dev->public.realInputProc;}voidComputeFreezes(){    register DeviceIntPtr replayDev = syncEvents.replayDev;    register int i;    WindowPtr w;    register xEvent *xE;    int count;    GrabPtr grab;    register DeviceIntPtr dev;    for (dev = inputInfo.devices; dev; dev = dev->next)	FreezeThaw(dev, dev->sync.other || (dev->sync.state >= FROZEN));    if (syncEvents.playingEvents || (!replayDev && !syncEvents.pending))	return;    syncEvents.playingEvents = TRUE;    if (replayDev)    {	xE = replayDev->sync.event;	count = replayDev->sync.evcount;	syncEvents.replayDev = (DeviceIntPtr)NULL;	w = XYToWindow(	    xE->u.keyButtonPointer.rootX, xE->u.keyButtonPointer.rootY);	for (i = 0; i < spriteTraceGood; i++)	    if (syncEvents.replayWin == spriteTrace[i])	    {		if (!CheckDeviceGrabs(replayDev, xE, i+1, count))		    if (replayDev->focus)			DeliverFocusedEvent(replayDev, xE, w, count);		    else			DeliverDeviceEvents(w, xE, NullGrab, NullWindow,					    replayDev, count);		goto playmore;	    }	/* must not still be in the same stack */	if (replayDev->focus)	    DeliverFocusedEvent(replayDev, xE, w, count);	else	    DeliverDeviceEvents(w, xE, NullGrab, NullWindow, replayDev, count);    }playmore:    for (dev = inputInfo.devices; dev; dev = dev->next)    {	if (!dev->sync.frozen)	{	    PlayReleasedEvents();	    break;	}    }    syncEvents.playingEvents = FALSE;    /* the following may have been skipped during replay, so do it now */    if ((grab = inputInfo.pointer->grab) && grab->confineTo)    {	if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen)	    sprite.hotPhys.x = sprite.hotPhys.y = 0;	ConfineCursorToWindow(grab->confineTo, TRUE, TRUE);    }    else	ConfineCursorToWindow(WindowTable[sprite.hotPhys.pScreen->myNum],			      TRUE, FALSE);    PostNewCursor();}voidCheckGrabForSyncs(thisDev, thisMode, otherMode)    register DeviceIntPtr thisDev;    Bool thisMode, otherMode;{    register GrabPtr grab = thisDev->grab;    register DeviceIntPtr dev;    if (thisMode == GrabModeSync)	thisDev->sync.state = FROZEN_NO_EVENT;    else    {	/* free both if same client owns both */	thisDev->sync.state = THAWED;	if (thisDev->sync.other &&	    (CLIENT_BITS(thisDev->sync.other->resource) ==	     CLIENT_BITS(grab->resource)))	    thisDev->sync.other = NullGrab;    }    for (dev = inputInfo.devices; dev; dev = dev->next)    {	if (dev != thisDev)	{	    if (otherMode == GrabModeSync)		dev->sync.other = grab;	    else	    {	/* free both if same client owns both */		if (dev->sync.other &&		    (CLIENT_BITS(dev->sync.other->resource) ==		     CLIENT_BITS(grab->resource)))		    dev->sync.other = NullGrab;	    }	}    }    ComputeFreezes();}voidActivatePointerGrab(mouse, grab, time, autoGrab)    register GrabPtr grab;    register DeviceIntPtr mouse;    TimeStamp time;    Bool autoGrab;{    WindowPtr oldWin = (mouse->grab) ? mouse->grab->window				     : sprite.win;    if (grab->confineTo)    {	if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen)	    sprite.hotPhys.x = sprite.hotPhys.y = 0;	ConfineCursorToWindow(grab->confineTo, FALSE, TRUE);    }    DoEnterLeaveEvents(oldWin, grab->window, NotifyGrab);    mouse->valuator->motionHintWindow = NullWindow;    if (syncEvents.playingEvents)	mouse->grabTime = syncEvents.time;    else	mouse->grabTime = time;    if (grab->cursor)	grab->cursor->refcnt++;    mouse->activeGrab = *grab;    mouse->grab = &mouse->activeGrab;    mouse->fromPassiveGrab = autoGrab;    PostNewCursor();    CheckGrabForSyncs(mouse,		      (Bool)grab->pointerMode, (Bool)grab->keyboardMode);}voidDeactivatePointerGrab(mouse)    register DeviceIntPtr mouse;{    register GrabPtr grab = mouse->grab;    register DeviceIntPtr dev;    mouse->valuator->motionHintWindow = NullWindow;    mouse->grab = NullGrab;    mouse->sync.state = NOT_GRABBED;    mouse->fromPassiveGrab = FALSE;    for (dev = inputInfo.devices; dev; dev = dev->next)    {	if (dev->sync.other == grab)	    dev->sync.other = NullGrab;    }    DoEnterLeaveEvents(grab->window, sprite.win, NotifyUngrab);    if (grab->confineTo)	ConfineCursorToWindow(ROOT, FALSE, FALSE);    PostNewCursor();    if (grab->cursor)	FreeCursor(grab->cursor, (Cursor)0);    ComputeFreezes();}voidActivateKeyboardGrab(keybd, grab, time, passive)    register DeviceIntPtr keybd;    GrabPtr grab;    TimeStamp time;    Bool passive;{    WindowPtr oldWin;    if (keybd->grab)	oldWin = keybd->grab->window;    else if (keybd->focus)	oldWin = keybd->focus->win;    else	oldWin = sprite.win;    if (oldWin == FollowKeyboardWin)	oldWin = inputInfo.keyboard->focus->win;    if (keybd->valuator)	keybd->valuator->motionHintWindow = NullWindow;    DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);    if (syncEvents.playingEvents)	keybd->grabTime = syncEvents.time;    else	keybd->grabTime = time;    keybd->activeGrab = *grab;    keybd->grab = &keybd->activeGrab;    keybd->fromPassiveGrab = passive;    CheckGrabForSyncs(keybd,		      (Bool)grab->keyboardMode, (Bool)grab->pointerMode);}voidDeactivateKeyboardGrab(keybd)    register DeviceIntPtr keybd;{    register GrabPtr grab = keybd->grab;    register DeviceIntPtr dev;    register WindowPtr focusWin = keybd->focus ? keybd->focus->win					       : sprite.win;    if (focusWin == FollowKeyboardWin)	focusWin = inputInfo.keyboard->focus->win;    if (keybd->valuator)	keybd->valuator->motionHintWindow = NullWindow;    keybd->grab = NullGrab;    keybd->sync.state = NOT_GRABBED;    keybd->fromPassiveGrab = FALSE;    for (dev = inputInfo.devices; dev; dev = dev->next)    {	if (dev->sync.other == grab)	    dev->sync.other = NullGrab;    }    DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);    ComputeFreezes();}voidAllowSome(client, time, thisDev, newState)    ClientPtr		client;    TimeStamp		time;    register DeviceIntPtr thisDev;    int			newState;{    Bool thisGrabbed, otherGrabbed, othersFrozen, thisSynced;    TimeStamp grabTime;    register DeviceIntPtr dev;    thisGrabbed = thisDev->grab && SameClient(thisDev->grab, client);    thisSynced = FALSE;    otherGrabbed = FALSE;    othersFrozen = TRUE;    grabTime = thisDev->grabTime;    for (dev = inputInfo.devices; dev; dev = dev->next)    {	if (dev == thisDev)	    continue;	if (dev->grab && SameClient(dev->grab, client))	{	    if (!(thisGrabbed || otherGrabbed) ||		(CompareTimeStamps(dev->grabTime, grabTime) == LATER))		grabTime = dev->grabTime;	    otherGrabbed = TRUE;	    if (thisDev->sync.other == dev->grab)		thisSynced = TRUE;	    if (dev->sync.state < FROZEN)		othersFrozen = FALSE;	}	else if (!dev->sync.other || !SameClient(dev->sync.other, client))	    othersFrozen = FALSE;    }    if (!((thisGrabbed && thisDev->sync.state >= FROZEN) || thisSynced))	return;    if ((CompareTimeStamps(time, currentTime) == LATER) ||	(CompareTimeStamps(time, grabTime) == EARLIER))	return;    switch (newState)    {	case THAWED:	 	       /* Async */	    if (thisGrabbed)		thisDev->sync.state = THAWED;	    if (thisSynced)		thisDev->sync.other = NullGrab;	    ComputeFreezes();	    break;	case FREEZE_NEXT_EVENT:		/* Sync */	    if (thisGrabbed)	    {		thisDev->sync.state = FREEZE_NEXT_EVENT;		if (thisSynced)		    thisDev->sync.other = NullGrab;		ComputeFreezes();	    }	    break;	case THAWED_BOTH:		/* AsyncBoth */	    if (othersFrozen)	    {		for (dev = inputInfo.devices; dev; dev = dev->next)		{		    if (dev->grab && SameClient(dev->grab, client))			dev->sync.state = THAWED;		    if (dev->sync.other && SameClient(dev->sync.other, client))			dev->sync.other = NullGrab;		}		ComputeFreezes();	    }	    break;	case FREEZE_BOTH_NEXT_EVENT:	/* SyncBoth */	    if (othersFrozen)	    {		for (dev = inputInfo.devices; dev; dev = dev->next)		{		    if (dev->grab && SameClient(dev->grab, client))			dev->sync.state = FREEZE_BOTH_NEXT_EVENT;		    if (dev->sync.other && SameClient(dev->sync.other, client))			dev->sync.other = NullGrab;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -