X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fxflame.c;h=2c1db6ef9b0fb79ff040fae2df4be76d12cf10a2;hb=aa75c7476aeaa84cf3abc192b376a8b03c325213;hp=2785fb816a49964161c9cdee4b4ae719d3307bc9;hpb=c1b9b55ad8d59dc05ef55e316aebf5863e7dfa56;p=xscreensaver diff --git a/hacks/xflame.c b/hacks/xflame.c index 2785fb81..2c1db6ef 100644 --- a/hacks/xflame.c +++ b/hacks/xflame.c @@ -125,6 +125,10 @@ MakeImage(struct state *st) { XGCValues gcv; + /* #### This probably leaks SHM every time the window is resized. */ + if (st->xim) + XDestroyImage (st->xim); + #ifdef HAVE_XSHM_EXTENSION st->shared = True; st->xim = create_xshm_image (st->dpy, st->visual, st->depth, ZPixmap, NULL, @@ -147,8 +151,8 @@ MakeImage(struct state *st) } } - st->gc = XCreateGC(st->dpy,st->window,0,&gcv); - if (!st->gc) exit (1); + if (! st->gc) + st->gc = XCreateGC(st->dpy,st->window,0,&gcv); } @@ -215,6 +219,8 @@ InitFlame(struct state *st) { st->fwidth = st->width / 2; st->fheight = st->height / 2; + + if (st->flame) free (st->flame); st->flame = (unsigned char *) malloc((st->fwidth + 2) * (st->fheight + 2) * sizeof(unsigned char)); @@ -605,11 +611,11 @@ FlamePasteData(struct state *st, static unsigned char * loadBitmap(struct state *st, int *w, int *h) { +# ifdef HAVE_JWXYZ + const char *bitmap_name = "(default)"; /* #### always use builtin */ +# else char *bitmap_name = get_string_resource (st->dpy, "bitmap", "Bitmap"); - -#ifdef HAVE_COCOA - bitmap_name = "(default)"; /* #### always use builtin */ -#endif /* HAVE_COCOA */ +# endif if (!bitmap_name || !*bitmap_name || @@ -619,13 +625,13 @@ loadBitmap(struct state *st, int *w, int *h) { XImage *ximage; unsigned char *result, *o; - char *bits = (char *) malloc (sizeof(bob_bits)); + unsigned char *bits = (unsigned char *) malloc (sizeof(bob_bits)); int x, y; - int scale = ((st->width > bob_width * 11) ? 2 : 1); + int scale = ((st->width > bob_width * 10) ? 2 : 1); memcpy (bits, bob_bits, sizeof(bob_bits)); - ximage = XCreateImage (st->dpy, st->visual, 1, XYBitmap, 0, bits, - bob_width, bob_height, 8, 0); + ximage = XCreateImage (st->dpy, st->visual, 1, XYBitmap, 0, + (char *) bits, bob_width, bob_height, 8, 0); ximage->byte_order = LSBFirst; ximage->bitmap_bit_order = LSBFirst; *w = ximage->width * scale; @@ -638,7 +644,7 @@ loadBitmap(struct state *st, int *w, int *h) return result; } else /* load a bitmap file */ -#ifdef HAVE_COCOA +#ifdef HAVE_JWXYZ abort(); /* #### fix me */ #else { @@ -697,7 +703,7 @@ loadBitmap(struct state *st, int *w, int *h) *h = st->height; return result; } -#endif /* !HAVE_COCOA */ +#endif /* !HAVE_JWXYZ */ *w = 0; *h = 0; @@ -721,12 +727,6 @@ xflame_init (Display *dpy, Window win) InitColors(st); st->theim = loadBitmap(st, &st->theimx, &st->theimy); - /* utils/xshm.c doesn't provide a way to free the shared-memory image, which - makes it hard for us to react to window resizing. So, punt for now. The - size of the window at startup is the size it will stay. - */ - GetXInfo(st); - MakeImage(st); InitFlame(st); FlameFill(st,0); @@ -755,6 +755,12 @@ static void xflame_reshape (Display *dpy, Window window, void *closure, unsigned int w, unsigned int h) { + struct state *st = (struct state *) closure; + GetXInfo(st); + MakeImage(st); + InitFlame(st); + FlameFill(st,0); + XClearWindow (dpy, window); } static Bool