summaryrefslogtreecommitdiff
path: root/do_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'do_windows.c')
-rw-r--r--do_windows.c289
1 files changed, 289 insertions, 0 deletions
diff --git a/do_windows.c b/do_windows.c
new file mode 100644
index 0000000..c6b386d
--- /dev/null
+++ b/do_windows.c
@@ -0,0 +1,289 @@
+/* $Xorg: do_windows.c,v 1.4 2000/08/17 19:54:10 cpqbld Exp $ */
+/*****************************************************************************
+Copyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************************/
+
+#include "x11perf.h"
+
+static Window *parents;
+static Window *isolates;
+static int childrows, childcolumns, childwindows;
+static int parentrows, parentcolumns, parentwindows;
+static int parentwidth, parentheight;
+static Window popup;
+
+void ComputeSizes(xp, p)
+ XParms xp;
+ Parms p;
+{
+ childwindows = p->objects;
+ childrows = (childwindows + MAXCOLS - 1) / MAXCOLS;
+ childcolumns = (childrows > 1 ? MAXCOLS : childwindows);
+
+ parentwidth = (CHILDSIZE+CHILDSPACE) * childcolumns;
+ parentheight = (CHILDSIZE+CHILDSPACE) * childrows;
+}
+
+int CreateParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ ComputeSizes(xp, p);
+
+ parentcolumns = WIDTH / parentwidth;
+ parentrows = HEIGHT / parentheight;
+ parentwindows = parentcolumns * parentrows; /* Max reps we can fit */
+
+ if (parentwindows > reps) {
+ parentwindows = reps;
+ }
+
+ /* We will do parentwindows sets of childwindows, in order to get better
+ timing accuracy. Creating 4 windows at a millisecond apiece or so
+ is a bit faster than the 60 Hz clock. */
+ isolates = (Window *)malloc(parentwindows * sizeof(Window));
+ parents = (Window *)malloc(parentwindows * sizeof(Window));
+
+ /*
+ * Create isolation windows for the parents, and then the parents
+ * themselves. These isolation windows ensure that parent and children
+ * windows created/mapped in DoWins and DoWin2 all see the same local
+ * environment...the parent is an only child, and each parent contains
+ * the number of children we are trying to get benchmarks on.
+ */
+
+ for (i = 0; i != parentwindows; i++) {
+ isolates[i] = XCreateSimpleWindow(xp->d, xp->w,
+ (i/parentrows)*parentwidth, (i%parentrows)*parentheight,
+ parentwidth, parentheight, 0, xp->background, xp->background);
+ parents[i] = XCreateSimpleWindow(xp->d, isolates[i],
+ 0, 0, parentwidth, parentheight, 0, xp->background, xp->background);
+ }
+
+ XMapSubwindows(xp->d, xp->w);
+ return parentwindows;
+} /* CreateParents */
+
+
+void MapParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XMapWindow(xp->d, parents[i]);
+ }
+}
+
+
+int InitCreate(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ MapParents(xp, p, reps);
+ return reps;
+}
+
+void CreateChildGroup(xp, p, parent)
+ XParms xp;
+ Parms p;
+ Window parent;
+{
+ int j;
+
+ for (j = 0; j != childwindows; j++) {
+ (void) XCreateSimpleWindow (xp->d, parent,
+ (CHILDSIZE+CHILDSPACE) * (j/childrows) + CHILDSPACE/2,
+ (CHILDSIZE+CHILDSPACE) * (j%childrows) + CHILDSPACE/2,
+ CHILDSIZE, CHILDSIZE, 0, xp->background, xp->foreground);
+ }
+
+ if (p->special)
+ XMapSubwindows (xp->d, parent);
+}
+
+void CreateChildren(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ CreateChildGroup(xp, p, parents[i]);
+ } /* end i */
+}
+
+void DestroyChildren(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XDestroySubwindows(xp->d, parents[i]);
+ }
+}
+
+void EndCreate(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+ free(parents);
+ free(isolates);
+}
+
+
+int InitMap(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ CreateChildren(xp, p, reps);
+ return reps;
+}
+
+void UnmapParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XUnmapWindow(xp->d, parents[i]);
+ }
+}
+
+int InitDestroy(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ reps = CreateParents(xp, p, reps);
+ CreateChildren(xp, p, reps);
+ MapParents(xp, p, reps);
+ return reps;
+}
+
+void DestroyParents(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ XDestroyWindow(xp->d, parents[i]);
+ }
+}
+
+
+void RenewParents(xp, p)
+ XParms xp;
+ Parms p;
+{
+ int i;
+
+ for (i = 0; i != parentwindows; i++) {
+ parents[i] = XCreateSimpleWindow(xp->d, isolates[i],
+ 0, 0, parentwidth, parentheight, 0, xp->background, xp->background);
+ }
+ CreateChildren(xp, p, parentwindows);
+ MapParents(xp, p, parentwindows);
+}
+
+int InitPopups(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+#ifdef CHILDROOT
+ XWindowAttributes xwa;
+#endif
+ XSetWindowAttributes xswa;
+ Window isolate;
+
+#ifdef CHILDROOT
+ ComputeSizes(xp, p);
+ CreateChildGroup(xp, p, xp->w);
+
+ /* Now create simple window to pop up over children */
+ (void) XGetWindowAttributes(xp->d, xp->w, &xwa);
+ xswa.override_redirect = True;
+ popup = XCreateSimpleWindow (
+ xp->d, DefaultRootWindow(xp->d),
+ xwa.x + xwa.border_width, xwa.y + xwa.border_width,
+ parentwidth, parentheight,
+ 0, xp->foreground, xp->foreground);
+#else
+ isolate = XCreateSimpleWindow(
+ xp->d, xp->w, 0, 0, WIDTH, HEIGHT,
+ 0, xp->background, xp->background);
+
+ ComputeSizes(xp, p);
+ CreateChildGroup(xp, p, isolate);
+ XMapWindow(xp->d, isolate);
+
+ /* Now create simple window to pop up over children */
+ xswa.override_redirect = True;
+ popup = XCreateSimpleWindow (
+ xp->d, xp->w, 0, 0,
+ parentwidth, parentheight,
+ 0, xp->foreground, xp->foreground);
+#endif
+ XChangeWindowAttributes (xp->d, popup, CWOverrideRedirect, &xswa);
+ return reps;
+}
+
+void DoPopUps(xp, p, reps)
+ XParms xp;
+ Parms p;
+ int reps;
+{
+ int i;
+ for (i = 0; i != reps; i++) {
+ XMapWindow(xp->d, popup);
+ XUnmapWindow(xp->d, popup);
+ }
+}
+
+void EndPopups(xp, p)
+ XParms xp;
+ Parms p;
+{
+ XDestroySubwindows(xp->d, xp->w);
+#ifdef CHILDROOT
+ XDestroyWindow(xp->d, popup);
+#endif
+}
+