st-flexipatch

My st-flexipatch configuration
git clone git://git.ethandl.dev/st-flexipatch
Log | Files | Refs | README | LICENSE

background_image_x.c (2513B)


      1 void
      2 updatexy()
      3 {
      4 	Window child;
      5 	XTranslateCoordinates(xw.dpy, xw.win, DefaultRootWindow(xw.dpy), 0, 0, &win.x, &win.y, &child);
      6 }
      7 
      8 /*
      9  * load farbfeld file to XImage
     10  */
     11 XImage*
     12 loadff(const char *filename)
     13 {
     14 	uint32_t i, hdr[4], w, h, size;
     15 	uint64_t *data;
     16 	FILE *f = fopen(filename, "rb");
     17 
     18 	if (f == NULL) {
     19 		fprintf(stderr, "could not load background image.\n");
     20 		return NULL;
     21 	}
     22 
     23 	if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr)) {
     24 		fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading header");
     25 		fclose(f);
     26 		return NULL;
     27 	}
     28 
     29 	if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) {
     30 		fprintf(stderr, "Invalid magic value\n");
     31 		fclose(f);
     32 		return NULL;
     33 	}
     34 
     35 	w = ntohl(hdr[2]);
     36 	h = ntohl(hdr[3]);
     37 	size = w * h;
     38 	data = xmalloc(size * sizeof(uint64_t));
     39 
     40 	if (fread(data, sizeof(uint64_t), size, f) != size) {
     41 		fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading data");
     42 		fclose(f);
     43 		return NULL;
     44 	}
     45 
     46 	fclose(f);
     47 
     48 	for (i = 0; i < size; i++)
     49 		 data[i] = (data[i] & 0x00000000000000FF) << 16 |
     50 		           (data[i] & 0x0000000000FF0000) >> 8  |
     51 		           (data[i] & 0x000000FF00000000) >> 32 |
     52 		           (data[i] & 0x00FF000000000000) >> 24;
     53 
     54 	#if ALPHA_PATCH
     55 	XImage *xi = XCreateImage(xw.dpy, xw.vis, xw.depth, ZPixmap, 0,
     56 		(char *)data, w, h, 32, w * 8);
     57 	#else
     58 	XImage *xi = XCreateImage(xw.dpy, DefaultVisual(xw.dpy, xw.scr),
     59 		DefaultDepth(xw.dpy, xw.scr), ZPixmap, 0,
     60 		(char *)data, w, h, 32, w * 8);
     61 	#endif // ALPHA_PATCH
     62 	xi->bits_per_pixel = 64;
     63 	return xi;
     64 }
     65 
     66 /*
     67  * initialize background image
     68  */
     69 void
     70 bginit()
     71 {
     72 	XGCValues gcvalues;
     73 	Drawable bgimg;
     74 	XImage *bgxi = loadff(bgfile);
     75 
     76 	memset(&gcvalues, 0, sizeof(gcvalues));
     77 	xw.bggc = XCreateGC(xw.dpy, xw.win, 0, &gcvalues);
     78 	if (!bgxi)
     79 		return;
     80 	#if ALPHA_PATCH
     81 	bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height,
     82 		xw.depth);
     83 	#else
     84 	bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height,
     85 		DefaultDepth(xw.dpy, xw.scr));
     86 	#endif // ALPHA_PATCH
     87 	XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width, bgxi->height);
     88 	XDestroyImage(bgxi);
     89 	XSetTile(xw.dpy, xw.bggc, bgimg);
     90 	XSetFillStyle(xw.dpy, xw.bggc, FillTiled);
     91 	if (pseudotransparency) {
     92 		updatexy();
     93 		MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask);
     94 		XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs);
     95 	}
     96 }
     97 
     98 #if BACKGROUND_IMAGE_RELOAD_PATCH
     99 void
    100 reload_image()
    101 {
    102 	XFreeGC(xw.dpy, xw.bggc);
    103 	bginit();
    104 	redraw();
    105 }
    106 #endif // XRESOURCES_RELOAD_PATCH