#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;
static void
ComputeSizes(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(XParms xp, Parms p, int reps)
{
int i;
ComputeSizes(xp, p);
parentcolumns = WIDTH / parentwidth;
parentrows = HEIGHT / parentheight;
parentwindows = parentcolumns * parentrows;
if (parentwindows > reps) {
parentwindows = reps;
}
isolates = (Window *)malloc(parentwindows * sizeof(Window));
parents = (Window *)malloc(parentwindows * sizeof(Window));
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;
}
void
MapParents(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != parentwindows; i++) {
XMapWindow(xp->d, parents[i]);
}
}
void
MapParentsCleanup(XParms xp, Parms p)
{
int i;
for (i = 0; i != parentwindows; i++) {
XMapWindow(xp->d, parents[i]);
}
}
int
InitCreate(XParms xp, Parms p, int reps)
{
reps = CreateParents(xp, p, reps);
MapParents(xp, p, reps);
return reps;
}
static void
CreateChildGroup(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(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != parentwindows; i++) {
CreateChildGroup(xp, p, parents[i]);
}
}
void
DestroyChildren(XParms xp, Parms p)
{
int i;
for (i = 0; i != parentwindows; i++) {
XDestroySubwindows(xp->d, parents[i]);
}
}
void
EndCreate(XParms xp, Parms p)
{
XDestroySubwindows(xp->d, xp->w);
free(parents);
free(isolates);
}
int
InitMap(XParms xp, Parms p, int reps)
{
reps = CreateParents(xp, p, reps);
CreateChildren(xp, p, reps);
return reps;
}
void
UnmapParents(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != parentwindows; i++) {
XUnmapWindow(xp->d, parents[i]);
}
}
void
UnmapParentsCleanup(XParms xp, Parms p)
{
int i;
for (i = 0; i != parentwindows; i++) {
XUnmapWindow(xp->d, parents[i]);
}
}
int
InitDestroy(XParms xp, Parms p, int reps)
{
reps = CreateParents(xp, p, reps);
CreateChildren(xp, p, reps);
MapParents(xp, p, reps);
return reps;
}
void
DestroyParents(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != parentwindows; i++) {
XDestroyWindow(xp->d, parents[i]);
}
}
void
RenewParents(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(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);
(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);
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(XParms xp, Parms p, int reps)
{
int i;
for (i = 0; i != reps; i++) {
XMapWindow(xp->d, popup);
XUnmapWindow(xp->d, popup);
CheckAbort ();
}
}
void
EndPopups(XParms xp, Parms p)
{
XDestroySubwindows(xp->d, xp->w);
#ifdef CHILDROOT
XDestroyWindow(xp->d, popup);
#endif
}