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

📄 events.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 5 页
字号:
	    {		Must_have_memory = TRUE; /* XXX */		thisDev->sync.event = (xEvent *)xrealloc(thisDev->sync.event,							 count*sizeof(xEvent));		Must_have_memory = FALSE; /* XXX */	    }	    thisDev->sync.evcount = count;	    for (dxE = thisDev->sync.event; --count >= 0; dxE++, xE++)		*dxE = *xE;	    break;	}}void#ifdef XKBCoreProcessKeyboardEvent (xE, keybd, count)#elseProcessKeyboardEvent (xE, keybd, count)#endif    register xEvent *xE;    register DeviceIntPtr keybd;    int count;{    int             key, bit;    register BYTE   *kptr;    register int    i;    register CARD8  modifiers;    register CARD16 mask;    GrabPtr         grab = keybd->grab;    Bool            deactivateGrab = FALSE;    register KeyClassPtr keyc = keybd->key;    if (!syncEvents.playingEvents)    {	NoticeTime(xE);	if (DeviceEventCallback)	{	    DeviceEventInfoRec eventinfo;	    eventinfo.events = xE;	    eventinfo.count = count;	    CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);	}    }    xE->u.keyButtonPointer.state = (keyc->state |				    inputInfo.pointer->button->state);    xE->u.keyButtonPointer.rootX = sprite.hot.x;    xE->u.keyButtonPointer.rootY = sprite.hot.y;    key = xE->u.u.detail;    kptr = &keyc->down[key >> 3];    bit = 1 << (key & 7);    modifiers = keyc->modifierMap[key];#ifdef DEBUG    if ((xkbDebugFlags&0x4)&&	((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {	ErrorF("CoreProcessKbdEvent: Key %d %s\n",key,			(xE->u.u.type==KeyPress?"down":"up"));    }#endif    switch (xE->u.u.type)    {	case KeyPress: 	    if (*kptr & bit) /* allow ddx to generate multiple downs */	    {   		if (!modifiers)		{		    xE->u.u.type = KeyRelease;		    (*keybd->public.processInputProc)(xE, keybd, count);		    xE->u.u.type = KeyPress;		    /* release can have side effects, don't fall through */		    (*keybd->public.processInputProc)(xE, keybd, count);		}		return;	    }	    inputInfo.pointer->valuator->motionHintWindow = NullWindow;	    *kptr |= bit;	    keyc->prev_state = keyc->state;	    for (i = 0, mask = 1; modifiers; i++, mask <<= 1)	    {		if (mask & modifiers)		{		    /* This key affects modifier "i" */		    keyc->modifierKeyCount[i]++;		    keyc->state |= mask;		    modifiers &= ~mask;		}	    }	    if (!grab && CheckDeviceGrabs(keybd, xE, 0, count))	    {		keybd->activatingKey = key;		return;	    }	    break;	case KeyRelease: 	    if (!(*kptr & bit)) /* guard against duplicates */		return;	    inputInfo.pointer->valuator->motionHintWindow = NullWindow;	    *kptr &= ~bit;	    keyc->prev_state = keyc->state;	    for (i = 0, mask = 1; modifiers; i++, mask <<= 1)	    {		if (mask & modifiers) {		    /* This key affects modifier "i" */		    if (--keyc->modifierKeyCount[i] <= 0) {			keyc->state &= ~mask;			keyc->modifierKeyCount[i] = 0;		    }		    modifiers &= ~mask;		}	    }	    if (keybd->fromPassiveGrab && (key == keybd->activatingKey))		deactivateGrab = TRUE;	    break;	default: 	    FatalError("Impossible keyboard event");    }    if (grab)	DeliverGrabbedEvent(xE, keybd, deactivateGrab, count);    else	DeliverFocusedEvent(keybd, xE, sprite.win, count);    if (deactivateGrab)        (*keybd->DeactivateGrab)(keybd);}void#ifdef XKBCoreProcessPointerEvent (xE, mouse, count)#elseProcessPointerEvent (xE, mouse, count)#endif    register xEvent 		*xE;    register DeviceIntPtr 	mouse;    int				count;{    register GrabPtr	grab = mouse->grab;    Bool                deactivateGrab = FALSE;    register ButtonClassPtr butc = mouse->button;#ifdef XKB    XkbSrvInfoPtr xkbi= inputInfo.keyboard->key->xkbInfo;#endif    if (!syncEvents.playingEvents)	NoticeTime(xE)    xE->u.keyButtonPointer.state = (butc->state | (#ifdef XKB			(noXkbExtension ?				inputInfo.keyboard->key->state :				xkbi->state.grab_mods)#else			inputInfo.keyboard->key->state#endif				    ));    {	NoticeTime(xE);	if (DeviceEventCallback)	{	    DeviceEventInfoRec eventinfo;	    /* see comment in EnqueueEvents regarding the next three lines */	    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)    {	register int  key;	register BYTE *kptr;	int           bit;	xE->u.keyButtonPointer.rootX = sprite.hot.x;	xE->u.keyButtonPointer.rootY = sprite.hot.y;	key = xE->u.u.detail;	kptr = &butc->down[key >> 3];	bit = 1 << (key & 7);	switch (xE->u.u.type)	{	case ButtonPress: 	    mouse->valuator->motionHintWindow = NullWindow;	    butc->buttonsDown++;	    butc->motionMask = ButtonMotionMask;	    *kptr |= bit;	    xE->u.u.detail = butc->map[key];	    if (xE->u.u.detail == 0)		return;	    if (xE->u.u.detail <= 5)		butc->state |= (Button1Mask >> 1) << xE->u.u.detail;	    filters[MotionNotify] = Motion_Filter(butc);	    if (!grab)		if (CheckDeviceGrabs(mouse, xE, 0, count))		    return;	    break;	case ButtonRelease: 	    mouse->valuator->motionHintWindow = NullWindow;	    if (!--butc->buttonsDown)		butc->motionMask = 0;	    *kptr &= ~bit;	    xE->u.u.detail = butc->map[key];	    if (xE->u.u.detail == 0)		return;	    if (xE->u.u.detail <= 5)		butc->state &= ~((Button1Mask >> 1) << xE->u.u.detail);	    filters[MotionNotify] = Motion_Filter(butc);	    if (!butc->state && mouse->fromPassiveGrab)		deactivateGrab = TRUE;	    break;	default: 	    FatalError("bogus pointer event from ddx");	}    }    else if (!CheckMotion(xE))	return;    if (grab)	DeliverGrabbedEvent(xE, mouse, deactivateGrab, count);    else	DeliverDeviceEvents(sprite.win, xE, NullGrab, NullWindow,			    mouse, count);    if (deactivateGrab)        (*mouse->DeactivateGrab)(mouse);}#define AtMostOneClient \	(SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask)voidRecalculateDeliverableEvents(pWin)    register WindowPtr pWin;{    register OtherClients *others;    register WindowPtr pChild;    pChild = pWin;    while (1)    {	if (pChild->optional)	{	    pChild->optional->otherEventMasks = 0;	    for (others = wOtherClients(pChild); others; others = others->next)	    {		pChild->optional->otherEventMasks |= others->mask;	    }	}	pChild->deliverableEvents = pChild->eventMask|				    wOtherEventMasks(pChild);	if (pChild->parent)	    pChild->deliverableEvents |=		(pChild->parent->deliverableEvents &		 ~wDontPropagateMask(pChild) & PropagateMask);	if (pChild->firstChild)	{	    pChild = pChild->firstChild;	    continue;	}	while (!pChild->nextSib && (pChild != pWin))	    pChild = pChild->parent;	if (pChild == pWin)	    break;	pChild = pChild->nextSib;    }}intOtherClientGone(value, id)    pointer value; /* must conform to DeleteType */    XID   id;{    register OtherClientsPtr other, prev;    register WindowPtr pWin = (WindowPtr)value;    prev = 0;    for (other = wOtherClients(pWin); other; other = other->next)    {	if (other->resource == id)	{	    if (prev)		prev->next = other->next;	    else	    {		if (!(pWin->optional->otherClients = other->next))		    CheckWindowOptionalNeed (pWin);	    }	    xfree(other);	    RecalculateDeliverableEvents(pWin);	    return(Success);	}	prev = other;    }    FatalError("client not on event list");    /*NOTREACHED*/    return -1; /* make compiler happy */}intEventSelectForWindow(pWin, client, mask)    register WindowPtr pWin;    register ClientPtr client;    Mask mask;{    Mask check;    OtherClients * others;    if (mask & ~AllEventMasks)    {	client->errorValue = mask;	return BadValue;    }    check = (mask & AtMostOneClient);    if (check & (pWin->eventMask|wOtherEventMasks(pWin)))    {				       /* It is illegal for two different				          clients to select on any of the				          events for AtMostOneClient. However,				          it is OK, for some client to				          continue selecting on one of those				          events.  */	if ((wClient(pWin) != client) && (check & pWin->eventMask))	    return BadAccess;	for (others = wOtherClients (pWin); others; others = others->next)	{	    if (!SameClient(others, client) && (check & others->mask))		return BadAccess;	}    }    if (wClient (pWin) == client)    {	check = pWin->eventMask;#if SGIMISC	pWin->eventMask =	    (mask & ~SGIMiscSpecialDestroyMask) | (pWin->eventMask & SGIMiscSpecialDestroyMask);#else	pWin->eventMask = mask;#endif    }    else    {	for (others = wOtherClients (pWin); others; others = others->next)	{	    if (SameClient(others, client))	    {		check = others->mask;#if SGIMISC		mask = (mask & ~SGIMiscSpecialDestroyMask) | (others->mask & SGIMiscSpecialDestroyMask);#endif		if (mask == 0)		{		    FreeResource(others->resource, RT_NONE);		    return Success;		}		else		    others->mask = mask;		goto maskSet;	    }	}	check = 0;	if (!pWin->optional && !MakeWindowOptional (pWin))	    return BadAlloc;	others = (OtherClients *) xalloc(sizeof(OtherClients));	if (!others)	    return BadAlloc;	others->mask = mask;	others->resource = FakeClientID(client->index);	others->next = pWin->optional->otherClients;	pWin->optional->otherClients = others;	if (!AddResource(others->resource, RT_OTHERCLIENT, (pointer)pWin))	    return BadAlloc;    }maskSet:     if ((inputInfo.pointer->valuator->motionHintWindow == pWin) &&	(mask & PointerMotionHintMask) &&	!(check & PointerMotionHintMask) &&	!inputInfo.pointer->grab)	inputInfo.pointer->valuator->motionHintWindow = NullWindow;    RecalculateDeliverableEvents(pWin);    return Success;}/*ARGSUSED*/intEventSuppressForWindow(pWin, client, mask, checkOptional)    register WindowPtr pWin;    register ClientPtr client;    Mask mask;    Bool *checkOptional;{    register int i, free;    if ((mask & ~PropagateMask) && !permitOldBugs)    {	client->errorValue = mask;	return BadValue;    }    if (pWin->dontPropagate)	DontPropagateRefCnts[pWin->dontPropagate]--;    if (!mask)	i = 0;    else    {	for (i = DNPMCOUNT, free = 0; --i > 0; )	{	    if (!DontPropagateRefCnts[i])		free = i;	    else if (mask == DontPropagateMasks[i])		break;	}	if (!i && free)	{	    i = free;	    DontPropagateMasks[i] = mask;	}    }    if (i || !mask)    {	pWin->dontPropagate = i;	if (i)	    DontPropagateRefCnts[i]++;	if (pWin->optional)	{	    pWin->optional->dontPropagateMask = mask;	    *checkOptional = TRUE;	}    }    else    {	if (!pWin->optional && !MakeWindowOptional (pWin))	{	    if (pWin->dontPropagate)		DontPropagateRefCnts[pWin->dontPropagate]++;	    return BadAlloc;	}	pWin->dontPropagate = 0;        pWin->optional->dontPropagateMask = mask;    }    RecalculateDeliverableEvents(pWin);    return Success;}static WindowPtr #if NeedFunctionPrototypesCommonAncestor(    register WindowPtr a,    register WindowPtr b)#elseCommonAncestor(a, b)    register WindowPtr a, b;#endif{    for (b = b->parent; b; b = b->parent)	if (IsParent(b, a)) return b;    return NullWindow;}static void#if NeedFunctionPrototypesEnterLeaveEvent(    int type,    int mode,    int detail,    register WindowPtr pWin,    Window child)#elseEnterLeaveEvent(type, mode, detail, pWin, child)    int type, mode, detail;    register WindowPtr pWin;    Window child;#endif{    xEvent		event;    register DeviceIntPtr keybd = inputInfo.keyboard;    WindowPtr		focus;    register DeviceIntPtr mouse = inputInfo.pointer;    register GrabPtr	grab = mouse->grab;    Mask		mask;    if ((pWin == mouse->valuator->motionHintWindow) &&	(detail != NotifyInferior))	mouse->valuator->motionHintWindow = NullWindow;    if (grab)    {	mask = (pWin == grab->window) ? grab->eventMask : 0;	if (grab->ownerEvents)	    mask |= EventMaskForClient(pWin, rClient(grab));    }    else    {	mask = pWin->eventMask | wOtherEventMasks(pWin);    }    if (mask & filters[type])    {	event.u.u.type = type;	event.u.u.detail = detail;	event.u.enterLeave.time = currentTime.milliseconds;	event.u.enterLeave.rootX = sprite.hot.x;	event.u.enterLeave.rootY = sprite.hot.y;	/* Counts on the same initial structure of crossing & button events! */	FixUpEventFromWindow(&event, pWin, None, FALSE);	/* Enter/Leave events always set child */	event.u.enterLeave.child = child;	e

⌨️ 快捷键说明

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