X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fscreenhack.c;h=addc960ebbfa938c4e3e97a957577fa279d25a26;hb=39809ded547bdbb08207d3e514950425215b4410;hp=bd251dc566a3a8f65096d71beffd67f3390e7e50;hpb=5f1f12f2a37da634000f96d18d59cc73a8814ef7;p=xscreensaver diff --git a/hacks/screenhack.c b/hacks/screenhack.c index bd251dc5..addc960e 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-2010 Jamie Zawinski +/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -112,6 +112,10 @@ #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,15 +152,21 @@ 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", + "*multiSample: false", "*visualID: default", "*windowID: ", "*desktopGrabber: xscreensaver-getimage %s", @@ -444,7 +454,7 @@ screenhack_table_handle_events (Display *dpy, 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 @@ -453,7 +463,7 @@ screenhack_table_handle_events (Display *dpy, (! (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))) @@ -476,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); @@ -509,7 +527,7 @@ usleep_and_process_events (Display *dpy, 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); } @@ -519,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) { @@ -534,10 +555,12 @@ run_screenhack_table (Display *dpy, void *closure = init_cb (dpy, window, ft->setup_arg); fps_state *fpst = fps_init (dpy, window); + unsigned long delay = 0; #ifdef DEBUG_PAIR void *closure2 = 0; fps_state *fpst2 = 0; + unsigned long delay2 = 0; if (window2) closure2 = init_cb (dpy, window2, ft->setup_arg); if (window2) fpst2 = fps_init (dpy, window2); #endif @@ -549,32 +572,40 @@ run_screenhack_table (Display *dpy, while (1) { - unsigned long delay = ft->draw_cb (dpy, window, closure); + if (! usleep_and_process_events (dpy, ft, + window, fpst, closure, delay #ifdef DEBUG_PAIR - unsigned long delay2 = 0; - if (window2) delay2 = ft->draw_cb (dpy, window2, closure2); + , window2, fpst2, closure2, delay2 +#endif +#ifdef HAVE_RECORD_ANIM + , anim_state #endif + )) + break; - if (fpst) fps_cb (dpy, window, fpst, closure); + delay = ft->draw_cb (dpy, window, closure); #ifdef DEBUG_PAIR - if (fpst2) fps_cb (dpy, window, fpst2, closure); + delay2 = 0; + if (window2) delay2 = ft->draw_cb (dpy, window2, closure2); #endif - if (! usleep_and_process_events (dpy, ft, - window, fpst, closure, delay + if (fpst) fps_cb (dpy, window, fpst, closure); #ifdef DEBUG_PAIR - , window2, fpst2, closure2, delay2 + if (fpst2) fps_cb (dpy, window2, fpst2, closure2); #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 } @@ -676,6 +707,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; @@ -726,13 +760,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); } @@ -747,7 +785,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]); @@ -917,12 +955,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);