projects
/
xscreensaver
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ftp://ftp.linux.ncsu.edu/mirror/ftp.redhat.com/pub/redhat/linux/enterprise/4/en/os...
[xscreensaver]
/
driver
/
subprocs.c
diff --git
a/driver/subprocs.c
b/driver/subprocs.c
index 527f379d4b5278ff1b3df095a7d2539e6a93bcd8..f7d8cc8f09aefdb6f72eb0ff579e62cecd2b2ba7 100644
(file)
--- a/
driver/subprocs.c
+++ b/
driver/subprocs.c
@@
-294,17
+294,28
@@
static void describe_dead_child (saver_info *, pid_t, int wait_status);
static int block_sigchld_handler = 0;
static int block_sigchld_handler = 0;
-void
+#ifdef HAVE_SIGACTION
+ sigset_t
+#else /* !HAVE_SIGACTION */
+ int
+#endif /* !HAVE_SIGACTION */
block_sigchld (void)
{
#ifdef HAVE_SIGACTION
sigset_t child_set;
sigemptyset (&child_set);
sigaddset (&child_set, SIGCHLD);
block_sigchld (void)
{
#ifdef HAVE_SIGACTION
sigset_t child_set;
sigemptyset (&child_set);
sigaddset (&child_set, SIGCHLD);
+ sigaddset (&child_set, SIGPIPE);
sigprocmask (SIG_BLOCK, &child_set, 0);
#endif /* HAVE_SIGACTION */
block_sigchld_handler++;
sigprocmask (SIG_BLOCK, &child_set, 0);
#endif /* HAVE_SIGACTION */
block_sigchld_handler++;
+
+#ifdef HAVE_SIGACTION
+ return child_set;
+#else /* !HAVE_SIGACTION */
+ return 0;
+#endif /* !HAVE_SIGACTION */
}
void
}
void
@@
-314,6
+325,7
@@
unblock_sigchld (void)
sigset_t child_set;
sigemptyset(&child_set);
sigaddset(&child_set, SIGCHLD);
sigset_t child_set;
sigemptyset(&child_set);
sigaddset(&child_set, SIGCHLD);
+ sigaddset(&child_set, SIGPIPE);
sigprocmask(SIG_UNBLOCK, &child_set, 0);
#endif /* HAVE_SIGACTION */
sigprocmask(SIG_UNBLOCK, &child_set, 0);
#endif /* HAVE_SIGACTION */
@@
-922,10
+934,15
@@
hack_subproc_environment (saver_screen_info *ssi)
be the screen on which this particular hack is running -- not the display
specification which the driver itself is using, since the driver ignores
its screen number and manages all existing screens.
be the screen on which this particular hack is running -- not the display
specification which the driver itself is using, since the driver ignores
its screen number and manages all existing screens.
+
+ Likewise, store a window ID in $XSCREENSAVER_WINDOW -- this will allow
+ us to (eventually) run multiple hacks in Xinerama mode, where each hack
+ has the same $DISPLAY but a different piece of glass.
*/
saver_info *si = ssi->global;
const char *odpy = DisplayString (si->dpy);
*/
saver_info *si = ssi->global;
const char *odpy = DisplayString (si->dpy);
- char *ndpy = (char *) malloc(strlen(odpy) + 20);
+ char *ndpy = (char *) malloc (strlen(odpy) + 20);
+ char *nssw = (char *) malloc (40);
char *s;
strcpy (ndpy, "DISPLAY=");
char *s;
strcpy (ndpy, "DISPLAY=");
@@
-937,14
+954,23
@@
hack_subproc_environment (saver_screen_info *ssi)
while (isdigit(*s)) s++; /* skip over dpy number */
while (*s == '.') s++; /* skip over dot */
if (s[-1] != '.') *s++ = '.'; /* put on a dot */
while (isdigit(*s)) s++; /* skip over dpy number */
while (*s == '.') s++; /* skip over dot */
if (s[-1] != '.') *s++ = '.'; /* put on a dot */
- sprintf(s, "%d", ssi->number); /* put on screen number */
+ sprintf(s, "%d", ssi->real_screen_number); /* put on screen number */
+
+ sprintf (nssw, "XSCREENSAVER_WINDOW=0x%lX",
+ (unsigned long) ssi->screensaver_window);
/* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
any more, right? It's not Posix, but everyone seems to have it. */
#ifdef HAVE_PUTENV
if (putenv (ndpy))
abort ();
/* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
any more, right? It's not Posix, but everyone seems to have it. */
#ifdef HAVE_PUTENV
if (putenv (ndpy))
abort ();
- /* do not free(ndpy) -- see above. */
+ if (putenv (nssw))
+ abort ();
+
+ /* don't free ndpy/nssw -- some implementations of putenv (BSD 4.4,
+ glibc 2.0) copy the argument, but some (libc4,5, glibc 2.1.2)
+ do not. So we must leak it (and/or the previous setting). Yay.
+ */
#endif /* HAVE_PUTENV */
}
#endif /* HAVE_PUTENV */
}