http://www.uw-madison.lkams.kernel.org/pub/mirrors/fink/distfiles/xscreensaver-4...
[xscreensaver] / hacks / xlockmore.h
1 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
2  * xscreensaver, Copyright (c) 1997-2003 Jamie Zawinski <jwz@jwz.org>
3  *
4  * Permission to use, copy, modify, distribute, and sell this software and its
5  * documentation for any purpose is hereby granted without fee, provided that
6  * the above copyright notice appear in all copies and that both that
7  * copyright notice and this permission notice appear in supporting
8  * documentation.  No representations are made about the suitability of this
9  * software for any purpose.  It is provided "as is" without express or 
10  * implied warranty.
11  *
12  * The definitions in this file make it possible to compile an xlockmore
13  * module into a standalone program, and thus use it with xscreensaver.
14  * By Jamie Zawinski <jwz@jwz.org> on 10-May-97; based on the ideas
15  * in the older xlock.h by Charles Hannum <mycroft@ai.mit.edu>.  (I had
16  * to redo it, since xlockmore has diverged so far from xlock...)
17  */
18
19 #if !defined(PROGCLASS) || !defined(HACK_INIT) || !defined(HACK_DRAW)
20 ERROR!  Define PROGCLASS, HACK_INIT, and HACK_DRAW before including xlockmore.h
21 #endif
22
23 #include "config.h"
24
25 #ifndef __STDC__
26 ERROR!  Sorry, xlockmore.h requires ANSI C (gcc, for example.)
27   /* (The ansi dependency is that we use string concatenation,
28      and cpp-based stringification of tokens.) */
29 #endif
30
31 #include <stdio.h>
32 #include <math.h>
33 #include "xlockmoreI.h"
34
35 #ifdef USE_GL
36 # include <GL/glx.h>
37   extern GLXContext *init_GL (ModeInfo *);
38   extern void clear_gl_error (void);
39   extern void check_gl_error (const char *type);
40
41   extern void do_fps (ModeInfo *);
42   extern GLfloat fps_1 (ModeInfo *);
43   extern void    fps_2 (ModeInfo *);
44
45 # define FreeAllGL(dpy) /* */
46 #endif /* !USE_GL */
47
48 /* Accessor macros for the ModeInfo structure
49  */
50
51 #define MI_DISPLAY(MI)          ((MI)->dpy)
52 #define MI_WINDOW(MI)           ((MI)->window)
53 #define MI_NUM_SCREENS(MI)      (1)     /* Only manage one screen at a time; */
54 #define MI_SCREEN(MI)           (0)     /*  this might be fragile... */
55 #define MI_WIN_WHITE_PIXEL(MI)  ((MI)->white)
56 #define MI_WIN_BLACK_PIXEL(MI)  ((MI)->black)
57 #define MI_NPIXELS(MI)          ((MI)->npixels)
58 #define MI_PIXEL(MI,N)          ((MI)->pixels[(N)])
59 #define MI_WIN_WIDTH(MI)        ((MI)->xgwa.width)
60 #define MI_WIN_HEIGHT(MI)       ((MI)->xgwa.height)
61 #define MI_WIN_DEPTH(MI)        ((MI)->xgwa.depth)
62 #define MI_WIN_COLORMAP(MI)     ((MI)->xgwa.colormap)
63 #define MI_VISUAL(MI)           ((MI)->xgwa.visual)
64 #define MI_GC(MI)               ((MI)->gc)
65 #define MI_PAUSE(MI)            ((MI)->pause)
66 #define MI_WIN_IS_FULLRANDOM(MI)((MI)->fullrandom)
67 #define MI_WIN_IS_VERBOSE(MI)   (False)
68 #define MI_WIN_IS_INSTALL(MI)   (True)
69 #define MI_WIN_IS_MONO(MI)      (mono_p)
70 #define MI_WIN_IS_INROOT(MI)    ((MI)->root_p)
71 #define MI_WIN_IS_INWINDOW(MI)  (!(MI)->root_p)
72 #define MI_WIN_IS_ICONIC(MI)    (False)
73 #define MI_WIN_IS_WIREFRAME(MI) ((MI)->wireframe_p)
74 #define MI_WIN_IS_USE3D(MI)     ((MI)->threed)
75 #define MI_LEFT_COLOR(MI)       ((MI)->threed_left_color)
76 #define MI_RIGHT_COLOR(MI)      ((MI)->threed_right_color)
77 #define MI_BOTH_COLOR(MI)       ((MI)->threed_both_color)
78 #define MI_NONE_COLOR(MI)       ((MI)->threed_none_color)
79 #define MI_DELTA3D(MI)          ((MI)->threed_delta)
80 #define MI_CYCLES(MI)           ((MI)->cycles)
81 #define MI_BATCHCOUNT(MI)       ((MI)->batchcount)
82 #define MI_SIZE(MI)             ((MI)->size)
83 #define MI_IS_DRAWN(MI)         ((MI)->is_drawn)
84 #define MI_IS_FPS(MI)           ((MI)->fps_p)
85 #define MI_NCOLORS(MI)          ((MI)->npixels)
86 #define MI_NAME(MI)             (progname)
87
88 #define MI_COLORMAP(MI)         (MI_WIN_COLORMAP((MI)))
89 #define MI_WIDTH(MI)            (MI_WIN_WIDTH((MI)))
90 #define MI_HEIGHT(MI)           (MI_WIN_HEIGHT((MI)))
91 #define MI_IS_ICONIC(MI)        (MI_WIN_IS_ICONIC((MI)))
92 #define MI_IS_WIREFRAME(MI)     (MI_WIN_IS_WIREFRAME((MI)))
93 #define MI_IS_MONO(MI)          (MI_WIN_IS_MONO((MI)))
94 #define MI_COUNT(MI)            (MI_BATCHCOUNT((MI)))
95 #define MI_BLACK_PIXEL(MI)      (MI_WIN_BLACK_PIXEL(MI))
96 #define MI_WHITE_PIXEL(MI)      (MI_WIN_WHITE_PIXEL(MI))
97 #define MI_IS_FULLRANDOM(MI)    (MI_WIN_IS_FULLRANDOM(MI))
98 #define MI_IS_VERBOSE(MI)       (MI_WIN_IS_VERBOSE(MI))
99 #define MI_IS_INSTALL(MI)       (MI_WIN_IS_INSTALL(MI))
100 #define MI_IS_DEBUG(MI)         (False)
101 #define MI_IS_MOUSE(MI)         (False)
102
103 #define MI_CLEARWINDOW(mi) XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi))
104
105 /* Some other utility macros.
106  */
107 #define SINF(n)                 ((float)sin((double)(n)))
108 #define COSF(n)                 ((float)cos((double)(n)))
109 #define FABSF(n)                ((float)fabs((double)(n)))
110
111 #undef MAX
112 #undef MIN
113 #undef ABS
114 #define MAX(a,b)((a)>(b)?(a):(b))
115 #define MIN(a,b)((a)<(b)?(a):(b))
116 #define ABS(a)((a)<0 ? -(a) : (a))
117
118 /* Maximum possible number of colors (*not* default number of colors.) */
119 #define NUMCOLORS 256
120
121 /* The globals that screenhack.c expects (initialized by xlockmore.c).
122  */
123 char *defaults[100];
124 XrmOptionDescRec options[100];
125
126 /* Prototypes for the actual drawing routines...
127  */
128 extern void HACK_INIT(ModeInfo *);
129 extern void HACK_DRAW(ModeInfo *);
130
131 #ifdef HACK_FREE
132   extern void HACK_FREE(ModeInfo *);
133 #else
134 # define HACK_FREE 0
135 #endif
136
137 #ifdef HACK_RESHAPE
138   extern void HACK_RESHAPE(ModeInfo *, int width, int height);
139 #else
140 # define HACK_RESHAPE 0
141 #endif
142
143 #ifdef HACK_HANDLE_EVENT
144   extern Bool HACK_HANDLE_EVENT(ModeInfo *, XEvent *e);
145 #else
146 # define HACK_HANDLE_EVENT 0
147 #endif
148
149
150 /* Emit code for the entrypoint used by screenhack.c, and pass control
151    down into xlockmore.c with the appropriate parameters.
152  */
153
154 char *progclass = PROGCLASS;
155
156 void screenhack (Display *dpy, Window window)
157 {
158   xlockmore_screenhack (dpy, window,
159
160 #ifdef WRITABLE_COLORS
161                         True,
162 #else
163                         False,
164 #endif
165
166 #ifdef UNIFORM_COLORS
167                         True,
168 #else
169                         False,
170 #endif
171
172 #ifdef SMOOTH_COLORS
173                         True,
174 #else
175                         False,
176 #endif
177
178 #ifdef BRIGHT_COLORS
179                         True,
180 #else
181                         False,
182 #endif
183
184 #ifdef EVENT_MASK
185                         EVENT_MASK,
186 #else
187                         0,
188 #endif
189
190                         HACK_INIT,
191                         HACK_DRAW,
192                         HACK_RESHAPE,
193                         HACK_HANDLE_EVENT,
194                         HACK_FREE);
195 }
196
197
198 const char *app_defaults = DEFAULTS ;