X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fmemscroller.c;h=f4d68ca5852472baff43550540d21a3db7442f50;hp=b4b98ba7bbcb589d454eface5acabf6557e8b09b;hb=bc7b7a8eb122206d239ec0e693676bcce31be1aa;hpb=ffd8c0873576a9e3065696a624dce6b766b77062 diff --git a/hacks/memscroller.c b/hacks/memscroller.c index b4b98ba7..f4d68ca5 100644 --- a/hacks/memscroller.c +++ b/hacks/memscroller.c @@ -38,9 +38,12 @@ typedef struct { XFontStruct *font; int border; - enum { SEED_RAM, SEED_RANDOM } seed_mode; + enum { SEED_RAM, SEED_RANDOM, SEED_FILE } seed_mode; enum { DRAW_COLOR, DRAW_MONO } draw_mode; + char *filename; + FILE *in; + int nscrollers; scroller *scrollers; @@ -141,26 +144,23 @@ init_memscroller (Display *dpy, Window window) exit (1); } if (s) free (s); + s = 0; - s = get_string_resource ("seedMode", "SeedMode"); - if (!s || !*s || - !strcasecmp (s, "ram") || - !strcasecmp (s, "mem") || - !strcasecmp (s, "memory")) + st->filename = get_string_resource ("filename", "Filename"); + + if (!st->filename || + !*st->filename || + !strcasecmp (st->filename, "(ram)") || + !strcasecmp (st->filename, "(mem)") || + !strcasecmp (st->filename, "(memory)")) st->seed_mode = SEED_RAM; - else if (!strcasecmp (s, "rand") || - !strcasecmp (s, "random")) + else if (st->filename && + (!strcasecmp (st->filename, "(rand)") || + !strcasecmp (st->filename, "(random)"))) st->seed_mode = SEED_RANDOM; else - { - fprintf (stderr, "%s: seedMode must be 'RAM' or 'random', not '%s'\n", - progname, s); - exit (1); - } - if (s) free (s); - s = 0; - + st->seed_mode = SEED_FILE; st->nscrollers = 3; st->scrollers = (scroller *) calloc (st->nscrollers, sizeof(scroller)); @@ -253,6 +253,26 @@ reshape_memscroller (state *st) +static void +open_file (state *st) +{ + if (st->in) + { + fclose (st->in); + st->in = 0; + } + + st->in = fopen (st->filename, "r"); + if (!st->in) + { + char buf[1024]; + sprintf (buf, "%s: %s", progname, st->filename); + perror (buf); + exit (1); + } +} + + static unsigned int more_bits (state *st, scroller *sc) { @@ -284,6 +304,12 @@ more_bits (state *st, scroller *sc) himem = ((unsigned char *) sbrk(0)) - (2 * sizeof(void *)); # endif + /* I don't understand what's going on there, but on MacOS X, + we're getting insane values for lomem and himem. Is there + more than one heap? */ + if ((unsigned long) himem - (unsigned long) lomem > 0x0FFFFFFF) + himem = lomem + 0xFFFF; + if (lomem >= himem) abort(); RETRY: @@ -339,6 +365,49 @@ more_bits (state *st, scroller *sc) v = PACK(r,g,b); break; + case SEED_FILE: + { + int i; + + /* this one returns only bytes from the file */ +# define GETC(V) \ + do { \ + i = fgetc (st->in); \ + } while (i == EOF \ + ? (open_file (st), 1) \ + : 0); \ + V = i + + /* this one returns a null at EOF -- else we hang on zero-length files */ +# undef GETC +# define GETC(V) \ + i = fgetc (st->in); \ + if (i == EOF) { i = 0; open_file (st); } \ + V = i + + if (!st->in) + open_file (st); + + switch (st->draw_mode) + { + case DRAW_COLOR: + GETC(r); + GETC(g); + GETC(b); + break; + case DRAW_MONO: + r = 0; + GETC(g); + b = 0; + break; + default: + abort(); + } +# undef GETC + v = PACK(r,g,b); + } + break; + default: abort(); } @@ -459,7 +528,7 @@ char *progclass = "MemScroller"; char *defaults [] = { ".background: black", "*drawMode: color", - "*seedMode: ram", + "*filename: (RAM)", ".textColor: #00FF00", ".foreground: #00FF00", "*borderSize: 2", @@ -472,10 +541,11 @@ char *defaults [] = { XrmOptionDescRec options [] = { { "-delay", ".delay", XrmoptionSepArg, 0 }, { "-font", ".font", XrmoptionSepArg, 0 }, - { "-color", ".drawMode", XrmoptionNoArg, "color" }, - { "-mono", ".drawMode", XrmoptionNoArg, "mono" }, - { "-ram", ".seedMode", XrmoptionNoArg, "ram" }, - { "-random", ".seedMode", XrmoptionNoArg, "random" }, + { "-filename", ".filename", XrmoptionSepArg, 0 }, + { "-color", ".drawMode", XrmoptionNoArg, "color" }, + { "-mono", ".drawMode", XrmoptionNoArg, "mono" }, + { "-ram", ".filename", XrmoptionNoArg, "(RAM)" }, + { "-random", ".filename", XrmoptionNoArg, "(RANDOM)" }, { 0, 0, 0, 0 } };