
Cherry-picked from gallium-0.1 Conflicts: src/glu/sgi/libnurbs/interface/bezierEval.h src/glu/sgi/libnurbs/interface/bezierPatch.h src/glu/sgi/libnurbs/interface/bezierPatchMesh.h src/glu/sgi/libnurbs/internals/dataTransform.h src/glu/sgi/libnurbs/internals/displaymode.h src/glu/sgi/libnurbs/internals/sorter.h src/glu/sgi/libnurbs/nurbtess/definitions.h src/glu/sgi/libnurbs/nurbtess/directedLine.h src/glu/sgi/libnurbs/nurbtess/gridWrap.h src/glu/sgi/libnurbs/nurbtess/monoChain.h src/glu/sgi/libnurbs/nurbtess/monoPolyPart.h src/glu/sgi/libnurbs/nurbtess/monoTriangulation.h src/glu/sgi/libnurbs/nurbtess/partitionX.h src/glu/sgi/libnurbs/nurbtess/partitionY.h src/glu/sgi/libnurbs/nurbtess/polyDBG.h src/glu/sgi/libnurbs/nurbtess/polyUtil.h src/glu/sgi/libnurbs/nurbtess/primitiveStream.h src/glu/sgi/libnurbs/nurbtess/quicksort.h src/glu/sgi/libnurbs/nurbtess/rectBlock.h src/glu/sgi/libnurbs/nurbtess/sampleComp.h src/glu/sgi/libnurbs/nurbtess/sampleCompBot.h src/glu/sgi/libnurbs/nurbtess/sampleCompRight.h src/glu/sgi/libnurbs/nurbtess/sampleCompTop.h src/glu/sgi/libnurbs/nurbtess/sampleMonoPoly.h src/glu/sgi/libnurbs/nurbtess/sampledLine.h src/glu/sgi/libnurbs/nurbtess/searchTree.h src/glu/sgi/libnurbs/nurbtess/zlassert.h src/glu/sgi/libutil/error.c src/glu/sgi/libutil/glue.c src/glu/sgi/libutil/gluint.h src/glu/sgi/libutil/project.c src/glu/sgi/libutil/registry.c src/glx/x11/glxclient.h src/glx/x11/glxext.c src/mesa/drivers/dri/ffb/ffb_dd.h src/mesa/drivers/dri/ffb/ffb_points.h src/mesa/drivers/dri/gamma/gamma_context.h src/mesa/drivers/dri/gamma/gamma_macros.h src/mesa/drivers/dri/i810/i810context.h src/mesa/drivers/dri/r128/r128_dd.h src/mesa/drivers/dri/tdfx/tdfx_dd.h
112 lines
2.0 KiB
C
112 lines
2.0 KiB
C
|
|
/*
|
|
* Sample server that just keeps first available window mapped.
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <GL/gl.h>
|
|
#include <GL/miniglx.h>
|
|
|
|
struct client {
|
|
struct client *next;
|
|
Window windowid;
|
|
int mappable;
|
|
};
|
|
|
|
struct client *clients = 0, *mapped_client = 0;
|
|
|
|
|
|
static struct client *find_client( Window id )
|
|
{
|
|
struct client *c;
|
|
|
|
for (c = clients ; c ; c = c->next)
|
|
if (c->windowid == id)
|
|
return c;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main( int argc, char *argv[] )
|
|
{
|
|
Display *dpy;
|
|
XEvent ev;
|
|
|
|
dpy = __miniglx_StartServer(NULL);
|
|
if (!dpy) {
|
|
fprintf(stderr, "Error: __miniglx_StartServer failed\n");
|
|
return 1;
|
|
}
|
|
|
|
while (XNextEvent( dpy, &ev )) {
|
|
struct client *c;
|
|
|
|
switch (ev.type) {
|
|
case MapRequest:
|
|
fprintf(stderr, "MapRequest\n");
|
|
c = find_client(ev.xmaprequest.window);
|
|
if (!c) break;
|
|
c->mappable = True;
|
|
break;
|
|
|
|
case UnmapNotify:
|
|
fprintf(stderr, "UnmapNotify\n");
|
|
c = find_client(ev.xunmap.window);
|
|
if (!c) break;
|
|
c->mappable = False;
|
|
if (c == mapped_client)
|
|
mapped_client = 0;
|
|
break;
|
|
|
|
case CreateNotify:
|
|
fprintf(stderr, "CreateNotify\n");
|
|
c = malloc(sizeof(*c));
|
|
c->next = clients;
|
|
c->windowid = ev.xcreatewindow.window;
|
|
c->mappable = False;
|
|
clients = c;
|
|
break;
|
|
|
|
case DestroyNotify:
|
|
fprintf(stderr, "DestroyNotify\n");
|
|
c = find_client(ev.xdestroywindow.window);
|
|
if (!c) break;
|
|
if (c == clients)
|
|
clients = c->next;
|
|
else {
|
|
struct client *t;
|
|
for (t = clients ; t->next != c ; t = t->next)
|
|
;
|
|
t->next = c->next;
|
|
}
|
|
|
|
if (c == mapped_client)
|
|
mapped_client = 0;
|
|
|
|
free(c);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
/* Search for first mappable client if none already mapped.
|
|
*/
|
|
if (!mapped_client) {
|
|
for (c = clients ; c ; c = c->next) {
|
|
if (c->mappable) {
|
|
XMapWindow( dpy, c->windowid );
|
|
mapped_client = c;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
XCloseDisplay( dpy );
|
|
|
|
return 0;
|
|
}
|