From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / m6502.c
index 11a787432921a25a4d139ad96334a1a61867f12f..47822abebfc6ae5c76fe221d1e46627395fa2a25 100644 (file)
  * Created: 07-May-2007 
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#if defined(HAVE_STDINT_H)
 #include <stdint.h> 
+#elif defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#endif
 #include <string.h>
 #include "screenhack.h"
 #include "analogtv.h"
@@ -28,7 +35,7 @@ static const char * const demo_files[] = {
 };
 
 
-#ifndef USE_IPHONE
+#ifndef HAVE_MOBILE
 # define READ_FILES
 #endif
 
@@ -60,6 +67,7 @@ struct state {
   int which;/* the program to run*/
   int demos;/* number of demos included */
   struct timeval start_time; 
+  int reset_p;
 };
 
 static void
@@ -222,6 +230,7 @@ m6502_draw (Display *dpy, Window window, void *closure)
   struct state *st = (struct state *) closure;
   unsigned int x = 0, y = 0;
   double te;
+  const analogtv_reception *reception = &st->reception;
 
   m6502_next_eval(st->machine,500);
 
@@ -229,13 +238,12 @@ m6502_draw (Display *dpy, Window window, void *closure)
     for (y = 0; y < 32; y++)
       paint_pixel(st,x,y,st->pixels[x][y]);
   
-  analogtv_init_signal(st->tv, 0.04);
   analogtv_reception_update(&st->reception);
-  analogtv_add_signal(st->tv, &st->reception);
-  analogtv_draw(st->tv);
+  analogtv_draw(st->tv, 0.04, &reception, 1);
   te = get_time(st);
   
-  if (te > st->dt){ /* do something more interesting here XXX */
+  if (st->reset_p || te > st->dt){ /* do something more interesting here XXX */
+    st->reset_p = 0;
     for(x = 0; x < 32; x++)
       for(y = 0; y < 32; y++)
        st->pixels[x][y] = 0;
@@ -243,7 +251,11 @@ m6502_draw (Display *dpy, Window window, void *closure)
     start_rand_bin_prog(st->machine,st);
   }
 
-  return 10000;
+#ifdef HAVE_MOBILE
+  return 0;
+#else
+  return 5000;
+#endif
 }
 
 
@@ -276,6 +288,12 @@ m6502_reshape (Display *dpy, Window window, void *closure,
 static Bool
 m6502_event (Display *dpy, Window window, void *closure, XEvent *event)
 {
+  struct state *st = (struct state *) closure;
+  if (screenhack_event_helper (dpy, window, event))
+    {
+      st->reset_p = 1;
+      return True;
+    }
   return False;
 }