diff options
Diffstat (limited to 'utils/xdbe.c')
-rw-r--r-- | utils/xdbe.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/utils/xdbe.c b/utils/xdbe.c new file mode 100644 index 0000000..d62183e --- /dev/null +++ b/utils/xdbe.c @@ -0,0 +1,75 @@ +/* xscreensaver, Copyright (c) 1998, 1999, 2006 + * by 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 + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ + +/* The XDBE (Double Buffering) extension is pretty tricky to use, since you + can get X errors at inconvenient times during initialization. This file + contains a utility routine to make it easier to deal with. + */ + +#include "utils.h" +#include "xdbe.h" +#include "resources.h" /* for get_string_resource() */ + +/* #define DEBUG */ + +#ifdef DEBUG +# include <X11/Xmu/Error.h> +#endif + +extern char *progname; + +#ifdef HAVE_DOUBLE_BUFFER_EXTENSION /* whole file */ + +static Bool xdbe_got_x_error = False; +static int +xdbe_ehandler (Display *dpy, XErrorEvent *error) +{ + xdbe_got_x_error = True; + +#ifdef DEBUG + fprintf (stderr, "\n%s: ignoring X error from DOUBLE-BUFFER:\n", progname); + XmuPrintDefaultErrorMessage (dpy, error, stderr); + fprintf (stderr, "\n"); +#endif + + return 0; +} + + +XdbeBackBuffer +xdbe_get_backbuffer (Display *dpy, Window window, + XdbeSwapAction action) +{ + XdbeBackBuffer b; + XErrorHandler old_handler; + int maj, min; + + if (!get_boolean_resource(dpy, "useDBE", "Boolean")) + return 0; + + if (!XdbeQueryExtension (dpy, &maj, &min)) + return 0; + + XSync (dpy, False); + xdbe_got_x_error = False; + old_handler = XSetErrorHandler (xdbe_ehandler); + b = XdbeAllocateBackBufferName(dpy, window, XdbeUndefined); + XSync (dpy, False); + XSetErrorHandler (old_handler); + + if (xdbe_got_x_error) + return 0; + + return b; +} + +#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ |