diff options
| author | auric <auric7@protonmail.com> | 2025-09-08 21:27:55 -0500 |
|---|---|---|
| committer | auric <auric7@protonmail.com> | 2025-09-08 21:27:55 -0500 |
| commit | de07b49b3249da05605f8c802b991a8588ab63b3 (patch) | |
| tree | 295d6003f08dfce1d1b779892ce9c0be97d426a3 /archive/st/patch/background_image_x.c | |
| parent | 04cfeeb799b4ee6ac990e5d6e1b5302251133d77 (diff) | |
| parent | e61da07522a060da98fa3a56db3d0360469b26cf (diff) | |
Resolved conflict, indulging new file layout
Diffstat (limited to 'archive/st/patch/background_image_x.c')
| -rw-r--r-- | archive/st/patch/background_image_x.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/archive/st/patch/background_image_x.c b/archive/st/patch/background_image_x.c new file mode 100644 index 0000000..3bbb189 --- /dev/null +++ b/archive/st/patch/background_image_x.c @@ -0,0 +1,106 @@ +void +updatexy() +{ + Window child; + XTranslateCoordinates(xw.dpy, xw.win, DefaultRootWindow(xw.dpy), 0, 0, &win.x, &win.y, &child); +} + +/* + * load farbfeld file to XImage + */ +XImage* +loadff(const char *filename) +{ + uint32_t i, hdr[4], w, h, size; + uint64_t *data; + FILE *f = fopen(filename, "rb"); + + if (f == NULL) { + fprintf(stderr, "could not load background image.\n"); + return NULL; + } + + if (fread(hdr, sizeof(*hdr), LEN(hdr), f) != LEN(hdr)) { + fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading header"); + fclose(f); + return NULL; + } + + if (memcmp("farbfeld", hdr, sizeof("farbfeld") - 1)) { + fprintf(stderr, "Invalid magic value\n"); + fclose(f); + return NULL; + } + + w = ntohl(hdr[2]); + h = ntohl(hdr[3]); + size = w * h; + data = xmalloc(size * sizeof(uint64_t)); + + if (fread(data, sizeof(uint64_t), size, f) != size) { + fprintf(stderr, "fread: %s\n", ferror(f) ? "" : "Unexpected end of file reading data"); + fclose(f); + return NULL; + } + + fclose(f); + + for (i = 0; i < size; i++) + data[i] = (data[i] & 0x00000000000000FF) << 16 | + (data[i] & 0x0000000000FF0000) >> 8 | + (data[i] & 0x000000FF00000000) >> 32 | + (data[i] & 0x00FF000000000000) >> 24; + + #if ALPHA_PATCH + XImage *xi = XCreateImage(xw.dpy, xw.vis, xw.depth, ZPixmap, 0, + (char *)data, w, h, 32, w * 8); + #else + XImage *xi = XCreateImage(xw.dpy, DefaultVisual(xw.dpy, xw.scr), + DefaultDepth(xw.dpy, xw.scr), ZPixmap, 0, + (char *)data, w, h, 32, w * 8); + #endif // ALPHA_PATCH + xi->bits_per_pixel = 64; + return xi; +} + +/* + * initialize background image + */ +void +bginit() +{ + XGCValues gcvalues; + Drawable bgimg; + XImage *bgxi = loadff(bgfile); + + memset(&gcvalues, 0, sizeof(gcvalues)); + xw.bggc = XCreateGC(xw.dpy, xw.win, 0, &gcvalues); + if (!bgxi) + return; + #if ALPHA_PATCH + bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height, + xw.depth); + #else + bgimg = XCreatePixmap(xw.dpy, xw.win, bgxi->width, bgxi->height, + DefaultDepth(xw.dpy, xw.scr)); + #endif // ALPHA_PATCH + XPutImage(xw.dpy, bgimg, dc.gc, bgxi, 0, 0, 0, 0, bgxi->width, bgxi->height); + XDestroyImage(bgxi); + XSetTile(xw.dpy, xw.bggc, bgimg); + XSetFillStyle(xw.dpy, xw.bggc, FillTiled); + if (pseudotransparency) { + updatexy(); + MODBIT(xw.attrs.event_mask, 1, PropertyChangeMask); + XChangeWindowAttributes(xw.dpy, xw.win, CWEventMask, &xw.attrs); + } +} + +#if BACKGROUND_IMAGE_RELOAD_PATCH +void +reload_image() +{ + XFreeGC(xw.dpy, xw.bggc); + bginit(); + redraw(); +} +#endif // XRESOURCES_RELOAD_PATCH |
