X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fspotlight.c;h=7224ee855406918ed1e49c1b6a0a6cd09e364d24;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=aade77df66dfa1eb3b0e4505147838ecc601a646;hpb=50be9bb40dc60130c99ffa568e6677779904ff70;p=xscreensaver diff --git a/hacks/spotlight.c b/hacks/spotlight.c index aade77df..7224ee85 100644 --- a/hacks/spotlight.c +++ b/hacks/spotlight.c @@ -22,6 +22,7 @@ /* #define DEBUG */ #include +#include #include "screenhack.h" #define MINX 0.0 @@ -38,7 +39,7 @@ struct state { int delay; int duration; time_t start_time; - + int first_time; GC window_gc; #ifdef DEBUG GC white_gc; @@ -73,13 +74,15 @@ static long currentTimeInMs(struct state *st) { struct timeval curTime; + unsigned long ret_unsigned; #ifdef GETTIMEOFDAY_TWO_ARGS struct timezone tz = {0,0}; gettimeofday(&curTime, &tz); #else gettimeofday(&curTime); #endif - return curTime.tv_sec*1000 + curTime.tv_usec/1000.0; + ret_unsigned = curTime.tv_sec *1000U + curTime.tv_usec / 1000; + return (ret_unsigned <= LONG_MAX) ? ret_unsigned : -1 - (long)(ULONG_MAX - ret_unsigned); } @@ -138,8 +141,10 @@ spotlight_init (Display *dpy, Window window) st->pm = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth); XClearWindow(st->dpy, st->window); + st->first_time = 1; + /* create buffer to reduce flicker */ -#ifdef HAVE_COCOA /* Don't second-guess Quartz's double-buffering */ +#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */ st->buffer = 0; #else st->buffer = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth); @@ -149,15 +154,11 @@ spotlight_init (Display *dpy, Window window) if (st->buffer) XFillRectangle(st->dpy, st->buffer, st->buffer_gc, 0, 0, st->sizex, st->sizey); - /* blank out screen */ - XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey); - XSetWindowBackground (st->dpy, st->window, bg); - /* create clip mask (so it's a circle, not a square) */ clip_pm = XCreatePixmap(st->dpy, st->window, st->radius*4, st->radius*4, 1); st->img_loader = load_image_async_simple (0, xgwa.screen, st->window, st->pm, 0, 0); - st->start_time = time ((time_t) 0); + st->start_time = time ((time_t *) 0); gcv.foreground = 0L; clip_gc = XCreateGC(st->dpy, clip_pm, gcflags, &gcv); @@ -179,11 +180,9 @@ spotlight_init (Display *dpy, Window window) st->off = random(); -#ifdef DEBUG - /* create GC with white fg */ - gcv.foreground = fg; - st->white_gc = XCreateGC(st->dpy, st->window, gcflags, &gcv); -#endif + /* blank out screen */ + XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey); + return st; } @@ -195,18 +194,19 @@ static void onestep (struct state *st, Bool first_p) { long now; + unsigned long now_unsigned; if (st->img_loader) /* still loading */ { st->img_loader = load_image_async_simple (st->img_loader, 0, 0, 0, 0, 0); if (! st->img_loader) { /* just finished */ - st->start_time = time ((time_t) 0); + st->start_time = time ((time_t *) 0); } return; } if (!st->img_loader && - st->start_time + st->duration < time ((time_t) 0)) { + st->start_time + st->duration < time ((time_t *) 0)) { st->img_loader = load_image_async_simple (0, st->screen, st->window, st->pm, 0, 0); return; @@ -219,7 +219,8 @@ onestep (struct state *st, Bool first_p) st->s = st->radius *4 ; /* s = width of buffer */ - now = currentTimeInMs(st) + st->off; + now_unsigned = (unsigned long) currentTimeInMs(st) + st->off; + now = (now_unsigned <= LONG_MAX) ? now_unsigned : -1 - (long)(ULONG_MAX - now_unsigned); /* find new x,y */ st->x = ((1 + sin(((double)now) / X_PERIOD * 2. * M_PI))/2.0) @@ -252,6 +253,12 @@ onestep (struct state *st, Bool first_p) XSetClipOrigin(st->dpy, st->buffer_gc, st->x,st->y); XCopyArea(st->dpy, st->pm, st->buffer, st->buffer_gc, st->x, st->y, st->s, st->s, st->x, st->y); + if (st->first_time) { + /* blank out screen */ + XFillRectangle(st->dpy, st->window, st->window_gc, 0, 0, st->sizex, st->sizey); + st->first_time = 0; + } + /* copy buffer to screen (window) */ XCopyArea(st->dpy, st->buffer, st->window, st->window_gc, st->x , st->y, st->s, st->s, st->x, st->y); } @@ -282,6 +289,12 @@ spotlight_reshape (Display *dpy, Window window, void *closure, static Bool spotlight_event (Display *dpy, Window window, void *closure, XEvent *event) { + struct state *st = (struct state *) closure; + if (screenhack_event_helper (dpy, window, event)) + { + st->start_time = 0; + return True; + } return False; } @@ -312,6 +325,10 @@ static const char *spotlight_defaults [] = { "*delay: 10000", "*duration: 120", "*radius: 125", +#ifdef HAVE_MOBILE + "*ignoreRotation: True", + "*rotateImages: True", +#endif 0 };