X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fstarwars.c;h=5772d1ebf150c7492097bdf0a009a95d18ab5953;hb=a94197e76a5dea5cb60542840809d6c20d0abbf3;hp=a6d5745caccce1c48704d5acb95cd1bef773cb81;hpb=a445bdd3e3ba4abbee441844b6665b4c3c13d48c;p=xscreensaver diff --git a/hacks/glx/starwars.c b/hacks/glx/starwars.c index a6d5745c..5772d1eb 100644 --- a/hacks/glx/starwars.c +++ b/hacks/glx/starwars.c @@ -43,7 +43,7 @@ extern XtAppContext app; #define HACK_RESHAPE reshape_sws #define sws_opts xlockmore_opts -#define DEF_PROGRAM ZIPPY_PROGRAM +#define DEF_PROGRAM "(default)" #define DEF_LINES "125" #define DEF_STEPS "35" #define DEF_SPIN "0.03" @@ -87,11 +87,17 @@ extern XtAppContext app; #ifdef USE_GL /* whole file */ +#include #include +#include #include "glutstroke.h" #include "glut_roman.h" #define GLUT_FONT (&glutStrokeRoman) +#ifdef HAVE_UNAME +# include +#endif /* HAVE_UNAME */ + typedef struct { GLXContext *glx_context; @@ -253,8 +259,39 @@ static void launch_text_generator (sws_configuration *sc) { char *oprogram = get_string_resource ("program", "Program"); - char *program = (char *) malloc (strlen (oprogram) + 10); + char *program; + + if (!strcasecmp(oprogram, "(default)")) + { + oprogram = FORTUNE_PROGRAM; + +#ifdef __linux__ + { + static int done_once = 0; + if (!done_once) + { + struct utsname uts; + struct stat st; + done_once = 1; + if (uname (&uts) == 0) + { + static char cmd[200]; + char *s; + /* strip version at the first non-digit-dash-dot, to + lose any "SMP" crap at the end. */ + for (s = uts.release; *s; s++) + if (!isdigit(*s) && *s != '.' && *s != '-') + *s = 0; + sprintf (cmd, "cat /usr/src/linux-%s/README", uts.release); + if (!stat (cmd+4, &st)) + oprogram = cmd; + } + } + } +#endif /* __linux__ */ + } + program = (char *) malloc (strlen (oprogram) + 10); strcpy (program, "( "); strcat (program, oprogram); strcat (program, " ) 2>&1"); @@ -342,12 +379,17 @@ get_more_lines (sws_configuration *sc) return; } - if (*s == '\n' || col > sc->columns) + if (*s == '\r' || *s == '\n' || col > sc->columns) { int L = s - sc->buf; - if (*s == '\n') - *s++ = 0; + if (*s == '\r' || *s == '\n') + { + if (*s == '\r' && s[1] == '\n') /* swallow CRLF too */ + *s++ = 0; + + *s++ = 0; + } else { /* We wrapped -- try to back up to the previous word boundary. */ @@ -496,6 +538,41 @@ box (double width, double height, double depth) #endif /* DEBUG */ +/* Construct stars (number of stars is dependent on size of screen) */ +static void +init_stars (ModeInfo *mi, int width, int height) +{ + sws_configuration *sc = &scs[MI_SCREEN(mi)]; + int i, j; + int nstars = width * height / 320; + int max_size = 3; + GLfloat inc = 0.5; + int steps = max_size / inc; + + glDeleteLists (sc->star_list, 1); + sc->star_list = glGenLists (1); + glNewList (sc->star_list, GL_COMPILE); + + glEnable(GL_POINT_SMOOTH); + + for (j = 1; j <= steps; j++) + { + glPointSize(inc * j); + glBegin (GL_POINTS); + for (i = 0; i < nstars / steps; i++) + { + glColor3f (0.6 + frand(0.3), + 0.6 + frand(0.3), + 0.6 + frand(0.3)); + glVertex2f (2 * width * (0.5 - frand(1.0)), + 2 * height * (0.5 - frand(1.0))); + } + glEnd (); + } + glEndList (); +} + + /* Window management, etc */ void @@ -536,27 +613,6 @@ reshape_sws (ModeInfo *mi, int width, int height) } - /* Construct stars (number of stars is dependent on size of screen) */ - { - int i; - int nstars = width * height / 320; - glDeleteLists (sc->star_list, 1); - sc->star_list = glGenLists (1); - glNewList (sc->star_list, GL_COMPILE); - glBegin (GL_POINTS); - for (i = 0; i < nstars; i++) - { - GLfloat c = 0.6 + 0.3 * random() / RAND_MAX; - glColor3f (c, c, c); - glVertex3f (2 * width * (0.5 - 1.0 * random() / RAND_MAX), - 2 * height * (0.5 - 1.0 * random() / RAND_MAX), - 0.0); - } - glEnd (); - glEndList (); - } - - /* Compute the height in pixels of the line at the bottom of the screen. */ { GLdouble mm[17], pm[17]; @@ -640,10 +696,10 @@ init_sws (ModeInfo *mi) if ((sc->glx_context = init_GL(mi)) != NULL) { gl_init(mi); reshape_sws (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + init_stars (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); } - font_height = GLUT_FONT->top - GLUT_FONT->bottom; sc->font_scale = 1.0 / glutStrokeWidth (GLUT_FONT, 'z'); /* 'n' seems too wide */ @@ -666,7 +722,6 @@ init_sws (ModeInfo *mi) sc->subproc_relaunch_delay = 2 * 1000; sc->total_lines = max_lines-1; - launch_text_generator (sc); if (random() & 1) star_spin = -star_spin; @@ -686,6 +741,11 @@ init_sws (ModeInfo *mi) progname, alignment_str); exit (1); } + + launch_text_generator (sc); + + /* one more reshape, after line_height has been computed */ + reshape_sws (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); }