/*
 * -- $Header: /cec/src/nestor/servers/R3/shXlib/XClDisplay.c,v 1.2 90/09/10
 * 08:36:04 altenhof Exp $
 */

#include "copyright.h"

/* $XConsortium: XClDisplay.c,v 11.20 88/09/30 14:02:55 jim Exp $ */
/* Copyright    Massachusetts Institute of Technology    1985	 */

/* -- MULTIPLEX Extension -- */

#include "Xlibint.h"

/* -- additional includes -- */
#include "XmuXlibint.h"
#include "ApplCtx.h"

extern Display *_XHeadOfDisplayList;

/*
 * XCloseDisplay - XSync the connection to the X Server, close the
 * connection, and free all associated storage.
 */

XCloseDisplay (dpy)
  register Display *dpy;

{
  register _XExtension *ext;
  register int i, k;
  register Display **dp = &_XHeadOfDisplayList;
  register Display *cp = _XHeadOfDisplayList, *curr_dpy;
  extern void _XFreeQ ();

  /*
   * -- first of all, loop over possible multiplex displays
   */
  for (k = 1; (curr_dpy = XmuXGetDisplay (dpy, k)) != NULL; k++) {
    for (i = 0; i < curr_dpy->nscreens; i++) {
      register Screen *sp = &curr_dpy->screens[i];
      XFreeGC (curr_dpy, sp->default_gc);
    }
    if (curr_dpy->cursor_font != None) {
      XUnloadFont (curr_dpy, curr_dpy->cursor_font);
    }
    XSync (curr_dpy, 1);	/* throw away pending input events */
    ext = curr_dpy->ext_procs;
    while (ext) {		/* call out to any extensions interested */
      if (ext->close_display != NULL)
	(*ext->close_display) (curr_dpy, &ext->codes);
      ext = ext->next;
    }
    LockDisplay (curr_dpy);
    _XDisconnectDisplay (curr_dpy->fd);

    /*
     * -- and now all the XmuXlib specific stuff
     */
    XmuXFreeEntry (curr_dpy);
    while (cp != NULL) {
      if (cp == curr_dpy) {
	*dp = cp->next;
	_XFreeDisplayStructure (curr_dpy);
	break;
      }
      dp = &(cp->next);
      cp = *dp;
    }
    if (_XHeadOfDisplayList == NULL) {
      _XFreeQ ();
    }
  }

  /*
   * -- now, do all the stuff for the calling dpy
   */
  for (i = 0; i < dpy->nscreens; i++) {
    register Screen *sp = &dpy->screens[i];
    XFreeGC (dpy, sp->default_gc);
  }
  if (dpy->cursor_font != None) {
    XUnloadFont (dpy, dpy->cursor_font);
  }
  XSync (dpy, 1);		/* throw away pending input events */
  ext = dpy->ext_procs;
  while (ext) {			/* call out to any extensions interested */
    if (ext->close_display != NULL)
      (*ext->close_display) (dpy, &ext->codes);
    ext = ext->next;
  }
  LockDisplay (dpy);
  _XDisconnectDisplay (dpy->fd);

  /*
   * -- and now all the XmuXlib specific stuff
   */
  XmuXFreeEntry (dpy);
  /* -- reset cp and dp -- */
  dp = &_XHeadOfDisplayList;
  cp = _XHeadOfDisplayList;
  while (cp != NULL) {
    if (cp == dpy) {
      *dp = cp->next;
      _XFreeDisplayStructure (dpy);
      break;
    }
    dp = &(cp->next);
    cp = *dp;
  }
  if (_XHeadOfDisplayList == NULL) {
    _XFreeQ ();
  }

  return;
}
