-/* xscreensaver, Copyright (c) 1992, 1996, 1997, 1998
- * Jamie Zawinski <jwz@netscape.com>
+/* xscreensaver, Copyright (c) 1992, 1996, 1997, 1998, 2005
+ * 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
*/
/* Make a little guy with a big nose and a hat wanter around the screen,
- spewing out messages. Derived from xnlock by Dan Heller <argv@sun.com>.
+ spewing out messages. Derived from xnlock by
+ Dan Heller <argv@danheller.com>.
*/
#include "screenhack.h"
+#include "xpm-pixmap.h"
#include <stdio.h>
extern FILE *popen (const char *, const char *);
static char *get_words (void);
static int x, y;
static XFontStruct *font;
-static char *def_words = "I'm out running around.";
static void walk (int dir);
static void talk (int erase);
static void talk_1 (void);
#define FROM_PROGRAM 2
#define FROM_FILE 3
#define FROM_RESRC 4
-static int getwordsfrom;
#define IS_MOVING 1
#define GET_PASSWD 2
static void (*next_fn) (void);
-#ifdef HAVE_XPM
-# include <X11/xpm.h>
-
+#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
# include "images/noseguy/nose-f1.xpm"
# include "images/noseguy/nose-f2.xpm"
# include "images/noseguy/nose-f3.xpm"
&left_front, &right_front, &front, &down
};
int i;
-#ifdef HAVE_XPM
+#if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
+
static char **bits[] = {
nose_l1_xpm, nose_l2_xpm, nose_r1_xpm, nose_r2_xpm,
nose_f2_xpm, nose_f3_xpm, nose_f1_xpm, nose_f4_xpm
};
+
+
for (i = 0; i < sizeof (images) / sizeof(*images); i++)
{
- XWindowAttributes xgwa;
- XpmAttributes xpmattrs;
- Pixmap pixmap = 0;
- int result;
- xpmattrs.valuemask = 0;
-
- XGetWindowAttributes (dpy, window, &xgwa);
-
-# ifdef XpmCloseness
- xpmattrs.valuemask |= XpmCloseness;
- xpmattrs.closeness = 40000;
-# endif
-# ifdef XpmVisual
- xpmattrs.valuemask |= XpmVisual;
- xpmattrs.visual = xgwa.visual;
-# endif
-# ifdef XpmDepth
- xpmattrs.valuemask |= XpmDepth;
- xpmattrs.depth = xgwa.depth;
-# endif
-# ifdef XpmColormap
- xpmattrs.valuemask |= XpmColormap;
- xpmattrs.colormap = xgwa.colormap;
-# endif
-
- result = XpmCreatePixmapFromData(dpy, window, bits[i],
- &pixmap, 0 /* mask */, &xpmattrs);
- if (!pixmap || (result != XpmSuccess && result != XpmColorError))
+ Pixmap pixmap = xpm_data_to_pixmap (dpy, window, bits[i],
+ 0, 0, 0);
+ if (!pixmap)
{
fprintf (stderr, "%s: Can't load nose images\n", progname);
exit (1);
walk(FRONT);
if (random() & 1)
{
- if (getwordsfrom == FROM_PROGRAM)
- words = get_words();
- return 1;
+ words = get_words();
+ return 1;
}
return 0;
}
-#define MAXLINES 40
+#define MAXLINES 25
+
+#undef BUFSIZ
+#define BUFSIZ ((MAXLINES + 1) * 100)
+
static void
talk(int force_erase)
walk(FRONT);
p = strcpy(buf, words);
+ for (p2 = p; *p2; p2++)
+ if (*p2 == '\t') *p2 = ' ';
+
if (!(p2 = strchr(p, '\n')) || !p2[1])
{
total = strlen (words);
(void) strcpy(args[height], p);
if (height == MAXLINES - 1)
{
- puts("Message too long!");
+ /* puts("Message too long!"); */
break;
}
p = p2 + 1;
static void
init_words (void)
{
- char *mode = get_string_resource ("mode", "Mode");
-
program = get_string_resource ("program", "Program");
filename = get_string_resource ("filename", "Filename");
text = get_string_resource ("text", "Text");
strcat (program, " ) 2>&1");
}
- if (!mode || !strcmp (mode, "program"))
- getwordsfrom = FROM_PROGRAM;
- else if (!strcmp (mode, "file"))
- getwordsfrom = FROM_FILE;
- else if (!strcmp (mode, "string"))
- getwordsfrom = FROM_RESRC;
- else
- {
- fprintf (stderr,
- "%s: mode must be program, file, or string, not %s\n",
- progname, mode);
- exit (1);
- }
-
- if (getwordsfrom == FROM_PROGRAM && !program)
- {
- fprintf (stderr, "%s: no program specified.\n", progname);
- exit (1);
- }
- if (getwordsfrom == FROM_FILE && !filename)
- {
- fprintf (stderr, "%s: no file specified.\n", progname);
- exit (1);
- }
-
words = get_words();
}
buf[0] = '\0';
- switch (getwordsfrom)
- {
- case FROM_PROGRAM:
-#ifndef VMS
if ((pp = popen(program, "r")))
{
while (fgets(p, sizeof(buf) - strlen(buf), pp))
sprintf (buf, "\"%s\" produced no output!", orig_program);
else if (!first_time &&
(strstr (buf, ": not found") ||
- strstr (buf, ": Not found")))
+ strstr (buf, ": Not found") ||
+ strstr (buf, ": command not found") ||
+ strstr (buf, ": Command not found")))
switch (random () % 20)
{
case 1: strcat (buf, "( Get with the program, bub. )\n");
else
{
perror(program);
- p = def_words;
- }
- break;
-#endif /* VMS */
- case FROM_FILE:
- if ((pp = fopen(filename, "r")))
- {
- while (fgets(p, sizeof(buf) - strlen(buf), pp))
- {
- if (strlen(buf) + 1 < sizeof(buf))
- p = buf + strlen(buf);
- else
- break;
- }
- (void) fclose(pp);
- if (! buf[0])
- sprintf (buf, "file \"%s\" is empty!", filename);
- p = buf;
}
- else
- {
- sprintf (buf, "couldn't read file \"%s\"!", filename);
- p = buf;
- }
- break;
- case FROM_RESRC:
- p = text;
- break;
- default:
- p = def_words;
- break;
- }
- if (!p || *p == '\0')
- p = def_words;
return p;
}
char *progclass = "Noseguy";
char *defaults [] = {
- "Noseguy.background: black", /* to placate SGI */
- "Noseguy.foreground: gray80",
-#ifndef VMS
- "*mode: program",
-#else
- "*mode: string",
-#endif
- "*program: " ZIPPY_PROGRAM,
- "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
+ ".background: black",
+ ".foreground: gray80",
+ "*program: xscreensaver-text --cols 40 | head -15",
+ "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
0
};
while (1)
{
next_fn();
- XSync (dpy, True);
+ XSync (dpy, False);
+ screenhack_handle_events (dpy);
usleep (interval * 1000);
}
}