/* %Z%%M% %I% %E% */

/*
 * Copyright (c) 1994, 1995 by Wayne C. Gramlich.
 * All rights reserved.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * for any purpose is hereby granted without fee provided that the above
 * copyright notice and this permission are retained.  The author makes
 * no representations about the suitability of this software for any purpose.
 * It is provided "as is" without express or implied warranty.
 */

/*
 * This file provide a bunch of interface routines for accessing objects
 * of type Display from Xlib from STIPPLE code.
 */

#ifndef XLIB_H
#include "xlib.h"
#endif

/* The initial object: */
Xlib_display_struct xlib_display___initial_object = {
    1,			/* Closed */
    (Display *)0,
    &xlib_errors___initial_object
};
Xlib_display xlib_display___initial = &xlib_display___initial_object;

/*
 * xlib_display___closed(display)
 *	This routine will append an error message to {display}'s
 *	message buffer if it is closed.
 */
void
xlib_display___closed(
    Xlib_display display)
{
    if (display->closed) {
	xlib_errors___add(display->errors, "Display is closed");
    }
}

/*
 * xlib_display__address_get(display)
 *	This routine will return the address of {display}.
 */
unsigned
xlib_display__address_get(
    Xlib_display display)
{
    return (unsigned)display;
}

/*
 * xlib_display__close(display)
 *	This routine will close down the connection to the X server
 *	associated with {display} if is open.
 */
void
xlib_display__close(
    Xlib_display display)
{
    if (display->closed) {
	xlib_errors___add(display->errors,
	  "Closing already closed xlib_display object");
    } else {
	XCloseDisplay(display->display);
	display->closed = 1;
	display->display = (Display *)0;

	/*
	 * Force subsequent errors into the initial object
	 * which is always checked.
	 */
	display->errors = &xlib_errors___initial_object;
    }
}

/*
 * xlib_display__closed_get(display)
 *	This routine will return 1 if the connection to the X server
 *	associated with {display} is closed and 0 otherwise.
 */
int
xlib_display__closed_get(
    Xlib_display display)
{
    return display->closed;
}

/*
 * xlib_display__default_open(errors)
 *	This routine will return the default display.
 */
Xlib_display
xlib_display__default_open(
    Xlib_errors errors)
{
    Display *disp;
    Xlib_display display;

    display = xlib_display___initial;
    disp = XOpenDisplay((char *)0);
    if (disp == (Display *)0) {
	xlib_errors___add(errors, "Unable to open default display");
    } else {
	display = (Xlib_display)malloc(sizeof(*display));
	display->closed = 0;
	display->display = disp;
	display->errors = errors;
	XSynchronize(disp, False);
    }
    return display;
}

/*
 * xlib_display__errors_get(display)
 *	This routine will return the {Xlib_errors} object associated
 *	with {display}.
 */
Xlib_errors
xlib_display__errors_get(
    Xlib_display display)
{
    return display->errors;
}

/*
 * xlib_display__external__initialize()
 *	This routine will "initialize" the {xlib_display} external
 *	code.
 */
void
xlib_display__external__initialize(void)
{
    /* Do nothing! */
}

/*
 * xlib_display__open(display_name, errors)
 *	This routine will open and return the display named
 *	{display_name} and reporting all errors into {errors}.
 */
Xlib_display
xlib_display__open(
    String display_name,
    Xlib_errors errors)
{
    Display *disp;
    Str name;
    Xlib_display display;

    display = xlib_display___initial;
    name = string__unix_string(display_name);
    disp = XOpenDisplay(name);
    if (disp == (Display *)0) {
	xlib_errors___add(errors, "Unable to open named display");
    } else {
	display = (Xlib_display)malloc(sizeof(*display));
	display->closed = 0;
	display->display = disp;
	display->errors = errors;
    }
    return display;
}


