From http://www.jwz.org/xscreensaver/xscreensaver-5.30.tar.gz
[xscreensaver] / hacks / xlockmoreI.h
1 /* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
2  * xscreensaver, Copyright (c) 1997-2012 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  * See xlockmore.h and xlockmore.c.
13  */
14
15 #ifndef __XLOCKMORE_INTERNAL_H__
16 #define __XLOCKMORE_INTERNAL_H__
17
18 #include <time.h>
19
20 #include "screenhackI.h"
21
22 #ifdef HAVE_XSHM_EXTENSION
23 # include "xshm.h"
24 #endif /* HAVE_XSHM_EXTENSION */
25
26
27 typedef struct ModeInfo ModeInfo;
28
29 #ifdef USE_GL
30
31 /* I'm told that the Sun version of OpenGL needs to have the constant
32    SUN_OGL_NO_VERTEX_MACROS defined in order for morph3d to compile
33    (the number of arguments to the glNormal3f macro changes...)
34    Verified with gcc 2.7.2.2 and Sun cc 4.2 with OpenGL 1.1.1 dev 4
35    on Solaris 2.5.1.
36  */
37 # ifndef HAVE_MESA_GL
38 #  if defined(__sun) && defined(__SVR4) /* Solaris */
39 #   define SUN_OGL_NO_VERTEX_MACROS 1
40 #  endif /* Solaris */
41 # endif /* !HAVE_MESA_GL */
42
43 # ifdef HAVE_COCOA
44 #  ifndef USE_IPHONE
45 #   include <OpenGL/gl.h>
46 #   include <OpenGL/glu.h>
47 #  endif
48 # else
49 #  include <GL/gl.h>
50 #  include <GL/glu.h>
51 #  include <GL/glx.h>
52 # endif
53
54 # ifdef HAVE_JWZGLES
55 #  include "jwzgles.h"
56 # endif /* HAVE_JWZGLES */
57
58
59   extern GLXContext *init_GL (ModeInfo *);
60   extern void xlockmore_reset_gl_state(void);
61   extern void clear_gl_error (void);
62   extern void check_gl_error (const char *type);
63
64   extern Visual *xlockmore_pick_gl_visual (Screen *);
65   extern Bool xlockmore_validate_gl_visual (Screen *, const char *, Visual *);
66
67 #endif /* !USE_GL */
68
69 /* These are only used in GL mode, but I don't understand why XCode
70    isn't seeing the prototypes for them in glx/fps-gl.c... */
71 extern void do_fps (ModeInfo *);
72 extern void xlockmore_gl_compute_fps (Display *, Window, fps_state *, void *);
73 extern void xlockmore_gl_draw_fps (ModeInfo *);
74 # define do_fps xlockmore_gl_draw_fps
75
76
77 extern void xlockmore_setup (struct xscreensaver_function_table *, void *);
78 extern void xlockmore_do_fps (Display *, Window, fps_state *, void *);
79
80
81 /* Compatibility with the xlockmore RNG API
82    (note that the xlockmore hacks never expect negative numbers.)
83  */
84 #define LRAND()                 ((long) (random() & 0x7fffffff))
85 #define NRAND(n)                ((int) (LRAND() % (n)))
86 #define MAXRAND                 (2147483648.0) /* unsigned 1<<31 as a float */
87 #define SRAND(n)                /* already seeded by screenhack.c */
88
89
90 struct ModeInfo {
91   struct xlockmore_function_table *xlmft;
92   Display *dpy;
93   Window window;
94   Bool root_p;
95   int num_screens;
96   int screen_number;
97   int npixels;
98   unsigned long *pixels;
99   XColor *colors;
100   Bool writable_p;
101   unsigned long white;
102   unsigned long black;
103   XWindowAttributes xgwa;
104   GC gc;
105   long pause;
106   Bool fullrandom;
107   long cycles;
108   long batchcount;
109   long size;
110   Bool threed;
111   long threed_left_color;
112   long threed_right_color;
113   long threed_both_color;
114   long threed_none_color;
115   long threed_delta;
116   Bool wireframe_p;
117   Bool is_drawn;
118
119   /* Used only by OpenGL programs, since FPS is tricky there. */
120   fps_state *fpst;
121   Bool fps_p;
122   unsigned long polygon_count;  /* These values are for -fps display only */
123   double recursion_depth;
124
125 #ifdef HAVE_XSHM_EXTENSION
126   Bool use_shm;
127   XShmSegmentInfo shm_info;
128 #endif
129 };
130
131 typedef enum {  t_String, t_Float, t_Int, t_Bool } xlockmore_type;
132
133 typedef struct {
134   void *var;
135   char *name;
136   char *classname;
137   char *def;
138   xlockmore_type type;
139 } argtype;
140
141 typedef struct {
142   char *opt;
143   char *desc;
144 } OptionStruct;
145
146 typedef struct {
147   int numopts;
148   XrmOptionDescRec *opts;
149   int numvarsdesc;
150   argtype *vars;
151   OptionStruct *desc;
152 } ModeSpecOpt;
153
154 struct xlockmore_function_table {
155   const char *progclass;
156   const char *defaults;
157   Bool want_writable_colors;
158   enum { color_scheme_default, color_scheme_uniform, 
159          color_scheme_smooth, color_scheme_bright }
160     desired_color_scheme;
161   void (*hack_init) (ModeInfo *);
162   void (*hack_draw) (ModeInfo *);
163   void (*hack_reshape) (ModeInfo *, int, int);
164   void (*hack_refresh) (ModeInfo *);
165   void (*hack_free) (ModeInfo *);
166   Bool (*hack_handle_events) (ModeInfo *, XEvent *);
167   ModeSpecOpt *opts;
168
169   unsigned screen_count; /* Only used on the OS X and iOS ports. */
170 };
171
172 #endif /* __XLOCKMORE_INTERNAL_H__ */