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