/* $Id: ps_resources.c,v 1.1.1.1 90/11/28 16:45:30 altenhof Exp $ */

/*
 * Copyright (C) 1990 by Digital Equipment Corporation.
 * 
 * Author: Michael P. Altenhofen, CEC Karlsruhe e-mail:
 * Altenhofen@kampus.enet.dec.com
 * 
 * This file ist part of Shared X
 * 
 * Permission to use, copy, modify, and distribute this software and its
 * documentation without fee is hereby granted, but only for non-profit  use
 * and distribution,  and provided  that the copyright notice and this notice
 * is preserved on all copies.
 * 
 * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 */

#define _USE_STRUCTS_
#define PUBLIC extern

#include "glob.h"
#include "utils.h"

#undef PUBLIC

static GCInfo * 
RemoveGCInfo (client, gid)
  ClientPtr client;
  XID gid;
{
  GCInfo *prev, *curr;

  if (client->gc_list == (GCInfo *) NULL)
    return ((GCInfo *) NULL);

  if (client->gc_list->gc && (client->gc_list->client_id == gid)) {
    curr = client->gc_list;
    client->gc_list = client->gc_list->next;
    curr->next = (GCInfo *) NULL;
    return (curr);
  }
  else {
    for (curr = prev = client->gc_list;
	 curr != (GCInfo *) NULL;
	 prev = curr, curr = curr->next)
      if (curr->gc && (curr->client_id == gid)) {
	prev->next = curr->next;
	curr->next = (GCInfo *) NULL;
	break;
      }
    return (curr);
  }
}

void
InsertGCInfo (client, client_id, gc)
  ClientPtr client;
  XID client_id;
  GC gc;

{
  GCInfo *gc_info;

  if (client == NullClient)
    FatalError ("InsertGCInfo: Invalid client ptr!\n");

  if ((gc_info = (GCInfo *) Xmalloc (sizeof (GCInfo))) == NULL)
    FatalError ("InsertGCInfo: Out of memory!\n");

  gc_info->client_id = client_id;
  gc_info->gc = gc;
  gc_info->next = client->gc_list;
  client->gc_list = gc_info;
}

GC
GetGCFromResources (client, gid)
  ClientPtr client;
  XID gid;
{
  GCInfo *gc_infos;

  if (client == NullClient)
    FatalError ("InsertGCInfo: Invalid client ptr!\n");

  for (gc_infos = client->gc_list;
       gc_infos != NULL; gc_infos = gc_infos->next)
    if (gc_infos->gc && (gc_infos->client_id == gid))
      return (gc_infos->gc);

  return ((GC) NULL);
}

GC
RemoveGCFromResources (client, gid)
  ClientPtr client;
  XID gid;
{
  GCInfo *gc_info;
  GC gc;

  if (client == NullClient)
    FatalError ("InsertGCInfo: Invalid client ptr!\n");

  gc = (GC) NULL;
  if ((gc_info = RemoveGCInfo (client, gid)) != (GCInfo *) NULL) {
    gc = gc_info->gc;
    gc_info->gc = (GC) NULL;
    Xfree ((char *) gc_info);
    return (gc);
  }
  else
    return ((GC) NULL);
}


void
FreeClientResources (client)
  ClientPtr client;
{
  register GCInfo *ptr;

  ptr = client->gc_list;
  while (ptr != (GCInfo *) NULL) {
    GCInfo *curr = ptr;

    ptr = curr->next;
    curr->next = NULL;
    Xfree ((char *) curr->gc);
    Xfree ((char *) curr);
  }
  client->gc_list = (GCInfo *) NULL;
}
