projects
/
xscreensaver
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz
[xscreensaver]
/
hacks
/
twang.c
diff --git
a/hacks/twang.c
b/hacks/twang.c
index 79bbd8f735b6b10cfef31bdc595e2e96a001c9a0..4c434d0dff834a0308a57c3411fbeee3b3163585 100644
(file)
--- a/
hacks/twang.c
+++ b/
hacks/twang.c
@@
-48,6
+48,7
@@
struct state {
Window window;
int delay; /* delay (usec) between iterations */
Window window;
int delay; /* delay (usec) between iterations */
+ int duration; /* time (sec) before loading new image */
int maxColumns; /* the maximum number of columns of tiles */
int maxRows; /* the maximum number of rows of tiles */
int tileSize; /* the size (width and height) of a tile */
int maxColumns; /* the maximum number of columns of tiles */
int maxRows; /* the maximum number of rows of tiles */
int tileSize; /* the size (width and height) of a tile */
@@
-76,6
+77,7
@@
struct state {
Tile **sortedTiles; /* array of tile pointers, sorted by zoom */
int tileCount; /* total number of tiles */
Tile **sortedTiles; /* array of tile pointers, sorted by zoom */
int tileCount; /* total number of tiles */
+ time_t start_time;
async_load_state *img_loader;
Bool useShm; /* whether or not to use xshm */
async_load_state *img_loader;
Bool useShm; /* whether or not to use xshm */
@@
-102,28
+104,46
@@
struct state {
*/
/* grab the source image */
*/
/* grab the source image */
-static void grabImage_start (struct state *st, XWindowAttributes *xwa)
+static void
+grabImage_start (struct state *st, XWindowAttributes *xwa)
{
{
+ Pixmap p;
+ GC gc;
+ XGCValues gcv;
XFillRectangle (st->dpy, st->window, st->backgroundGC, 0, 0,
st->windowWidth, st->windowHeight);
XFillRectangle (st->dpy, st->window, st->backgroundGC, 0, 0,
st->windowWidth, st->windowHeight);
+
+ p = XCreatePixmap (st->dpy, st->window,
+ xwa->width, xwa->height, xwa->depth);
+ gc = XCreateGC (st->dpy, st->window, 0, &gcv);
+ XCopyArea (st->dpy, st->window, p, gc, 0, 0,
+ xwa->width, xwa->height, 0, 0);
st->backgroundImage =
st->backgroundImage =
- XGetImage (st->dpy,
st->window
, 0, 0, st->windowWidth, st->windowHeight,
+ XGetImage (st->dpy,
p
, 0, 0, st->windowWidth, st->windowHeight,
~0L, ZPixmap);
~0L, ZPixmap);
+ XFreeGC (st->dpy, gc);
+ XFreePixmap (st->dpy, p);
+ st->start_time = time ((time_t *) 0);
st->img_loader = load_image_async_simple (0, xwa->screen, st->window,
st->window, 0, 0);
}
st->img_loader = load_image_async_simple (0, xwa->screen, st->window,
st->window, 0, 0);
}
-static void grabImage_done (struct state *st)
+static void
+grabImage_done (struct state *st)
{
{
- XWindowAttributes xwa;
- XGetWindowAttributes (st->dpy, st->window, &xwa);
+
XWindowAttributes xwa;
+
XGetWindowAttributes (st->dpy, st->window, &xwa);
+ st->start_time = time ((time_t *) 0);
+ if (st->sourceImage) XDestroyImage (st->sourceImage);
st->sourceImage = XGetImage (st->dpy, st->window, 0, 0, st->windowWidth, st->windowHeight,
~0L, ZPixmap);
st->sourceImage = XGetImage (st->dpy, st->window, 0, 0, st->windowWidth, st->windowHeight,
~0L, ZPixmap);
-#ifdef HAVE_XSHM_EXTENSION
+ if (st->workImage) XDestroyImage (st->workImage);
st->workImage = NULL;
st->workImage = NULL;
+
+#ifdef HAVE_XSHM_EXTENSION
if (st->useShm)
{
st->workImage = create_xshm_image (st->dpy, xwa.visual, xwa.depth,
if (st->useShm)
{
st->workImage = create_xshm_image (st->dpy, xwa.visual, xwa.depth,
@@
-572,6
+592,7
@@
static void setupModel (struct state *st)
leftX = (st->windowWidth - (st->columns * st->tileSize) + st->tileSize) / 2;
topY = (st->windowHeight - (st->rows * st->tileSize) + st->tileSize) / 2;
leftX = (st->windowWidth - (st->columns * st->tileSize) + st->tileSize) / 2;
topY = (st->windowHeight - (st->rows * st->tileSize) + st->tileSize) / 2;
+ if (st->tileCount < 1) st->tileCount = 1;
st->tiles = calloc (st->tileCount, sizeof (Tile));
st->sortedTiles = calloc (st->tileCount, sizeof (Tile *));
st->tiles = calloc (st->tileCount, sizeof (Tile));
st->sortedTiles = calloc (st->tileCount, sizeof (Tile *));
@@
-605,6
+626,13
@@
twang_draw (Display *dpy, Window window, void *closure)
return st->delay;
}
return st->delay;
}
+ if (!st->img_loader &&
+ st->start_time + st->duration < time ((time_t *) 0)) {
+ XWindowAttributes xgwa;
+ XGetWindowAttributes (st->dpy, st->window, &xgwa);
+ grabImage_start (st, &xgwa);
+ return st->delay;
+ }
modelEvents (st);
updateModel (st);
modelEvents (st);
updateModel (st);
@@
-622,6
+650,12
@@
twang_reshape (Display *dpy, Window window, void *closure,
static Bool
twang_event (Display *dpy, Window window, void *closure, XEvent *event)
{
static Bool
twang_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;
}
return False;
}
@@
-655,6
+689,9
@@
static void initParams (struct state *st)
problems = 1;
}
problems = 1;
}
+ st->duration = get_integer_resource (st->dpy, "duration", "Seconds");
+ if (st->duration < 1) st->duration = 1;
+
st->eventChance = get_float_resource (st->dpy, "eventChance", "Double");
if ((st->eventChance < 0.0) || (st->eventChance > 1.0))
{
st->eventChance = get_float_resource (st->dpy, "eventChance", "Double");
if ((st->eventChance < 0.0) || (st->eventChance > 1.0))
{
@@
-735,6
+772,7
@@
static const char *twang_defaults [] = {
"*borderColor: blue",
"*borderWidth: 3",
"*delay: 10000",
"*borderColor: blue",
"*borderWidth: 3",
"*delay: 10000",
+ "*duration: 120",
"*eventChance: 0.01",
"*friction: 0.05",
"*maxColumns: 0",
"*eventChance: 0.01",
"*friction: 0.05",
"*maxColumns: 0",
@@
-746,6
+784,10
@@
static const char *twang_defaults [] = {
"*useSHM: True",
#else
"*useSHM: False",
"*useSHM: True",
#else
"*useSHM: False",
+#endif
+#ifdef HAVE_MOBILE
+ "*ignoreRotation: True",
+ "*rotateImages: True",
#endif
0
};
#endif
0
};
@@
-754,6
+796,7
@@
static XrmOptionDescRec twang_options [] = {
{ "-border-color", ".borderColor", XrmoptionSepArg, 0 },
{ "-border-width", ".borderWidth", XrmoptionSepArg, 0 },
{ "-delay", ".delay", XrmoptionSepArg, 0 },
{ "-border-color", ".borderColor", XrmoptionSepArg, 0 },
{ "-border-width", ".borderWidth", XrmoptionSepArg, 0 },
{ "-delay", ".delay", XrmoptionSepArg, 0 },
+ { "-duration", ".duration", XrmoptionSepArg, 0 },
{ "-event-chance", ".eventChance", XrmoptionSepArg, 0 },
{ "-friction", ".friction", XrmoptionSepArg, 0 },
{ "-max-columns", ".maxColumns", XrmoptionSepArg, 0 },
{ "-event-chance", ".eventChance", XrmoptionSepArg, 0 },
{ "-friction", ".friction", XrmoptionSepArg, 0 },
{ "-max-columns", ".maxColumns", XrmoptionSepArg, 0 },