/*
 * -- $Header: /cec/src/nestor/servers/R3/shXlib/XWindow.c,v 1.1.1.1 90/04/23 10:09:31 spanachi Exp $
 */

#include "copyright.h"

/* $XConsortium: XWindow.c,v 11.15 88/09/06 16:11:25 jim Exp $ */
/* Copyright    Massachusetts Institute of Technology    1986	*/

/* -- MULTIPLEX Extension -- */

#include "Xlibint.h"

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

#define AllMaskBits (CWBackPixmap|CWBackPixel|CWBorderPixmap|\
		     CWBorderPixel|CWBitGravity|CWWinGravity|\
		     CWBackingStore|CWBackingPlanes|CWBackingPixel|\
		     CWOverrideRedirect|CWSaveUnder|CWEventMask|\
		     CWDontPropagate|CWColormap|CWCursor)

Window XCreateWindow(dpy, parent, x, y, width, height, 
                borderWidth, depth, class, visual, valuemask, attributes)
    register Display *dpy;
    Window parent;
    int x, y;
    unsigned int width, height, borderWidth;
    int depth;
    unsigned int class;
    Visual *visual;
    unsigned long valuemask;
    XSetWindowAttributes *attributes;
{
    Window wid;
    register xCreateWindowReq *req;
    /* -- additional variables -- */
    Bool mux_add_events ;
    long mux_specific_mask ;

    /* -- find out if we must alter the event mask -- */
    mux_add_events = XmuXMustAddEvents( dpy , parent , XmuXCreate ) ;

    LockDisplay(dpy);
    GetReq(CreateWindow, req);
    req->parent = parent;
    req->x = x;
    req->y = y;
    req->width = width;
    req->height = height;
    req->borderWidth = borderWidth;
    req->depth = depth;
    req->class = class;
    if (visual == CopyFromParent)
	req->visual = CopyFromParent;
    else
	req->visual = visual->visualid;
    wid = req->wid = XAllocID(dpy);

    valuemask &= AllMaskBits;
    
    if( mux_add_events )
    {
	/* -- don't want to get fooled by meaningless event mask -- */
	if ( !( valuemask & CWEventMask ) )
	    attributes->event_mask = 0L ;
	valuemask |= CWEventMask ;
    }
    
    if (req->mask = valuemask) 
	/* -- two additional parameters !! -- */
        _XProcessWindowAttributes (dpy, (xChangeWindowAttributesReq *)req, 
			valuemask, attributes, 
			mux_add_events , &mux_specific_mask );

    /* -- store new resource if necessary -- */
    if( XmuXStoreResources( dpy ) )
    {
	XmuXInsertWindowInfo( dpy , wid , parent , req->visual , depth ) ;
	/*
	 * -- These attributes may contain values that point to other
	 * -- resources. We must keep track of these values, since they
	 * -- have a strong impact on duplicating resources (see multiplex.c
	 * -- for further information).
	 */
	XmuXUpdateWindowInfo( dpy , wid , req->mask , attributes ) ;
	if( mux_add_events )
	    XmuXAddToplevelInfo( dpy , wid , mux_specific_mask ) ;
    }
    UnlockDisplay(dpy);
    SyncHandle();
    return (wid);
    }

_XProcessWindowAttributes (dpy, req, valuemask, attributes, 
			   mux_add_events , mux_specific_mask )
    register Display *dpy;
    xChangeWindowAttributesReq *req;
    register unsigned long valuemask;
    register XSetWindowAttributes *attributes;
    /* -- additional parameters --  */
    register Bool mux_add_events ;
    long *mux_specific_mask ;       /* -- return value ! -- */         
    {

    /* Warning!  This code assumes that "unsigned long" is 32-bits wide */

    unsigned long values[32];
    register unsigned long *value = values;
    unsigned int nvalues;

    if (valuemask & CWBackPixmap)
	*value++ = attributes->background_pixmap;
	
    if (valuemask & CWBackPixel)
    	*value++ = attributes->background_pixel;

    if (valuemask & CWBorderPixmap)
    	*value++ = attributes->border_pixmap;

    if (valuemask & CWBorderPixel)
    	*value++ = attributes->border_pixel;

    if (valuemask & CWBitGravity)
    	*value++ = attributes->bit_gravity;

    if (valuemask & CWWinGravity)
	*value++ = attributes->win_gravity;

    if (valuemask & CWBackingStore)
        *value++ = attributes->backing_store;
    
    if (valuemask & CWBackingPlanes)
	*value++ = attributes->backing_planes;

    if (valuemask & CWBackingPixel)
    	*value++ = attributes->backing_pixel;

    if (valuemask & CWOverrideRedirect)
    	*value++ = attributes->override_redirect;

    if (valuemask & CWSaveUnder)
    	*value++ = attributes->save_under;

    if (valuemask & CWEventMask)
    {
	*value = attributes->event_mask;
	if( mux_add_events )
	{   	    
	    *mux_specific_mask  = ~( *value ) & XmuXMask ;
	    *value             |= XmuXMask ;
	}
	value++ ;
    }

    if (valuemask & CWDontPropagate)
	*value++ = attributes->do_not_propagate_mask;

    if (valuemask & CWColormap)
	*value++ = attributes->colormap;

    if (valuemask & CWCursor)
	*value++ = attributes->cursor;

    req->length += (nvalues = value - values);

    nvalues <<= 2;			    /* watch out for macros... */
    Data32 (dpy, (long *) values, (long)nvalues);

    }
