/*
 * -- $Header: /cec/src/nestor/servers/R3/shXlib/XClDisplay.c,v 1.1.1.1 90/04/23 09:53:38 spanachi 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 ) ;
	while (cp != NULL) {
		if (cp == dpy) {
			*dp = cp->next;
			_XFreeDisplayStructure (dpy);
			break;
			}
		dp = &(cp->next);
		cp = *dp;
		}
	if (_XHeadOfDisplayList == NULL) {
	    _XFreeQ ();
	}

	return;
}
