http://www.tienza.es/crux/src/www.jwz.org/xscreensaver/xscreensaver-5.05.tar.gz
[xscreensaver] / driver / stderr.c
index d4361df8d5e3a4f72732e3f0282ad5b141faa3f4..6246dd3a8e554fd8caa0e8486599283a571473a0 100644 (file)
@@ -1,5 +1,5 @@
 /* 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
@@ -113,12 +113,13 @@ print_stderr_1 (saver_screen_info *ssi, char *string)
 
   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)
@@ -128,7 +129,7 @@ print_stderr_1 (saver_screen_info *ssi, char *string)
       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)
@@ -137,8 +138,8 @@ print_stderr_1 (saver_screen_info *ssi, char *string)
            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;
@@ -377,7 +378,7 @@ initialize_stderr (saver_info *si)
   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;
@@ -478,6 +479,9 @@ initialize_stderr (saver_info *si)
 void
 shutdown_stderr (saver_info *si)
 {
+  fflush (stdout);
+  fflush (stderr);
+
   if (!real_stderr || stderr_stdout_read_fd < 0)
     return;
 
@@ -489,7 +493,16 @@ shutdown_stderr (saver_info *si)
     {
       *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;
 }