-/* xscreensaver, Copyright (c) 1992-2008 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 1992-2014 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_ */
# 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",
+ "*multiSample: false",
"*visualID: default",
"*windowID: ",
"*desktopGrabber: xscreensaver-getimage %s",
strcat (newr, oldr);
*s = newr;
}
+ else
+ *s = strdup (*s);
}
}
ft->reshape_cb (dpy, window, closure,
event.xconfigure.width, event.xconfigure.height);
#ifdef DEBUG_PAIR
- if (event.xany.window == window2)
+ if (window2 && event.xany.window == window2)
ft->reshape_cb (dpy, window2, closure2,
event.xconfigure.width, event.xconfigure.height);
#endif
(! (event.xany.window == window
? ft->event_cb (dpy, window, closure, &event)
#ifdef DEBUG_PAIR
- : event.xany.window == window2
+ : (window2 && event.xany.window == window2)
? ft->event_cb (dpy, window2, closure2, &event)
#endif
: 0)))
, 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);
static void
screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure)
{
- fps_compute (fpst, 0);
+ fps_compute (fpst, 0, -1);
fps_draw (fpst);
}
Window window,
# ifdef DEBUG_PAIR
Window window2,
+# endif
+# ifdef HAVE_RECORD_ANIM
+ record_anim_state *anim_state,
# endif
const struct xscreensaver_function_table *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
}
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;
{
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);
}
!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]);
exit (help_p ? 0 : 1);
}
+ {
+ char **s;
+ for (s = merged_defaults; *s; s++)
+ free(*s);
+ }
+
free (merged_options);
free (merged_defaults);
merged_options = 0;
# 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);