-/* xscreensaver, Copyright (c) 1992-2012 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2014 Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
Pixmap left1, left2, right1, right2;
Pixmap left_front, right_front, front, down;
- char *program;
text_data *tc;
int state; /* indicates states: walking or getting passwd */
}
#define MAXLINES 10
+#define LINELEN 256
static void
talk (struct state *st, int force_erase)
total = 0;
register char *p,
*p2;
- char args[MAXLINES][256];
+ char args[MAXLINES][LINELEN];
/* clear what we've written */
if (st->talking || force_erase)
}
return;
}
+ p = st->words;
+ /* If there is actually no words, just return */
+ if (!*p)
+ {
+ st->talking = 0;
+ return;
+ }
st->talking = 1;
walk(st, FRONT);
- p = st->words;
for (p2 = p; *p2; p2++)
if (*p2 == '\t') *p2 = ' ';
if (!(p2 = strchr(p, '\n')) || !p2[1])
{
total = strlen (st->words);
- strcpy (args[0], st->words);
+ strncpy (args[0], st->words, LINELEN);
+ args[0][LINELEN - 1] = 0;
width = XTextWidth(st->font, st->words, total);
height = 0;
}
width = w;
total += p2 - p; /* total chars; count to determine reading
* time */
- (void) strcpy(args[height], p);
+ (void) strncpy(args[height], p, LINELEN);
+ args[height][LINELEN - 1] = 0;
if (height == MAXLINES - 1)
{
/* puts("Message too long!"); */
for (Z = 0; Z < height; Z++)
{
int L = strlen(args[Z]);
- if (args[Z][L-1] == '\r' || args[Z][L-1] == '\n')
+ /* If there are continuous new lines, L can be 0 */
+ if (L && (args[Z][L-1] == '\r' || args[Z][L-1] == '\n'))
args[Z][--L] = 0;
XDrawString(st->dpy, st->window, st->text_fg_gc, st->s_rect.x + st->X, st->s_rect.y + st->Y,
args[Z], L);
fill_words (struct state *st)
{
char *p = st->words + strlen(st->words);
+ char *c;
+ int lines = 0;
+ int max = MAXLINES;
+
+ for (c = st->words; c < p; c++)
+ if (*c == '\n')
+ lines++;
+
while (p < st->words + sizeof(st->words) - 1 &&
- st->lines < MAXLINES)
+ lines < max)
{
- char c = textclient_getc (st->tc);
+ int c = textclient_getc (st->tc);
if (c == '\n')
- st->lines++;
+ lines++;
if (c > 0)
- *p++ = c;
+ *p++ = (char) c;
else
break;
}
*p = 0;
+
+ st->lines = lines;
}
"*textForeground: black",
"*textBackground: #CCCCCC",
"*fpsSolid: true",
- "*program: xscreensaver-text --cols 40 | head -n15",
+ "*program: xscreensaver-text",
"*usePty: False",
".font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
0
st->Height = xgwa.height + 2;
cmap = xgwa.colormap;
- st->program = get_string_resource (st->dpy, "program", "Program");
st->tc = textclient_open (st->dpy);
+ {
+ int w = 40;
+ int h = 15;
+ textclient_reshape (st->tc, w, h, w, h,
+ /* Passing MAXLINES isn't actually necessary */
+ 0);
+ }
+
init_images(st);
if (!fontname || !*fontname)