From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / hacks / bubbles.h
1 /* bubbles.h - definitions for bubbles screensaver */
2
3 /* $Id: bubbles.h,v 1.6 2006/02/25 20:11:57 jwz Exp $ */
4
5 #ifndef _BUBBLES_H_
6 #define _BUBBLES_H_
7
8 #ifdef HAVE_JWXYZ
9 # include "jwxyz.h"
10 # define HAVE_XPM
11 #else
12 # include <X11/Xlib.h>
13 #endif
14
15 /***************************************************************************
16  *   Options you might like to change to affect the program's behaviour    *
17  ***************************************************************************/
18
19 /*
20  *   Uncommenting the following will enable support for reading bubbles from 
21  * files (using the -file and -directory options to bubbles).  This is
22  * disabled by default since such operations are inherently non-portable
23  * and we want the program to compile on as many systems as possible.  
24  *
25  *   If you uncomment this and you figure out how to get it working, please
26  * let me (J.Macnicol@student.anu.edu.au) know.  Diffs against the standard
27  * distribution would be appreciated.  Possible sources of problems are
28  * dirent and possibly the use of tmpnam().
29  */
30
31 /* #define BUBBLES_IO */
32
33 /*
34  *   The following only makes sense if BUBBLES_IO above is defined.
35  * 
36  *   Uncomment the following if you always want to use the -file or
37  * -directory options on the command line and never to use a default bubble
38  * compiled into the program.  This way you would save memory and disk space
39  * since if you do use -file or -directory only one bubble will be loaded
40  * into memory at any one time (and remember the default bubble is really
41  * uncompressed, unlike bubbles in files which can be compressed).  This
42  * is disabled by default only so people running the program for the first
43  * time with no knowldege of the command line options don't get error
44  * messages ;)
45  *
46  * NOTE: You will still need to have a bubbles_default.c file, else the
47  * build sequence will fail.  Well constructed bubbles_default.c files
48  * have #ifdef's which simply exclude everything else in the file at
49  * compile time.  The bubblestodefault script does this.
50  */
51
52 /* #define NO_DEFAULT_BUBBLE */
53
54 /*
55  * This turns on any debugging messages and sanity checks.  Hopefully you
56  * won't need this :)  It slows things down a bit, too.
57  *
58  * NOTE: If you uncomment this you will get some messages about unused
59  * functions when you compile.  You can ignore these - they refer to 
60  * convenient checking routines which simply aren't called but are left
61  * in case someone wants to use them.
62  */
63
64 /* #define DEBUG */
65
66 /***************************************************************************
67  *      Things you might need to change to get things working right        *
68  ***************************************************************************/
69
70 /*
71  *  Name of the gzip binary.  You shouldn't need to change this unless it's
72  * not in your PATH when the program is run, in which case you will need to
73  * substitute the full path here.  Keep the double quotes else things won't
74  * compile!
75  */
76
77 #define GZIP               "gzip"
78
79 /*
80  *  Likewise for the Bourne shell.
81  */
82
83 #define BOURNESH           "sh"
84
85 /*
86  * The name of the directory entry structure is different under Linux
87  * (under which this code is being developed) than other systems.  The case
88  * alternate form here is that given in Kernighan & Ritchie's C book (which
89  * must be authoratitive, no?) 
90  *
91  * 04/07/96 : People will have to hack this to get it working on some
92  * systems.  I believe it doesn't work on SGI, for example.
93  */
94
95 #ifdef _POSIX_SOURCE
96 #define STRUCT_DIRENT      struct dirent
97 #else
98 #define STRUCT_DIRENT      Dirent
99 #endif
100
101 /* 
102  * The naming of fields in struct dirent also seems to differ from system to
103  * system.  This may have to be extended to make things truly portable.
104  * What we want here is the name field from a dirent struct pointed to
105  * by "dp". 
106  *
107  * 04/07/96 : See above.  This may need to be changed too.
108  */
109
110 #ifdef _POSIX_SOURCE
111 #define DIRENT_NAME       dp->d_name
112 #else
113 #define DIRENT_NAME       dp->name
114 #endif
115
116 /* I don't know why this isn't defined. */
117 #ifdef linux
118 /* apparently it is defined in recent linuxes.  who knows. */
119 /*extern char *tempnam(char *, char *);*/
120 #endif
121
122 /****************************************************************************
123  *      Buffer lengths and things you probably won't need to touch          *
124  ****************************************************************************/
125
126 /* Maximum length of a full path name we can deal with */
127 #define PATH_BUF_SIZE      1024
128
129 /* Size of string passed to shell as command */
130 #define COMMAND_BUF_SIZE   2500
131
132 /* Size increments for read_line() buffers */
133 #define READ_LINE_BUF_SIZE 24
134
135 /* Maximum amount to drop a bubble */
136 #define MAX_DROPPAGE 20
137
138 /****************************************************************************
139  *                        End of options                                    *
140  ****************************************************************************/
141
142 /* Some machines define M_PI and not PI.  If they don't define either, use
143 own own.  Really, the accuracy of this is _not_ very important. */
144 #ifndef PI
145 # define PI  M_PI
146 # ifndef M_PI
147 #  define M_PI 3.1415926535
148 # endif
149 #endif
150
151 /* for delete_bubble_in_mesh() */
152 #define DELETE_BUBBLE      0
153 #define KEEP_BUBBLE        1
154
155 /* Status codes for read_line */
156 #define LINE_READ          0
157 #define EOF_REACHED        1
158 #define IO_ERROR           2
159
160 /* 
161  * Magic number for Bubble struct, in case it's trashed when debugging code
162  * (which happened to me often.... :(  
163  */
164
165 #define BUBBLE_MAGIC       5674
166
167 /* Useful macros */
168 #define MAX(A, B) ((A) > (B) ? (A) : (B))
169 #define MIN(A, B) ((A) < (B) ? (A) : (B))
170
171 /* How we represent bubbles */
172 struct bub {
173   int radius;
174   int step;  /* for rendered bubbles */
175   long area;
176   int x;
177   int y;
178   int magic;
179   int cell_index;
180   int visible;
181   struct bub *next;
182   struct bub *prev;
183 };
184
185 typedef struct bub Bubble;
186
187 /*
188  * How we represent pixmaps of rendered bubbles.  Because the range of radii
189  * available may not be continuous, we call each a step (for the lack of a
190  * better name...)
191  */
192
193 #if defined(HAVE_GDK_PIXBUF) || defined(HAVE_XPM)
194 struct bub_step {
195   int radius;
196   long area;
197   int droppage;
198   Pixmap ball, shape_mask;
199   GC draw_gc, erase_gc;
200   struct bub_step *next;
201 };
202
203 typedef struct bub_step Bubble_Step;
204 #endif /* HAVE_XPM || HAVE_GDK_PIXBUF */
205
206 /* Make sure default bubble isn't compiled when we don't have XPM
207 Disable file I/O code too. */
208 #if !defined(HAVE_XPM) && !defined(HAVE_GDK_PIXBUF)
209 # define NO_DEFAULT_BUBBLE
210 # undef BUBBLES_IO
211 #endif /* !HAVE_XPM && !HAVE_GDK_PIXBUF */
212
213 /* Make sure default bubble is compiled in when we have XPM and no file I/O */
214 #if defined(HAVE_XPM) || defined(HAVE_GDK_PIXBUF)
215 # ifndef BUBBLES_IO
216 #  undef NO_DEFAULT_BUBBLE
217 # endif /* BUBBLES_IO */
218 #endif /* HAVE_XPM || HAVE_GDK_PIXBUF */
219
220 extern void init_default_bubbles(void);
221 extern int num_default_bubbles;
222 extern char **default_bubbles[];
223
224 #endif /* _BUBBLES_H_ */