-/*****************************************************************************
+/****************************************************************************
* *
* xsublim -- Submit. Conform. Obey. *
* *
- * Copyright (c) 1999 Greg Knauss (greg@eod.com) *
+ * Copyright (c) 1999 - 2000 Greg Knauss (greg@eod.com) *
* *
* Thanks to Jamie Zawinski, whose suggestions and advice made what was a *
* boring little program into a less boring (and a _lot_ less little) *
/* Arguments ******************************************************************
-font font Font to use
+ -file filename New-line delimited phrase file
+ -program executable New-line delimited phrase-producing executable
-delayShow ms Microsecs for display of each word
-delayWord ms Microsecs for blank between words
-delayPhraseMin ms Microsecs for min blank between phrases
*/
+/* Changelog ******************************************************************
+
+ 1.1.1 20000407 Added -program
+ 1.1.0 19991221 Added -file
+ 1.0.1 19990716 Assume that XGetImage()/XDestroyImage() don't leak,
+ which they apparently don't. I have no idea how I
+ convinced myself that they did. Huh. (greg@eod.com)
+ 1.0.0 19990716 Initial release
+*/
+
+
/* Defines *******************************************************************/
#define XSUBLIM_NAME "XSublim"
#define XSUBLIM_TEXT_COUNT 1000
#define XSUBLIM_TEXT_LENGTH 128
#define XSUBLIM_TEXT_OUTLINE 1
+#define XSUBLIM_PROGRAM_SIZE 1024*10
#define XSUBLIM_ARG_DELAYSHOW "delayShow"
#define XSUBLIM_ARG_DELAYWORD "delayWord"
#define XSUBLIM_ARG_DELAYPHRASEMIN "delayPhraseMin"
#define XSUBLIM_ARG_DELAYPHRASEMAX "delayPhraseMax"
#define XSUBLIM_ARG_RANDOM "random"
#define XSUBLIM_ARG_FILE "file"
+#define XSUBLIM_ARG_PROGRAM "program"
#define XSUBLIM_ARG_SCREENSAVER "screensaver"
#define XSUBLIM_ARG_OUTLINE "outline"
#define XSUBLIM_ARG_CENTER "center"
#include <stdlib.h>
#include <string.h>
#include <signal.h>
+#include <sys/stat.h>
#include <X11/Intrinsic.h>
#include <X11/IntrinsicP.h>
#include <X11/CoreP.h>
#include <X11/SGIScheme.h>
#endif
-#include "yarandom.h"
#include "usleep.h"
+#include "yarandom.h"
#include "resources.h"
XrmoptionNoArg,"false"},
{"-" XSUBLIM_ARG_FILE, "." XSUBLIM_ARG_FILE,
XrmoptionSepArg,0 },
+#if !defined(VMS)
+ {"-" XSUBLIM_ARG_PROGRAM, "." XSUBLIM_ARG_PROGRAM,
+ XrmoptionSepArg,0 },
+#endif
{"-" XSUBLIM_ARG_SCREENSAVER, "." XSUBLIM_ARG_SCREENSAVER,
XrmoptionNoArg,"true"},
{"-no-" XSUBLIM_ARG_SCREENSAVER,"." XSUBLIM_ARG_SCREENSAVER,
SIGQUIT,
SIGILL,
SIGTRAP,
+#if defined(SIGIOT)
SIGIOT,
+#endif
SIGABRT,
#if defined(SIGEMT)
SIGEMT,
"-*-times-*-r-*-*-*-600-*-*-p-*-*-*",
"-*-*-*-r-*-sans-*-600-*-*-p-*-*-*",
"-*-*-*-r-*-*-*-600-*-*-m-*-*-*",
-
"-*-helvetica-*-r-*-*-*-240-*-*-p-*-*-*",
"-*-lucida-*-r-*-*-*-240-*-*-p-*-*-*",
"-*-times-*-r-*-*-*-240-*-*-p-*-*-*",
int arg_DelayPhraseMin;
int arg_DelayPhraseMax;
char* arg_Text;
+ char* arg_Source;
/* Set-up ---------------------------------------------------------- */
signal(sig_Number,xsublim_Sig_Catch);
}
- /* Randomize */
- srandom((int)time((time_t*)0));
+ /* Randomize -- only need to do this here because this program
+ doesn't use the `screenhack.h' or `lockmore.h' APIs. */
+# undef ya_rand_init
+ ya_rand_init (0);
/* Handle all the X nonsense */
#if defined(__sgi)
text_Item = 0;
text_Count = 0;
memset(text_Used,0,sizeof(text_Used));
- arg_Text = get_string_resource(XSUBLIM_ARG_PHRASES,"Phrases");
+ arg_Source = get_string_resource(XSUBLIM_ARG_FILE,"Filename");
+ if (arg_Source != NULL)
+ {
+ FILE* file_Fs;
+ struct stat file_Stat;
+
+ file_Fs = fopen(arg_Source,"rb");
+ if (file_Fs == NULL)
+ {
+ fprintf(stderr,"%s: Could not open '%s'\n",progname,
+ arg_Source);
+ exit(-1);
+ }
+ if (fstat(fileno(file_Fs),&file_Stat) != 0)
+ {
+ fprintf(stderr,"%s: Could not stat '%s'\n",progname,
+ arg_Source);
+ exit(-1);
+ }
+ arg_Text = calloc(1,file_Stat.st_size+1);
+ if (arg_Text != NULL)
+ {
+ if (fread(arg_Text,file_Stat.st_size,1,file_Fs) != 1)
+ {
+ fprintf(stderr,"%s: Could not read '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ }
+ fclose(file_Fs);
+ }
+ else
+ {
+ arg_Source = get_string_resource(XSUBLIM_ARG_PROGRAM,
+ "Executable");
+ if (arg_Source != NULL)
+ {
+ char* exe_Command = calloc(1,strlen(arg_Source)+10);
+ FILE* exe_Fs;
+
+ if (exe_Command == NULL)
+ {
+ fprintf(stderr,
+ "%s: Could not allocate space for '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ sprintf(exe_Command,"( %s ) 2>&1",arg_Source);
+
+ exe_Fs = popen(exe_Command,"r");
+ if (exe_Fs == NULL)
+ {
+ fprintf(stderr,"%s: Could not run '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ arg_Text = calloc(1,XSUBLIM_PROGRAM_SIZE);
+ if (arg_Text != NULL)
+ {
+ if (fread(arg_Text,1,XSUBLIM_PROGRAM_SIZE,
+ exe_Fs) <= 0)
+ {
+ fprintf(stderr,
+ "%s: Could not read output of '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ if (
+ strstr(arg_Text,": not found") ||
+ strstr(arg_Text,": Not found") ||
+ strstr(arg_Text,": command not found") ||
+ strstr(arg_Text,": Command not found"))
+ {
+ fprintf(stderr,
+ "%s: Could not find '%s'\n",
+ progname,arg_Source);
+ exit(-1);
+ }
+ }
+ fclose(exe_Fs);
+ }
+ else
+ {
+ arg_Text =
+ get_string_resource(XSUBLIM_ARG_PHRASES,"Phrases");
+ if (arg_Text != NULL)
+ {
+ arg_Text = strdup(arg_Text);
+ }
+ }
+ }
if (arg_Text != NULL)
{
- arg_Text = strdup(arg_Text);
while (((text_Phrase = strtok(arg_Text,"\n")) != NULL) &&
(text_Count < XSUBLIM_TEXT_COUNT))
{
text_List[text_Count] = text_Phrase;
text_Count++;
}
+ text_List[text_Count] = NULL;
}
- text_List[text_Count] = NULL;
if (text_Count == 0)
{
fprintf(stderr,"%s: No text to display\n",progname);
image_Y,image_Width,image_Height);
}
- /* Free the image (and it's goddamned structure
- -- the man page for XCreateImage() lies,
- lies, lies!) */
+ /* Free the image */
XDestroyImage(image_Image);
- XFree(image_Image);
}
/* Restore the error handler, ungrab the server */
- XSync(disp_Display, FALSE);
+ XSync(disp_Display,FALSE);
XSetErrorHandler(Xsublim_Sh_Handler);
XUngrabServer(disp_Display);
- XSync(disp_Display, FALSE);
+ XSync(disp_Display,FALSE);
/* Pause between words */
if (Xsublim_Sig_Last == -1)