-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 2001, 2002
- * Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2005 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
#include "version.h"
#include "vroot.h"
+#ifndef _XSCREENSAVER_VROOT_H_
+# error Error! You have an old version of vroot.h! Check -I args.
+#endif /* _XSCREENSAVER_VROOT_H_ */
+
#ifndef isupper
# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
#endif
void
screenhack_handle_event (Display *dpy, XEvent *event)
{
+ if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+ XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+
switch (event->xany.type)
{
case KeyPress:
}
+static void
+fix_fds (void)
+{
+ /* Bad Things Happen if stdin, stdout, and stderr have been closed
+ (as by the `sh incantation "attraction >&- 2>&-"). When you do
+ that, the X connection gets allocated to one of these fds, and
+ then some random library writes to stderr, and random bits get
+ stuffed down the X pipe, causing "Xlib: sequence lost" errors.
+ So, we cause the first three file descriptors to be open to
+ /dev/null if they aren't open to something else already. This
+ must be done before any other files are opened (or the closing
+ of that other file will again free up one of the "magic" first
+ three FDs.)
+
+ We do this by opening /dev/null three times, and then closing
+ those fds, *unless* any of them got allocated as #0, #1, or #2,
+ in which case we leave them open. Gag.
+
+ Really, this crap is technically required of *every* X program,
+ if you want it to be robust in the face of "2>&-".
+ */
+ int fd0 = open ("/dev/null", O_RDWR);
+ int fd1 = open ("/dev/null", O_RDWR);
+ int fd2 = open ("/dev/null", O_RDWR);
+ if (fd0 > 2) close (fd0);
+ if (fd1 > 2) close (fd1);
+ if (fd2 > 2) close (fd2);
+}
+
+
int
main (int argc, char **argv)
{
Boolean dont_clear /*, dont_map */;
char version[255];
+ fix_fds();
+
+ progname = argv[0]; /* reset later */
+
#ifdef XLOCKMORE
pre_merge_options ();
#endif
XGetWindowAttributes (dpy, window, &xgwa);
cmap = xgwa.colormap;
visual = xgwa.visual;
+ screen = xgwa.screen;
visual_warning (screen, window, visual, cmap, True);
- /* Select KeyPress events on the external window.
+ /* Select KeyPress and resize events on the external window.
*/
- xgwa.your_event_mask |= KeyPressMask;
+ xgwa.your_event_mask |= KeyPressMask | StructureNotifyMask;
XSelectInput (dpy, window, xgwa.your_event_mask);
/* Select ButtonPress and ButtonRelease events on the external window,
else if (root_p)
{
XWindowAttributes xgwa;
- window = RootWindowOfScreen (XtScreen (toplevel));
+ window = VirtualRootWindowOfScreen (XtScreen (toplevel));
XtDestroyWidget (toplevel);
XGetWindowAttributes (dpy, window, &xgwa);
cmap = xgwa.colormap;
unsigned int bg, bd;
Widget new;
- cmap = XCreateColormap (dpy, RootWindowOfScreen(screen),
+ cmap = XCreateColormap (dpy, VirtualRootWindowOfScreen(screen),
visual, AllocNone);
bg = get_pixel_resource ("background", "Background", dpy, cmap);
bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap);
XtNbackground, (Pixel) bg,
XtNborderColor, (Pixel) bd,
XtNinput, True, /* for WM_HINTS */
- 0);
+ NULL);
XtDestroyWidget (toplevel);
toplevel = new;
XtRealizeWidget (toplevel);
XtVaSetValues (toplevel,
XtNmappedWhenManaged, False,
XtNinput, True, /* for WM_HINTS */
- 0);
+ NULL);
XtRealizeWidget (toplevel);
window = XtWindow (toplevel);
/*
if (dont_map)
{
- XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
+ XtVaSetValues (toplevel, XtNmappedWhenManaged, False, NULL);
XtRealizeWidget (toplevel);
}
else
XtPopup (toplevel, XtGrabNone);
}
- XtVaSetValues(toplevel, XtNtitle, version, 0);
+ XtVaSetValues(toplevel, XtNtitle, version, NULL);
/* For screenhack_handle_events(): select KeyPress, and
announce that we accept WM_DELETE_WINDOW. */