From http://www.jwz.org/xscreensaver/xscreensaver-5.34.tar.gz
[xscreensaver] / android / glue.c
1 #include <jni.h>
2 #include <math.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <time.h>
6 #include <pthread.h>
7 #include <GLES/gl.h>
8
9 #include "screenhackI.h"
10 #include "jwzglesI.h"
11 #include "version.h"
12
13 void drawXscreensaver();
14
15 int sWindowWidth = 0;
16 int sWindowHeight = 0;
17 int initTried = 0;
18 int renderTried = 0;
19 int resetTried = 0;
20 int currentFlip = 0;
21
22 pthread_mutex_t mutg = PTHREAD_MUTEX_INITIALIZER;
23
24 extern struct xscreensaver_function_table *xscreensaver_function_table;
25
26 // if adding a table here, increase the magic number
27 struct xscreensaver_function_table
28 *hypertorus_xscreensaver_function_table,
29     *hilbert_xscreensaver_function_table,
30     *endgame_xscreensaver_function_table,
31     *stonerview_xscreensaver_function_table,
32     *sproingies_xscreensaver_function_table,
33     *blinkbox_xscreensaver_function_table,
34     *bouncingcow_xscreensaver_function_table,
35     *superquadrics_xscreensaver_function_table;
36
37 struct running_hack {
38     struct xscreensaver_function_table *xsft;
39     Display *dpy;
40     Window window;
41     void *closure;
42 };
43
44 const char *progname;
45 const char *progclass;
46
47 struct running_hack rh[8];
48 // ^ magic number of hacks - TODO: remove magic number
49
50
51 int chosen;
52 // 0 superquadrics
53 // 1 stonerview
54 // 2 sproingies
55 // 3 hilbert
56
57 JNIEXPORT void JNICALL
58     Java_org_jwz_xscreensaver_CallNative_nativeInit
59     (JNIEnv * env);
60 JNIEXPORT void JNICALL
61     Java_org_jwz_xscreensaver_CallNative_nativeResize
62     (JNIEnv * env, jobject thiz, jint w, jint h);
63 JNIEXPORT void JNICALL
64     Java_org_jwz_xscreensaver_CallNative_nativeRender
65     (JNIEnv * env);
66 JNIEXPORT void JNICALL
67     Java_org_jwz_xscreensaver_CallNative_nativeDone
68     (JNIEnv * env);
69 JNIEXPORT void JNICALL
70     Java_org_jwz_xscreensaver_gen_SproingiesWallpaper_allnativeSettings
71     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
72      jint draw, jstring key);
73 JNIEXPORT void JNICALL
74     Java_org_jwz_xscreensaver_gen_SuperquadricsWallpaper_allnativeSettings
75     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
76      jint draw, jstring key);
77 JNIEXPORT void JNICALL
78     Java_org_jwz_xscreensaver_gen_HilbertWallpaper_allnativeSettings
79     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
80      jint draw, jstring key);
81 JNIEXPORT void JNICALL
82     Java_org_jwz_xscreensaver_gen_StonerviewWallpaper_allnativeSettings
83     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
84      jint draw, jstring key);
85 JNIEXPORT void JNICALL
86     Java_org_jwz_xscreensaver_gen_BouncingcowWallpaper_allnativeSettings
87     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
88      jint draw, jstring key);
89
90
91
92 void doinit()
93 {
94
95     if (chosen == 0) {
96         progname = "superquadrics";
97         rh[chosen].xsft = &superquadrics_xscreensaver_function_table;
98     } else if (chosen == 1) {
99         progname = "stonerview";
100         rh[chosen].xsft = &stonerview_xscreensaver_function_table;
101
102     } else if (chosen == 2) {
103         progname = "sproingies";
104         rh[chosen].xsft = &sproingies_xscreensaver_function_table;
105
106     } else if (chosen == 3) {
107         progname = "hilbert";
108         rh[chosen].xsft = &hilbert_xscreensaver_function_table;
109     } else if (chosen == 4) {
110         progname = "bouncingcow";
111         rh[chosen].xsft = &bouncingcow_xscreensaver_function_table;
112     } else {
113         progname = "sproingies";
114         rh[chosen].xsft = &sproingies_xscreensaver_function_table;
115     }
116
117     rh[chosen].dpy = jwxyz_make_display(0, 0);
118     rh[chosen].window = XRootWindow(rh[chosen].dpy, 0);
119 // TODO: Zero looks right, but double-check that is the right number
120
121     progclass = rh[chosen].xsft->progclass;
122
123     if (rh[chosen].xsft->setup_cb)
124         rh[chosen].xsft->setup_cb(rh[chosen].xsft,
125                                   rh[chosen].xsft->setup_arg);
126
127     if (resetTried < 1) {
128         resetTried++;
129         jwzgles_reset();
130     }
131
132     void *(*init_cb) (Display *, Window, void *) =
133         (void *(*)(Display *, Window, void *)) rh[chosen].xsft->init_cb;
134
135     rh[chosen].closure =
136         init_cb(rh[chosen].dpy, rh[chosen].window,
137                 rh[chosen].xsft->setup_arg);
138
139 }
140
141
142
143 void drawXscreensaver()
144 {
145     pthread_mutex_lock(&mutg);
146     rh[chosen].xsft->draw_cb(rh[chosen].dpy, rh[chosen].window,
147                              rh[chosen].closure);
148     pthread_mutex_unlock(&mutg);
149
150 }
151
152
153 JNIEXPORT void JNICALL
154     Java_org_jwz_xscreensaver_CallNative_nativeInit
155     (JNIEnv * env) {
156
157     if (initTried < 1) {
158         initTried++;
159     } else {
160         if (!rh[chosen].dpy) {
161             doinit();
162         } else {
163             rh[chosen].xsft->free_cb(rh[chosen].dpy, rh[chosen].window,
164                                      rh[chosen].closure);
165             jwxyz_free_display(rh[chosen].dpy);
166             rh[chosen].dpy = NULL;
167             rh[chosen].window = NULL;
168             if (!rh[chosen].dpy) {
169                 doinit();
170             }
171
172         }
173     }
174
175 }
176
177
178 JNIEXPORT void JNICALL
179     Java_org_jwz_xscreensaver_CallNative_nativeResize
180     (JNIEnv * env, jobject thiz, jint w, jint h) {
181
182     sWindowWidth = w;
183     sWindowHeight = h;
184
185     if (!rh[chosen].dpy) {
186         doinit();
187     }
188
189     jwxyz_window_resized(rh[chosen].dpy, rh[chosen].window, 0, 0, w, h, 0);
190
191     rh[chosen].xsft->reshape_cb(rh[chosen].dpy, rh[chosen].window,
192                                 rh[chosen].closure, w, h);
193 }
194
195 JNIEXPORT void JNICALL
196     Java_org_jwz_xscreensaver_CallNative_nativeRender
197     (JNIEnv * env) {
198     if (renderTried < 1) {
199         renderTried++;
200     } else {
201         drawXscreensaver();
202     }
203 }
204
205 // TODO: Check Java side is calling this properly
206 JNIEXPORT void JNICALL
207     Java_org_jwz_xscreensaver_CallNative_nativeDone
208     (JNIEnv * env) {
209
210     rh[chosen].xsft->free_cb(rh[chosen].dpy, rh[chosen].window,
211                              rh[chosen].closure);
212     jwxyz_free_display(rh[chosen].dpy);
213     rh[chosen].dpy = NULL;
214     rh[chosen].window = NULL;
215
216 }
217
218 JNIEXPORT void JNICALL
219     Java_org_jwz_xscreensaver_gen_HilbertWallpaper_allnativeSettings
220     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
221      jint draw, jstring key) {
222
223
224     const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
225     char *hck = (char *) chack;
226     const char *kchack = (*env)->GetStringUTFChars(env, key, NULL);
227     char *khck = (char *) kchack;
228
229     if (draw == 2) {
230         setHilbertSettings(hck, khck);
231     }
232
233     chosen = 3;
234 }
235
236 JNIEXPORT void JNICALL
237     Java_org_jwz_xscreensaver_gen_SuperquadricsWallpaper_allnativeSettings
238     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
239      jint draw, jstring key) {
240
241     const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
242     char *hck = (char *) chack;
243
244     const char *kchack = (*env)->GetStringUTFChars(env, key, NULL);
245     char *khck = (char *) kchack;
246
247     if (draw == 2) {
248         setSuperquadricsSettings(hck, khck);
249     }
250
251     chosen = 0;
252 }
253
254
255 JNIEXPORT void JNICALL
256     Java_org_jwz_xscreensaver_gen_SproingiesWallpaper_allnativeSettings
257     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
258      jint draw, jstring key) {
259
260     const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
261     char *hck = (char *) chack;
262
263     const char *kchack = (*env)->GetStringUTFChars(env, key, NULL);
264     char *khck = (char *) kchack;
265
266     if (draw == 2) {
267         setSproingiesSettings(hck, khck);
268     }
269
270     chosen = 2;
271 }
272
273 JNIEXPORT void JNICALL
274     Java_org_jwz_xscreensaver_gen_StonerviewWallpaper_allnativeSettings
275     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
276      jint draw, jstring key) {
277
278     const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
279     char *hck = (char *) chack;
280     const char *kchack = (*env)->GetStringUTFChars(env, key, NULL);
281     char *khck = (char *) kchack;
282
283     if (draw == 2) {
284         setStonerviewSettings(hck, khck);
285     }
286
287     chosen = 1;
288 }
289
290 JNIEXPORT void JNICALL
291     Java_org_jwz_xscreensaver_gen_BouncingcowWallpaper_allnativeSettings
292     (JNIEnv * env, jobject thiz, jstring jhack, jstring hackPref,
293      jint draw, jstring key) {
294
295     const char *chack = (*env)->GetStringUTFChars(env, hackPref, NULL);
296     char *hck = (char *) chack;
297     const char *kchack = (*env)->GetStringUTFChars(env, key, NULL);
298     char *khck = (char *) kchack;
299
300     if (draw == 2) {
301         setBouncingcowSettings(hck, khck);
302     }
303
304     chosen = 4;
305 }
306