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

📄 property.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 2 页
字号:
            data = (pointer)xalloc(sizeInBytes * (len + pProp->size));	    if (!data)		return(BadAlloc);	    memmove(&((char *)data)[totalSize], (char *)pProp->data, 		  (int)(pProp->size * sizeInBytes));            memmove((char *)data, (char *)value, totalSize);	    xfree(pProp->data);            pProp->data = data;            pProp->size += len;	}    }    if (sendevent)    {	event.u.u.type = PropertyNotify;	event.u.property.window = pWin->drawable.id;	event.u.property.state = PropertyNewValue;	event.u.property.atom = pProp->propertyName;	event.u.property.time = currentTime.milliseconds;	DeliverEvents(pWin, &event, 1, (WindowPtr)NULL);    }    /* Addition for RFB X server */    if (pWin->parent == NullWindow) {	extern void rfbRootPropertyChange();	rfbRootPropertyChange(pProp);    }    return(Success);#endif}intDeleteProperty(pWin, propName)    WindowPtr pWin;    Atom propName;{    PropertyPtr pProp, prevProp;    xEvent event;    if (!(pProp = wUserProps (pWin)))	return(Success);    prevProp = (PropertyPtr)NULL;    while (pProp)    {	if (pProp->propertyName == propName)	    break;        prevProp = pProp;	pProp = pProp->next;    }    if (pProp)     {		            if (prevProp == (PropertyPtr)NULL)      /* takes care of head */        {            if (!(pWin->optional->userProps = pProp->next))		CheckWindowOptionalNeed (pWin);        }	else        {            prevProp->next = pProp->next;        }#ifdef LBX	if (pProp->tag_id)	    TagDeleteTag(pProp->tag_id);#endif	event.u.u.type = PropertyNotify;	event.u.property.window = pWin->drawable.id;	event.u.property.state = PropertyDelete;        event.u.property.atom = pProp->propertyName;	event.u.property.time = currentTime.milliseconds;	DeliverEvents(pWin, &event, 1, (WindowPtr)NULL);	xfree(pProp->data);        xfree(pProp);    }    return(Success);}voidDeleteAllWindowProperties(pWin)    WindowPtr pWin;{    PropertyPtr pProp, pNextProp;    xEvent event;    pProp = wUserProps (pWin);    while (pProp)    {#ifdef LBX	if (pProp->tag_id)	    TagDeleteTag(pProp->tag_id);#endif	event.u.u.type = PropertyNotify;	event.u.property.window = pWin->drawable.id;	event.u.property.state = PropertyDelete;	event.u.property.atom = pProp->propertyName;	event.u.property.time = currentTime.milliseconds;	DeliverEvents(pWin, &event, 1, (WindowPtr)NULL);	pNextProp = pProp->next;        xfree(pProp->data);        xfree(pProp);	pProp = pNextProp;    }}static intNullPropertyReply(client, propertyType, format, reply)    ClientPtr client;    ATOM propertyType;    int format;    xGetPropertyReply *reply;{    reply->nItems = 0;    reply->length = 0;    reply->bytesAfter = 0;    reply->propertyType = propertyType;    reply->format = format;    WriteReplyToClient(client, sizeof(xGenericReply), reply);    return(client->noClientException);}/***************** * GetProperty *    If type Any is specified, returns the property from the specified *    window regardless of its type.  If a type is specified, returns the *    property only if its type equals the specified type. *    If delete is True and a property is returned, the property is also *    deleted from the window and a PropertyNotify event is generated on the *    window. *****************/intProcGetProperty(client)    ClientPtr client;{    PropertyPtr pProp, prevProp;    unsigned long n, len, ind;    WindowPtr pWin;    xGetPropertyReply reply;    REQUEST(xGetPropertyReq);    REQUEST_SIZE_MATCH(xGetPropertyReq);    if (stuff->delete)	UpdateCurrentTime();    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,					   SecurityReadAccess);    if (!pWin)	return BadWindow;    if (!ValidAtom(stuff->property))    {	client->errorValue = stuff->property;	return(BadAtom);    }    if ((stuff->delete != xTrue) && (stuff->delete != xFalse))    {	client->errorValue = stuff->delete;	return(BadValue);    }    if ((stuff->type != AnyPropertyType) && !ValidAtom(stuff->type))    {	client->errorValue = stuff->type;	return(BadAtom);    }    pProp = wUserProps (pWin);    prevProp = (PropertyPtr)NULL;    while (pProp)    {	if (pProp->propertyName == stuff->property) 	    break;	prevProp = pProp;	pProp = pProp->next;    }    reply.type = X_Reply;    reply.sequenceNumber = client->sequence;    if (!pProp) 	return NullPropertyReply(client, None, 0, &reply);#ifdef XCSECURITY    {	Mask access_mode = SecurityReadAccess;	if (stuff->delete)	    access_mode |= SecurityDestroyAccess;	switch(SecurityCheckPropertyAccess(client, pWin, stuff->property,					   access_mode))	{	    case SecurityErrorOperation:		client->errorValue = stuff->property;		return BadAtom;;	    case SecurityIgnoreOperation:		return NullPropertyReply(client, pProp->type, pProp->format,					 &reply);	}    }#endif    /* If the request type and actual type don't match. Return the    property information, but not the data. */    if (((stuff->type != pProp->type) &&	 (stuff->type != AnyPropertyType))       )    {	reply.bytesAfter = pProp->size;	reply.format = pProp->format;	reply.length = 0;	reply.nItems = 0;	reply.propertyType = pProp->type;	WriteReplyToClient(client, sizeof(xGenericReply), &reply);	return(Success);    }#ifdef LBX    /* make sure we have the current value */                           if (pProp->tag_id && pProp->owner_pid) {	LbxStallPropRequest(client, pProp);	return client->noClientException;    }                                              #endif/* *  Return type, format, value to client */    n = (pProp->format/8) * pProp->size; /* size (bytes) of prop */    ind = stuff->longOffset << 2;           /* If longOffset is invalid such that it causes "len" to	    be negative, it's a value error. */    if (n < ind)    {	client->errorValue = stuff->longOffset;	return BadValue;    }    len = min(n - ind, 4 * stuff->longLength);    reply.bytesAfter = n - (ind + len);    reply.format = pProp->format;    reply.length = (len + 3) >> 2;    reply.nItems = len / (pProp->format / 8 );    reply.propertyType = pProp->type;    if (stuff->delete && (reply.bytesAfter == 0))    { /* send the event */	xEvent event;	event.u.u.type = PropertyNotify;	event.u.property.window = pWin->drawable.id;	event.u.property.state = PropertyDelete;	event.u.property.atom = pProp->propertyName;	event.u.property.time = currentTime.milliseconds;	DeliverEvents(pWin, &event, 1, (WindowPtr)NULL);    }    WriteReplyToClient(client, sizeof(xGenericReply), &reply);    if (len)    {	switch (reply.format) {	case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;	case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;	default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;	}	WriteSwappedDataToClient(client, len,				 (char *)pProp->data + ind);    }    if (stuff->delete && (reply.bytesAfter == 0))    { /* delete the Property */#ifdef LBX	if (pProp->tag_id)	    TagDeleteTag(pProp->tag_id);#endif	if (prevProp == (PropertyPtr)NULL) /* takes care of head */	{	    if (!(pWin->optional->userProps = pProp->next))		CheckWindowOptionalNeed (pWin);	}	else	    prevProp->next = pProp->next;	xfree(pProp->data);	xfree(pProp);    }    return(client->noClientException);}intProcListProperties(client)    ClientPtr client;{    Atom *pAtoms, *temppAtoms;    xListPropertiesReply xlpr;    int	numProps = 0;    WindowPtr pWin;    PropertyPtr pProp;    REQUEST(xResourceReq);    REQUEST_SIZE_MATCH(xResourceReq);    pWin = (WindowPtr)SecurityLookupWindow(stuff->id, client,					   SecurityReadAccess);    if (!pWin)        return(BadWindow);    pProp = wUserProps (pWin);    while (pProp)    {                pProp = pProp->next;	numProps++;    }    if (numProps)        if(!(pAtoms = (Atom *)ALLOCATE_LOCAL(numProps * sizeof(Atom))))            return(BadAlloc);    xlpr.type = X_Reply;    xlpr.nProperties = numProps;    xlpr.length = (numProps * sizeof(Atom)) >> 2;    xlpr.sequenceNumber = client->sequence;    pProp = wUserProps (pWin);    temppAtoms = pAtoms;    while (pProp)    {	*temppAtoms++ = pProp->propertyName;	pProp = pProp->next;    }    WriteReplyToClient(client, sizeof(xGenericReply), &xlpr);    if (numProps)    {        client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;        WriteSwappedDataToClient(client, numProps * sizeof(Atom), pAtoms);        DEALLOCATE_LOCAL(pAtoms);    }    return(client->noClientException);}int ProcDeleteProperty(client)    register ClientPtr client;{    WindowPtr pWin;    REQUEST(xDeletePropertyReq);    int result;                  REQUEST_SIZE_MATCH(xDeletePropertyReq);    UpdateCurrentTime();    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,					   SecurityWriteAccess);    if (!pWin)        return(BadWindow);    if (!ValidAtom(stuff->property))    {	client->errorValue = stuff->property;	return (BadAtom);    }#ifdef XCSECURITY    switch(SecurityCheckPropertyAccess(client, pWin, stuff->property,				       SecurityDestroyAccess))    {	case SecurityErrorOperation:	    client->errorValue = stuff->property;	    return BadAtom;;	case SecurityIgnoreOperation:	    return Success;    }#endif    result = DeleteProperty(pWin, stuff->property);    if (client->noClientException != Success)	return(client->noClientException);    else	return(result);}

⌨️ 快捷键说明

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