/* stderr.c --- capturing stdout/stderr output onto the screensaver window.
- * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 1991-2006 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
if (! ssi->stderr_font)
{
- char *font_name = get_string_resource ("font", "Font");
- if (!font_name) font_name = "fixed";
+ char *font_name = get_string_resource (dpy, "font", "Font");
+ if (!font_name) font_name = strdup ("fixed");
ssi->stderr_font = XLoadQueryFont (dpy, font_name);
if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed");
ssi->stderr_line_height = (ssi->stderr_font->ascent +
ssi->stderr_font->descent);
+ free (font_name);
}
if (! ssi->stderr_gc)
Colormap cmap = ssi->cmap;
if (!ssi->stderr_overlay_window &&
- get_boolean_resource("overlayStderr", "Boolean"))
+ get_boolean_resource(dpy, "overlayStderr", "Boolean"))
{
make_stderr_overlay_window (ssi);
if (ssi->stderr_overlay_window)
cmap = ssi->stderr_cmap;
}
- fg = get_pixel_resource ("overlayTextForeground","Foreground",dpy,cmap);
- bg = get_pixel_resource ("overlayTextBackground","Background",dpy,cmap);
+ fg = get_pixel_resource (dpy,cmap,"overlayTextForeground","Foreground");
+ bg = get_pixel_resource (dpy,cmap,"overlayTextBackground","Background");
gcv.font = ssi->stderr_font->fid;
gcv.foreground = fg;
gcv.background = bg;
real_stderr = stderr;
real_stdout = stdout;
- stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean");
+ stderr_dialog_p = get_boolean_resource (si->dpy, "captureStderr", "Boolean");
if (!stderr_dialog_p)
return;
void
shutdown_stderr (saver_info *si)
{
+ fflush (stdout);
+ fflush (stderr);
+
if (!real_stderr || stderr_stdout_read_fd < 0)
return;
{
*stderr_tail = 0;
fprintf (real_stderr, "%s", stderr_buffer);
- fflush (real_stderr);
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;
}