From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / screenhack.c
index 9e1d473b672b337fa5b22b24a67f1cf4fdc125d8..4850911db59bb5415c966d692e7905d17a846f90 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992-2011 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 #include "vroot.h"
 #include "fps.h"
 
+#ifdef HAVE_RECORD_ANIM
+# include "recanim.h"
+#endif
+
 #ifndef _XSCREENSAVER_VROOT_H_
 # error Error!  You have an old version of vroot.h!  Check -I args.
 #endif /* _XSCREENSAVER_VROOT_H_ */
@@ -148,12 +152,17 @@ static XrmOptionDescRec default_options [] = {
 # ifdef DEBUG_PAIR
   { "-pair",   ".pair",                XrmoptionNoArg, "True" },
 # endif /* DEBUG_PAIR */
+
+# ifdef HAVE_RECORD_ANIM
+  { "-record-animation", ".recordAnim", XrmoptionSepArg, 0 },
+# endif /* HAVE_RECORD_ANIM */
+
   { 0, 0, 0, 0 }
 };
 
 static char *default_defaults[] = {
   ".root:              false",
-  "*geometry:          600x480", /* this should be .geometry, but nooooo... */
+  "*geometry:          1280x720", /* this should be .geometry, but noooo... */
   "*mono:              false",
   "*installColormap:   false",
   "*doFPS:             false",
@@ -477,15 +486,23 @@ usleep_and_process_events (Display *dpy,
                          , Window window2, fps_state *fpst2, void *closure2,
                            unsigned long delay2
 #endif
+# ifdef HAVE_RECORD_ANIM
+                         , record_anim_state *anim_state
+# endif
                            )
 {
   do {
-    unsigned long quantum = 100000;  /* 1/10th second */
+    unsigned long quantum = 33333;  /* 30 fps */
     if (quantum > delay) 
       quantum = delay;
     delay -= quantum;
 
     XSync (dpy, False);
+
+#ifdef HAVE_RECORD_ANIM
+    if (anim_state) screenhack_record_anim (anim_state);
+#endif
+
     if (quantum > 0)
       {
         usleep (quantum);
@@ -520,6 +537,9 @@ run_screenhack_table (Display *dpy,
                       Window window,
 # ifdef DEBUG_PAIR
                       Window window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+                      record_anim_state *anim_state,
 # endif
                       const struct xscreensaver_function_table *ft)
 {
@@ -558,24 +578,32 @@ run_screenhack_table (Display *dpy,
 
       if (fpst) fps_cb (dpy, window, fpst, closure);
 #ifdef DEBUG_PAIR
-      if (fpst2) fps_cb (dpy, window, fpst2, closure);
+      if (fpst2) fps_cb (dpy, window2, fpst2, closure2);
 #endif
 
       if (! usleep_and_process_events (dpy, ft,
                                        window, fpst, closure, delay
 #ifdef DEBUG_PAIR
                                        , window2, fpst2, closure2, delay2
+#endif
+#ifdef HAVE_RECORD_ANIM
+                                       , anim_state
 #endif
                                        ))
         break;
     }
 
+#ifdef HAVE_RECORD_ANIM
+  /* Exiting before target frames hit: write the video anyway. */
+  if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
   ft->free_cb (dpy, window, closure);
   if (fpst) fps_free (fpst);
 
 #ifdef DEBUG_PAIR
   if (window2) ft->free_cb (dpy, window2, closure2);
-  if (window2) fps_free (fpst2);
+  if (fpst2) fps_free (fpst2);
 #endif
 }
 
@@ -677,6 +705,9 @@ main (int argc, char **argv)
   Window window2 = 0;
   Widget toplevel2 = 0;
 # endif
+#ifdef HAVE_RECORD_ANIM
+  record_anim_state *anim_state = 0;
+#endif
   XtAppContext app;
   Bool root_p;
   Window on_window = 0;
@@ -727,13 +758,17 @@ main (int argc, char **argv)
   {
     char *v = (char *) strdup(strchr(screensaver_id, ' '));
     char *s1, *s2, *s3, *s4;
+    const char *ot = get_string_resource (dpy, "title", "Title");
     s1 = (char *) strchr(v,  ' '); s1++;
     s2 = (char *) strchr(s1, ' ');
     s3 = (char *) strchr(v,  '('); s3++;
     s4 = (char *) strchr(s3, ')');
     *s2 = 0;
     *s4 = 0;
-    sprintf (version, "%s: from the XScreenSaver %s distribution (%s.)",
+    if (ot && !*ot) ot = 0;
+    sprintf (version, "%.50s%s%s: from the XScreenSaver %s distribution (%s)",
+             (ot ? ot : ""),
+             (ot ? ": " : ""),
             progclass, s1, s3);
     free(v);
   }
@@ -748,7 +783,7 @@ main (int argc, char **argv)
                      !strcmp(argv[1], "--help"));
       fprintf (stderr, "%s\n", version);
       for (s = progclass; *s; s++) fprintf(stderr, " ");
-      fprintf (stderr, "  http://www.jwz.org/xscreensaver/\n\n");
+      fprintf (stderr, "  https://www.jwz.org/xscreensaver/\n\n");
 
       if (!help_p)
        fprintf(stderr, "Unrecognised option: %s\n", argv[1]);
@@ -918,12 +953,28 @@ main (int argc, char **argv)
 # undef ya_rand_init
   ya_rand_init (0);
 
+
+#ifdef HAVE_RECORD_ANIM
+  {
+    int frames = get_integer_resource (dpy, "recordAnim", "Integer");
+    if (frames > 0)
+      anim_state = screenhack_record_anim_init (xgwa.screen, window, frames);
+  }
+#endif
+
   run_screenhack_table (dpy, window, 
 # ifdef DEBUG_PAIR
                         window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+                        anim_state,
 # endif
                         ft);
 
+#ifdef HAVE_RECORD_ANIM
+  if (anim_state) screenhack_record_anim_free (anim_state);
+#endif
+
   XtDestroyWidget (toplevel);
   XtDestroyApplicationContext (app);