/* stderr.c --- capturing stdout/stderr output onto the screensaver window.
- * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-1998, 2001 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
static char *stderr_tail = 0;
static time_t stderr_last_read = 0;
+static int stderr_stdout_read_fd = -1;
+
static void make_stderr_overlay_window (saver_screen_info *);
+/* Recreates the stderr window or GCs: do this when the xscreensaver window
+ on a screen has been re-created.
+ */
void
reset_stderr (saver_screen_info *ssi)
{
ssi->stderr_cmap = 0;
}
+/* Erases any stderr text overlaying the screen (if possible) and resets
+ the stderr output cursor to the upper left. Do this when the xscreensaver
+ window is cleared.
+ */
void
clear_stderr (saver_screen_info *ssi)
{
}
+/* Draws the string on the screen's window.
+ */
static void
print_stderr_1 (saver_screen_info *ssi, char *string)
{
}
+/* Draws the string on each screen's window as error text.
+ */
static void
print_stderr (saver_info *si, char *string)
{
}
+/* Polls the stderr buffer every few seconds and if it finds any text,
+ writes it on all screens.
+ */
static void
stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id)
{
}
+/* Called when data becomes available on the stderr pipe. Copies it into
+ stderr_buffer where stderr_popup_timer_fn() can find it later.
+ */
static void
stderr_callback (XtPointer closure, int *fd, XtIntervalId *id)
{
int size;
int read_this_time = 0;
+ if (!fd || *fd < 0 || *fd != stderr_stdout_read_fd)
+ abort();
+
if (stderr_tail == 0)
stderr_tail = stderr_buffer;
}
}
+/* If stderr capturing is desired, this replaces `stdout' and `stderr'
+ with a pipe, so that any output written to them will show up on the
+ screen as well as on the original value of those streams.
+ */
void
initialize_stderr (saver_info *si)
{
}
}
+ stderr_stdout_read_fd = in;
XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback,
(XtPointer) si);
}
+
+
+/* If there is anything in the stderr buffer, flush it to the real stderr.
+ This does no X operations. Call this when exiting to make sure any
+ last words actually show up.
+ */
+void
+shutdown_stderr (saver_info *si)
+{
+ fflush (stdout);
+ fflush (stderr);
+
+ if (!real_stderr || stderr_stdout_read_fd < 0)
+ return;
+
+ stderr_callback ((XtPointer) si, &stderr_stdout_read_fd, 0);
+
+ if (stderr_buffer &&
+ stderr_tail &&
+ stderr_buffer < stderr_tail)
+ {
+ *stderr_tail = 0;
+ fprintf (real_stderr, "%s", stderr_buffer);
+ stderr_tail = stderr_buffer;
+ }
+
+ if (real_stdout) fflush (real_stdout);
+ if (real_stderr) fflush (real_stderr);
+
+ if (stdout != real_stdout)
+ dup2 (fileno(real_stdout), fileno(stdout));
+ if (stderr != real_stderr)
+ dup2 (fileno(real_stderr), fileno(stderr));
+
+ stderr_stdout_read_fd = -1;
+}