#include "X.h"
#include "misc.h"
#include "lbxdata.h"
#include "resource.h"
#include "colormapst.h"
#include "propertyst.h"
#include "lbxtags.h"
#define _XLBX_SERVER_
#include "lbxstr.h"
#include "propertyst.h"
static RESTYPE TagResType;
extern int _lbx_fi_junklen;
static int
tag_free(pointer data,
XID id)
{
TagData td = (TagData) data;
FontTagInfoPtr ftip;
char *t;
if (td->global)
*(td->global) = 0;
if (td->data_type == LbxTagTypeFont) {
ftip = (FontTagInfoPtr) td->tdata;
FontSetPrivate(ftip->pfont, lbx_font_private, NULL);
t = (char *) ftip->fontinfo;
if (!ftip->compression)
t -= _lbx_fi_junklen;
xfree(t);
xfree(ftip);
}
xfree(data);
return 0;
}
void
TagInit(void)
{
TagResType = CreateNewResourceType(tag_free);
}
XID
TagNewTag(void)
{
return FakeClientID(0);
}
void
TagClearProxy(XID tid,
int pid)
{
TagData td;
td = (TagData) LookupIDByType(tid, TagResType);
if (td)
td->sent_to_proxy[pid >> 3] &= ~(1 << (pid & 7));
}
void
TagMarkProxy(XID tid,
int pid)
{
TagData td;
td = (TagData) LookupIDByType(tid, TagResType);
td->sent_to_proxy[pid >> 3] |= 1 << (pid & 7);
}
Bool
TagProxyMarked(XID tid,
int pid)
{
TagData td;
td = (TagData) LookupIDByType(tid, TagResType);
return (td->sent_to_proxy[pid >> 3] & (1 << (pid & 7))) != 0;
}
XID
TagSaveTag(int dtype,
int size,
pointer data,
XID *global)
{
TagData td;
td = (TagData) xalloc(sizeof(TagDataRec));
if (!td) {
if (global)
*global = 0;
return 0;
}
bzero((char *) td->sent_to_proxy, (MAX_NUM_PROXIES + 7) / 8);
td->tid = TagNewTag();
td->data_type = dtype;
td->tdata = data;
td->size = size;
td->global = global;
if (!AddResource(td->tid, TagResType, (pointer) td))
return 0;
if (global)
*global = td->tid;
return td->tid;
}
void
TagDeleteTag(XID tid)
{
int pid;
TagData td;
LbxProxyPtr proxy;
ClientPtr client;
LbxClientPtr lbxcp;
td = (TagData) LookupIDByType(tid, TagResType);
if (!td)
return;
for (pid = 1; pid < MAX_NUM_PROXIES; pid++) {
if (td->sent_to_proxy[pid >> 3] & (1 << (pid & 7))) {
proxy = LbxPidToProxy(pid);
lbxcp = (proxy != NULL) ? proxy->lbxClients[0] : NULL;
if (lbxcp && (client = lbxcp->client))
LbxSendInvalidateTag(client, tid, td->data_type);
td->sent_to_proxy[pid >> 3] &= ~(1 << (pid & 7));
}
}
if (td->data_type != LbxTagTypeProperty || !LbxFlushQTag(tid))
FreeResource(tid, 0);
else if (td->global) {
*(td->global) = 0;
td->global = NULL;
}
}
TagData
TagGetTag(XID tid)
{
TagData td;
td = (TagData) LookupIDByType(tid, TagResType);
return td;
}
static void
LbxFlushTag(pointer value,
XID tid,
pointer cdata)
{
TagData td = (TagData)value;
LbxProxyPtr proxy = (LbxProxyPtr)cdata;
int i;
if ((td->data_type == LbxTagTypeProperty) && td->global) {
PropertyPtr pProp = (PropertyPtr)td->tdata;
if ((pProp->tag_id == tid) && (pProp->owner_pid == proxy->pid)) {
LbxFlushQTag(tid);
pProp->size = 0;
FreeResource(tid, 0);
return;
}
}
td->sent_to_proxy[proxy->pid >> 3] &= ~(1 << (proxy->pid & 7));
for (i = 0; i < (MAX_NUM_PROXIES + 7) / 8; i++) {
if (td->sent_to_proxy[i])
return;
}
FreeResource(tid, 0);
}
void
LbxFlushTags(LbxProxyPtr proxy)
{
FindClientResourcesByType(NULL, TagResType, LbxFlushTag, (pointer)proxy);
}