http://www.ibiblio.org/pub/historic-linux/ftp-archives/sunsite.unc.edu/Sep-29-1996...
[xscreensaver] / hacks / screenhack.h
1 /* xscreensaver, Copyright (c) 1992-1995 Jamie Zawinski <jwz@netscape.com>
2  *
3  * Permission to use, copy, modify, distribute, and sell this software and its
4  * documentation for any purpose is hereby granted without fee, provided that
5  * the above copyright notice appear in all copies and that both that
6  * copyright notice and this permission notice appear in supporting
7  * documentation.  No representations are made about the suitability of this
8  * software for any purpose.  It is provided "as is" without express or 
9  * implied warranty.
10  */
11
12 /* Found in Don Hopkins' .plan file:
13  *
14  *   The color situation is a total flying circus.  The X approach to
15  *   device independence is to treat everything like a MicroVax framebuffer
16  *   on acid.  A truely portable X application is required to act like the
17  *   persistent customer in the Monty Python ``Cheese Shop'' sketch.  Even
18  *   the simplest applications must answer many difficult questions, like:
19  *
20  *   WHAT IS YOUR DISPLAY?
21  *       display = XOpenDisplay("unix:0");
22  *   WHAT IS YOUR ROOT?
23  *       root = RootWindow(display, DefaultScreen(display));
24  *   AND WHAT IS YOUR WINDOW?
25  *       win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1,
26  *                                 BlackPixel(display, DefaultScreen(display)),
27  *                                 WhitePixel(display, DefaultScreen(display)))
28  *   OH ALL RIGHT, YOU CAN GO ON.
29  *
30  *   WHAT IS YOUR DISPLAY?
31  *         display = XOpenDisplay("unix:0");
32  *   WHAT IS YOUR COLORMAP?
33  *         cmap = DefaultColormap(display, DefaultScreen(display));
34  *   AND WHAT IS YOUR FAVORITE COLOR?
35  *         favorite_color = 0; / * Black. * /
36  *         / * Whoops! No, I mean: * /
37  *         favorite_color = BlackPixel(display, DefaultScreen(display));
38  *         / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * /
39  *
40  *   WHAT IS YOUR DISPLAY?
41  *         display = XOpenDisplay("unix:0");
42  *   WHAT IS YOUR VISUAL?
43  *         struct XVisualInfo vinfo;
44  *         if (XMatchVisualInfo(display, DefaultScreen(display),
45  *                              8, PseudoColor, &vinfo) != 0)
46  *            visual = vinfo.visual;
47  *   AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST?
48  *         / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * /
49  *   WHAT?! HOW AM I SUPPOSED TO KNOW THAT?
50  *   AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm)
51  */
52
53 #ifndef _SCREENHACK_H_
54 #define _SCREENHACK_H_
55
56 #if __STDC__
57 #include <stdlib.h>
58 #endif
59
60 #ifdef __hpux
61  /* Which of the ten billion standards does values.h belong to?
62     What systems always have it? */
63 # include <values.h>
64 #endif
65
66 #include <X11/Xlib.h>
67 #include <X11/Xresource.h>
68 #include <X11/Xos.h>
69 #include "vroot.h"
70
71 extern Bool mono_p;
72 extern char *progname;
73 extern char *progclass;
74 extern XrmDatabase db;
75 extern XrmOptionDescRec options [];
76 extern int options_size;
77 extern char *defaults [];
78
79 /* Screw it, we'll just use our own RNG.  See xscreensaver/utils/yarandom.c. */
80 #include "yarandom.h"
81
82
83 #undef P
84 #if __STDC__
85 # define P(x)x
86 #else
87 # define P(x)()
88 #endif
89
90 extern void screenhack P((Display*,Window));
91
92 #define usleep screenhack_usleep
93
94 extern void screenhack_usleep P((unsigned long));
95 extern char *get_string_resource P((char*,char*));
96 extern Bool get_boolean_resource P((char*,char*));
97 extern int get_integer_resource P((char*,char*));
98 extern double get_float_resource P((char*,char*));
99 extern unsigned int get_pixel_resource P((char*,char*,Display*,Colormap));
100 extern unsigned int get_minutes_resource P((char*,char*));
101 extern unsigned int get_seconds_resource P((char*,char*));
102
103 extern Visual *get_visual_resource P((Display *, char *, char *));
104 extern int get_visual_depth P((Display *, Visual *));
105
106 extern void hsv_to_rgb P((int,double,double,unsigned short*,
107                           unsigned short*,unsigned short*));
108 extern void rgb_to_hsv P((unsigned short,unsigned short,unsigned short,
109                           int*,double*,double*));
110 extern void cycle_hue P((XColor*,int));
111
112 extern void make_color_ramp P((int h1, double s1, double v1,
113                                int h2, double s2, double v2,
114                                XColor *pixels, int npixels));
115
116 extern Pixmap grab_screen_image P((Display *dpy, Window window, int root_p));
117 extern void copy_default_colormap_contents P((Display *dpy, Colormap to_cmap,
118                                               Visual *to_visual));
119
120 #if defined (__GNUC__) && (__GNUC__ >= 2)
121  /* Implement frand using GCC's statement-expression extension. */
122
123 # define frand(f)                                                       \
124   ({ double tmp = (((double) random()) /                                \
125                    (((double) ((unsigned int)~0)) / ((double) (f+f)))); \
126      tmp < 0 ? (-tmp) : tmp; })
127
128 #else /* not GCC2 - implement frand using a global variable.*/
129
130 static double _frand_tmp_;
131 # define frand(f)                                                       \
132   (_frand_tmp_ = (((double) random()) /                                 \
133                   (((double) ((unsigned int)~0)) / ((double) (f+f)))),  \
134    _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_)
135
136 #endif /* not GCC2 */
137
138 #undef P
139 #endif /* _SCREENHACK_H_ */