X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fstonerview-view.c;h=1905c273adf0be3d0e19c0e6871beb8d735e937a;hb=8eb2873d7054e705c4e83f22d18c40946a9e2529;hp=a72478123ca94141925b6f61379603dfb3ab3f6c;hpb=ebc241816cc8e3eec7270a594bb1a607df32bcd6;p=xscreensaver diff --git a/hacks/glx/stonerview-view.c b/hacks/glx/stonerview-view.c index a7247812..1905c273 100644 --- a/hacks/glx/stonerview-view.c +++ b/hacks/glx/stonerview-view.c @@ -64,8 +64,7 @@ static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW; static void usage (void) { - fprintf (stderr, - "usage: %s [--geom =WxH+X+Y | --fullscreen | --root] [--wire]\n", + fprintf (stderr, "usage: %s [--wire] [--geom G | --root | --window-id ID]\n", progname); exit (1); } @@ -111,6 +110,7 @@ int init_view(int *argc, char *argv[]) int ix; int fullscreen = 0; int on_root = 0; + Window on_window = 0; int undef = -65536; int x = undef, y = undef; @@ -125,6 +125,8 @@ int init_view(int *argc, char *argv[]) XSizeHints hints; GLXContext glx_context = 0; + progname = argv[0]; + memset (&hints, 0, sizeof(hints)); for (ix=1; ix<*argc; ix++) @@ -147,6 +149,17 @@ int init_view(int *argc, char *argv[]) if (geom || fullscreen) usage(); on_root = 1; } + else if (!strcmp(argv[ix], "-window-id") && + *argc > ix+1) + { + unsigned long id; + char c; + if (1 != sscanf (argv[ix+1], "%lu %c", &id, &c) && + 1 != sscanf (argv[ix+1], "0x%lx %c", &id, &c)) + usage(); + ix++; + on_window = (Window) id; + } else if (!strcmp(argv[ix], "-fullscreen") || !strcmp(argv[ix], "-full")) { @@ -172,9 +185,9 @@ int init_view(int *argc, char *argv[]) XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False); XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False); - if (on_root) + if (on_root || on_window) { - window = RootWindow (dpy, screen); + window = (on_window ? on_window : RootWindow (dpy, screen)); XGetWindowAttributes (dpy, window, &xgwa); visual = xgwa.visual; w = xgwa.width; @@ -344,7 +357,7 @@ int init_view(int *argc, char *argv[]) return 1; } -static void setup_window() +static void setup_window(void) { glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); @@ -359,6 +372,7 @@ void win_draw(void) { int ix; static GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; + static GLfloat gray[] = { 0.6, 0.6, 0.6, 1.0 }; glDrawBuffer(GL_BACK); @@ -370,29 +384,32 @@ void win_draw(void) glRotatef(view_roty, 0.0, 1.0, 0.0); glRotatef(view_rotz, 0.0, 0.0, 1.0); + glShadeModel(GL_FLAT); + for (ix=0; ixcol)); - glShadeModel(GL_FLAT); - glBegin(wireframe ? GL_LINE_LOOP : GL_QUADS); - glNormal3f(0.0, 0.0, 1.0); - glVertex3f(el->pos[0] - el->vervec[0], el->pos[1] - el->vervec[1], - el->pos[2]); - glVertex3f(el->pos[0] + el->vervec[1], el->pos[1] - el->vervec[0], - el->pos[2]); - glVertex3f(el->pos[0] + el->vervec[0], el->pos[1] + el->vervec[1], - el->pos[2]); - glVertex3f(el->pos[0] - el->vervec[1], el->pos[1] + el->vervec[0], - el->pos[2]); + /* outline the square */ + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, (wireframe ? white : gray)); + glBegin(GL_LINE_LOOP); + glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]); + glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]); + glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]); + glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]); glEnd(); - glPopMatrix(); + if (wireframe) continue; + + /* fill the square */ + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, el->col); + glBegin(GL_QUADS); + glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]); + glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]); + glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]); + glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]); + glEnd(); } glPopMatrix();