1264fa531Smrg/*****************************************************************************
2264fa531SmrgCopyright 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts.
3264fa531Smrg
4264fa531Smrg                        All Rights Reserved
5264fa531Smrg
6dfac8f13SmrgPermission to use, copy, modify, and distribute this software and its
7dfac8f13Smrgdocumentation for any purpose and without fee is hereby granted,
8264fa531Smrgprovided that the above copyright notice appear in all copies and that
9dfac8f13Smrgboth that copyright notice and this permission notice appear in
10264fa531Smrgsupporting documentation, and that the name of Digital not be
11264fa531Smrgused in advertising or publicity pertaining to distribution of the
12dfac8f13Smrgsoftware without specific, written prior permission.
13264fa531Smrg
14264fa531SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15264fa531SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16264fa531SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17264fa531SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18264fa531SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19264fa531SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
20264fa531SmrgSOFTWARE.
21264fa531Smrg
22264fa531Smrg******************************************************************************/
23264fa531Smrg
24264fa531Smrg#include "x11perf.h"
25264fa531Smrg
26264fa531Smrgstatic Window *children;
27264fa531Smrgstatic XPoint *positions;
28264fa531Smrgstatic Window cover;
29264fa531Smrgstatic int rows;
30264fa531Smrgstatic int x_offset, y_offset;  /* Private global data for DoMoveWindows */
31264fa531Smrgstatic int xmax, ymax;
32264fa531Smrgstatic int delta1;		/* Private global data for DoResizeWindows */
33264fa531Smrg
34264fa531Smrg#define STACK (4*(HEIGHT-10)/CHILDSIZE)
35264fa531Smrg
36dfac8f13Smrgint
37533545b5SmrgInitMoveWindows(XParms xp, Parms p, int64_t reps)
38264fa531Smrg{
39264fa531Smrg    rows = (p->objects + MAXCOLS - 1) / MAXCOLS;
40dfac8f13Smrg
41264fa531Smrg    x_offset = 0;
42264fa531Smrg    y_offset = 0;
43264fa531Smrg    delta1   = 1;
44264fa531Smrg
45c9e4df9bSmrg    children = malloc(p->objects * sizeof (Window));
46c9e4df9bSmrg    positions = malloc(p->objects * sizeof(XPoint));
47264fa531Smrg
48264fa531Smrg    xmax = (CHILDSIZE+CHILDSPACE) * (rows > 1 ? MAXCOLS : p->objects);
49264fa531Smrg    ymax = rows * (CHILDSIZE+CHILDSPACE);
50264fa531Smrg
51c9e4df9bSmrg    for (int i = 0; i != p->objects; i++) {
52264fa531Smrg	positions[i].x = (CHILDSIZE+CHILDSPACE) * (i/rows) + CHILDSPACE/2;
53264fa531Smrg	positions[i].y = (CHILDSIZE+CHILDSPACE) * (i%rows) + CHILDSPACE/2;
54264fa531Smrg	children[i] = XCreateSimpleWindow(xp->d, xp->w,
55264fa531Smrg	    positions[i].x, positions[i].y,
56264fa531Smrg	    CHILDSIZE, CHILDSIZE, 0, xp->foreground, xp->foreground);
57264fa531Smrg    }
58264fa531Smrg    if (p->special)
59264fa531Smrg	XMapSubwindows (xp->d, xp->w);
60264fa531Smrg    return reps;
61264fa531Smrg}
62264fa531Smrg
63dfac8f13Smrgvoid
64533545b5SmrgDoMoveWindows(XParms xp, Parms p, int64_t reps)
65264fa531Smrg{
66c9e4df9bSmrg    for (int i = 0; i != reps; i++) {
67264fa531Smrg	x_offset += 1;
68264fa531Smrg	y_offset += 3;
69264fa531Smrg	if (y_offset + ymax > HEIGHT)
70264fa531Smrg	    y_offset = 0;
71264fa531Smrg	if (x_offset + xmax > WIDTH)
72264fa531Smrg	    x_offset = 0;
73c9e4df9bSmrg	for (int j = 0; j != p->objects; j++) {
74264fa531Smrg	    XMoveWindow(xp->d, children[j],
75264fa531Smrg	    positions[j].x + x_offset, positions[j].y + y_offset);
76264fa531Smrg	}
77264fa531Smrg	CheckAbort ();
78264fa531Smrg    }
79264fa531Smrg}
80264fa531Smrg
81dfac8f13Smrgvoid
82264fa531SmrgEndMoveWindows(XParms xp, Parms p)
83264fa531Smrg{
84264fa531Smrg    free(children);
85264fa531Smrg    free(positions);
86264fa531Smrg}
87264fa531Smrg
88dfac8f13Smrgvoid
89533545b5SmrgDoResizeWindows(XParms xp, Parms p, int64_t reps)
90264fa531Smrg{
91c9e4df9bSmrg    for (int i = 0; i != reps; i++) {
92c9e4df9bSmrg	int	delta2;
93264fa531Smrg
94264fa531Smrg	delta1 = -delta1;
95264fa531Smrg	delta2 = delta1;
96c9e4df9bSmrg	for (int j = 0; j != p->objects; j++) {
97264fa531Smrg	    delta2 = -delta2;
98264fa531Smrg	    XResizeWindow(xp->d, children[j],
99264fa531Smrg		CHILDSIZE+delta2, CHILDSIZE-delta2);
100264fa531Smrg	}
101264fa531Smrg	CheckAbort ();
102264fa531Smrg    }
103264fa531Smrg}
104264fa531Smrg
105264fa531Smrgint
106533545b5SmrgInitCircWindows(XParms xp, Parms p, int64_t reps)
107264fa531Smrg{
108c9e4df9bSmrg    children = malloc (p->objects * sizeof (Window));
109c9e4df9bSmrg    for (int i = 0; i != p->objects; i++) {
110c9e4df9bSmrg	int pos = i % STACK;
111c9e4df9bSmrg	int color = (i & 1 ? xp->foreground : xp->background);
112dfac8f13Smrg	children[i] = XCreateSimpleWindow (xp->d, xp->w,
113264fa531Smrg	    pos*CHILDSIZE/4 + (i/STACK)*2*CHILDSIZE, pos*CHILDSIZE/4,
114264fa531Smrg	    CHILDSIZE, CHILDSIZE, 0, color, color);
115264fa531Smrg    }
116264fa531Smrg    if (p->special)
117264fa531Smrg	XMapSubwindows (xp->d, xp->w);
118264fa531Smrg    return reps;
119264fa531Smrg}
120264fa531Smrg
121dfac8f13Smrgvoid
122533545b5SmrgDoCircWindows(XParms xp, Parms p, int64_t reps)
123264fa531Smrg{
124c9e4df9bSmrg    for (int i = 0; i != reps; i++)
125264fa531Smrg    {
126c9e4df9bSmrg	for (int j = 0; j != p->objects; j++)
127264fa531Smrg	    XCirculateSubwindows (xp->d, xp->w, RaiseLowest);
128264fa531Smrg	CheckAbort ();
129264fa531Smrg    }
130264fa531Smrg}
131264fa531Smrg
132dfac8f13Smrgvoid
133264fa531SmrgEndCircWindows(XParms xp, Parms p)
134264fa531Smrg{
135264fa531Smrg    free(children);
136264fa531Smrg}
137264fa531Smrg
138264fa531Smrg
139dfac8f13Smrgint
140533545b5SmrgInitMoveTree(XParms xp, Parms p, int64_t reps)
141264fa531Smrg{
142264fa531Smrg    rows = (p->objects + MAXCOLS - 1) / MAXCOLS;
143dfac8f13Smrg
144264fa531Smrg    x_offset = 0;
145264fa531Smrg    y_offset = 0;
146264fa531Smrg    delta1   = 1;
147264fa531Smrg
148c9e4df9bSmrg    children = malloc(p->objects * sizeof (Window));
149c9e4df9bSmrg    positions = malloc(p->objects * sizeof(XPoint));
150264fa531Smrg
151264fa531Smrg    xmax = (CHILDSIZE+CHILDSPACE) * (rows > 1 ? MAXCOLS : p->objects);
152264fa531Smrg    ymax = rows * (CHILDSIZE+CHILDSPACE);
153264fa531Smrg
154264fa531Smrg    cover = XCreateSimpleWindow(xp->d, xp->w,
155264fa531Smrg				0, 0, xmax, ymax, 0,
156264fa531Smrg				xp->background, xp->background);
157dfac8f13Smrg
158c9e4df9bSmrg    for (int i = 0; i != p->objects; i++) {
159264fa531Smrg	positions[i].x = (CHILDSIZE+CHILDSPACE) * (i/rows) + CHILDSPACE/2;
160264fa531Smrg	positions[i].y = (CHILDSIZE+CHILDSPACE) * (i%rows) + CHILDSPACE/2;
161264fa531Smrg	children[i] = XCreateSimpleWindow(xp->d, cover,
162264fa531Smrg	    positions[i].x, positions[i].y,
163264fa531Smrg	    CHILDSIZE, CHILDSIZE, 0, xp->foreground, xp->foreground);
164264fa531Smrg    }
165264fa531Smrg    XMapSubwindows (xp->d, cover);
166264fa531Smrg    XMapWindow (xp->d, cover);
167264fa531Smrg    return reps;
168264fa531Smrg}
169264fa531Smrg
170dfac8f13Smrgvoid
171533545b5SmrgDoMoveTree(XParms xp, Parms p, int64_t reps)
172264fa531Smrg{
173c9e4df9bSmrg    for (int i = 0; i != reps; i++) {
174264fa531Smrg	x_offset += 1;
175264fa531Smrg	y_offset += 3;
176264fa531Smrg	if (y_offset + ymax > HEIGHT)
177264fa531Smrg	    y_offset = 0;
178264fa531Smrg	if (x_offset + xmax > WIDTH)
179264fa531Smrg	    x_offset = 0;
180264fa531Smrg	XMoveWindow(xp->d, cover, x_offset, y_offset);
181264fa531Smrg	CheckAbort ();
182264fa531Smrg    }
183264fa531Smrg}
184264fa531Smrg
185dfac8f13Smrgvoid
186264fa531SmrgEndMoveTree(XParms xp, Parms p)
187264fa531Smrg{
188264fa531Smrg    XDestroyWindow(xp->d, cover);
189264fa531Smrg    free(children);
190264fa531Smrg    free(positions);
191264fa531Smrg}
192