/*
 * -- $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);

}
