From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver] / hacks / xanalogtv.c
index 7df31599e63fdcc7a561d8c41cf61f35d77915b6..1565c8927581b6c3f82319f4adc26b9ca099429e 100644 (file)
@@ -34,7 +34,7 @@
 # include <unistd.h>
 #endif
 
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
 # include <X11/Intrinsic.h> /* for XtDatabase in hack_resources() */
 #endif
 
@@ -60,7 +60,7 @@ typedef struct chansetting_s {
   analogtv_reception recs[MAX_MULTICHAN];
   double noise_level;
   Bool image_loaded_p;
-  char *filename;  /* mostly unused */
+/*  char *filename;     was only used for diagnostics */
   int dur;
 } chansetting;
 
@@ -238,8 +238,8 @@ static const char *xanalogtv_defaults [] = {
   ".background:                black",
   ".foreground:                white",
   "*delay:             5",
-  "*grabDesktopImages:  False",   /* HAVE_COCOA */
-  "*chooseRandomImages: True",    /* HAVE_COCOA */
+  "*grabDesktopImages:  False",   /* HAVE_JWXYZ */
+  "*chooseRandomImages: True",    /* HAVE_JWXYZ */
   ANALOGTV_DEFAULTS
   0,
 };
@@ -281,7 +281,7 @@ getticks(struct state *st)
 static void
 hack_resources (Display *dpy)
 {
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
   static int count = -1;
   count++;
 
@@ -301,7 +301,7 @@ hack_resources (Display *dpy)
       value.size = strlen(buf2);
       XrmPutResource (&db, buf1, "String", &value);
     }
-#endif /* HAVE_COCOA */
+#endif /* HAVE_JWXYZ */
 }
 
 
@@ -531,10 +531,14 @@ xanalogtv_draw (Display *dpy, Window window, void *closure)
   int curticks=getticks(st);
   double curtime=curticks*0.001;
 
-  if (st->change_now || 
-      (curticks >= st->change_ticks && st->tv->powerup > 10.0)) {
+  const analogtv_reception *recs[MAX_MULTICHAN];
+  unsigned rec_count = 0;
+
+  int auto_change = curticks >= st->change_ticks && st->tv->powerup > 10.0 ? 1 : 0;
+
+  if (st->change_now || auto_change) {
+    st->curinputi=(st->curinputi+st->change_now+auto_change+N_CHANNELS)%N_CHANNELS;
     st->change_now = 0;
-    st->curinputi=(st->curinputi+1)%N_CHANNELS;
     st->cs = &st->chansettings[st->curinputi];
 #if 0
     fprintf (stderr, "%s: channel %d, %s\n", progname, st->curinputi,
@@ -559,17 +563,21 @@ xanalogtv_draw (Display *dpy, Window window, void *closure)
 
   st->tv->powerup=curtime;
 
-  analogtv_init_signal(st->tv, st->cs->noise_level);
   for (i=0; i<MAX_MULTICHAN; i++) {
     analogtv_reception *rec = &st->cs->recs[i];
-    analogtv_input *inp=rec->input;
-    if (!inp) continue;
-
-    analogtv_reception_update(rec);
-    analogtv_add_signal(st->tv, rec);
+    if (rec->input) {
+      analogtv_reception_update(rec);
+      recs[rec_count] = rec;
+      ++rec_count;
+    }
   }
-  analogtv_draw(st->tv);
-  return 10000;
+  analogtv_draw(st->tv, st->cs->noise_level, recs, rec_count);
+
+#ifdef HAVE_MOBILE
+  return 0;
+#else
+  return 5000;
+#endif
 }
 
 static void
@@ -587,7 +595,8 @@ xanalogtv_event (Display *dpy, Window window, void *closure, XEvent *event)
 
   if (event->type == ButtonPress)
     {
-      st->change_now = 1;
+      unsigned button = event->xbutton.button;
+      st->change_now = button == 2 || button == 3 || button == 5 ? -1 : 1;
       return True;
     }
   else if (event->type == KeyPress)
@@ -595,11 +604,26 @@ xanalogtv_event (Display *dpy, Window window, void *closure, XEvent *event)
       KeySym keysym;
       char c = 0;
       XLookupString (&event->xkey, &c, 1, &keysym, 0);
-      if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+      if (c == ' ' || c == '\t' || c == '\r' || c == '\n' ||
+          keysym == XK_Up || keysym == XK_Right || keysym == XK_Prior)
         {
           st->change_now = 1;
           return True;
         }
+      else if (c == '\b' ||
+               keysym == XK_Down || keysym == XK_Left || keysym == XK_Next)
+        {
+          st->change_now = -1;
+          return True;
+        }
+      else if (screenhack_event_helper (dpy, window, event))
+        goto DEF;
+    }
+  else if (screenhack_event_helper (dpy, window, event))
+    {
+    DEF:
+      st->change_now = ((random() & 1) ? 1 : -1);
+      return True;
     }
 
   return False;