--- rxvt-unicode/src/xpm.C 2007/06/20 13:46:25 1.40 +++ rxvt-unicode/src/xpm.C 2007/06/30 23:58:29 1.45 @@ -28,7 +28,155 @@ #ifdef XPM_BACKGROUND -static void rxvt_pixmap_incr (unsigned int *wh, unsigned int *xy, float *incr, float *p, unsigned int widthheight, unsigned int xpmwidthheight); +#ifndef HAVE_AFTERIMAGE +/* + * search for FILE in the current working directory, and within the + * colon-delimited PATHLIST, adding the file extension EXT if required. + * + * FILE is either semi-colon or zero terminated + */ +static char * +rxvt_File_search_path (const char *pathlist, const char *file, const char *ext) +{ + int maxpath, len; + const char *p, *path; + char name[256]; + + if (!access (file, R_OK)) /* found (plain name) in current directory */ + return strdup (file); + + /* semi-colon delimited */ + if ((p = strchr (file, ';'))) + len = (p - file); + else + len = strlen (file); + + /* leave room for an extra '/' and trailing '\0' */ + maxpath = sizeof (name) - (len + (ext ? strlen (ext) : 0) + 2); + if (maxpath <= 0) + return NULL; + + /* check if we can find it now */ + strncpy (name, file, len); + name[len] = '\0'; + + if (!access (name, R_OK)) + return strdup (name); + if (ext) + { + strcat (name, ext); + if (!access (name, R_OK)) + return strdup (name); + } + for (path = pathlist; path != NULL && *path != '\0'; path = p) + { + int n; + + /* colon delimited */ + if ((p = strchr (path, ':')) == NULL) + p = strchr (path, '\0'); + + n = (p - path); + if (*p != '\0') + p++; + + if (n > 0 && n <= maxpath) + { + strncpy (name, path, n); + if (name[n - 1] != '/') + name[n++] = '/'; + name[n] = '\0'; + strncat (name, file, len); + + if (!access (name, R_OK)) + return strdup (name); + if (ext) + { + strcat (name, ext); + if (!access (name, R_OK)) + return strdup (name); + } + } + } + return NULL; +} + +/* + * Calculate tiling sizes and increments + * At start, p == 0, incr == xpmwidthheight + */ +static void +rxvt_pixmap_incr (unsigned int *wh, unsigned int *xy, float *incr, float *p, unsigned int widthheight, unsigned int xpmwidthheight) +{ + unsigned int cwh, cxy; + float cincr, cp; + + cp = 0; + cincr = (float)xpmwidthheight; + cxy = *xy; + cwh = *wh; + if (cwh == 1) + { /* display one image, no horizontal/vertical scaling */ + cincr = (float)widthheight; + if (xpmwidthheight <= widthheight) + { + cwh = xpmwidthheight; + cxy = (cxy * (widthheight - cwh)) / 100; /* beware! order */ + cwh += cxy; + } + else + { + cxy = 0; + cwh = widthheight; + } + } + else if (cwh < 10) + { /* fit WH images across/down screen */ + cincr *= cwh; + cxy = 0; + cwh = widthheight; + } + else + { + cincr *= 100.0 / cwh; + if (cwh < 100) + { /* contract */ + float pos; + + cwh = (cwh * widthheight) / 100; + pos = (float)cxy / 100 * widthheight - (cwh / 2); + + cxy = (widthheight - cwh); + if (pos <= 0) + cxy = 0; + else if (pos < cxy) + cxy = (int) pos; + cwh += cxy; + } + else + { /* expand */ + if (cxy > 0) + { /* position */ + float pos; + + pos = (float)cxy / 100 * xpmwidthheight - (cincr / 2); + cp = xpmwidthheight - cincr; + if (pos <= 0) + cp = 0; + else if (pos < cp) + cp = pos; + } + cxy = 0; + cwh = widthheight; + } + } + cincr /= widthheight; + *wh = cwh; + *xy = cxy; + *incr = cincr; + *p = cp; +} +#endif /* * These GEOM strings indicate absolute size/position: @@ -193,7 +341,7 @@ { /* So be it: I'm not using pixmaps */ pixmap = None; -#ifdef TRANSPARENT +#ifdef ENABLE_TRANSPARENCY if (!option (Opt_transparent) || !am_transparent) #endif XSetWindowBackground (dpy, vt, pix_colors[Color_bg]); @@ -237,7 +385,7 @@ } else #ifdef HAVE_AFTERIMAGE -#ifdef TRANSPARENT +#ifdef ENABLE_TRANSPARENCY if (!option(Opt_transparent) || !am_transparent) /* will do that in check_our_parents otherwise */ #endif @@ -300,87 +448,11 @@ XSetWindowBackgroundPixmap (dpy, vt, pixmap); XFreeGC (dpy, gc); -#ifdef TRANSPARENT +#ifdef ENABLE_TRANSPARENCY am_transparent = 0; #endif } -/* - * Calculate tiling sizes and increments - * At start, p == 0, incr == xpmwidthheight - */ -static void -rxvt_pixmap_incr (unsigned int *wh, unsigned int *xy, float *incr, float *p, unsigned int widthheight, unsigned int xpmwidthheight) -{ - unsigned int cwh, cxy; - float cincr, cp; - - cp = 0; - cincr = (float)xpmwidthheight; - cxy = *xy; - cwh = *wh; - if (cwh == 1) - { /* display one image, no horizontal/vertical scaling */ - cincr = (float)widthheight; - if (xpmwidthheight <= widthheight) - { - cwh = xpmwidthheight; - cxy = (cxy * (widthheight - cwh)) / 100; /* beware! order */ - cwh += cxy; - } - else - { - cxy = 0; - cwh = widthheight; - } - } - else if (cwh < 10) - { /* fit WH images across/down screen */ - cincr *= cwh; - cxy = 0; - cwh = widthheight; - } - else - { - cincr *= 100.0 / cwh; - if (cwh < 100) - { /* contract */ - float pos; - - cwh = (cwh * widthheight) / 100; - pos = (float)cxy / 100 * widthheight - (cwh / 2); - - cxy = (widthheight - cwh); - if (pos <= 0) - cxy = 0; - else if (pos < cxy) - cxy = (int) pos; - cwh += cxy; - } - else - { /* expand */ - if (cxy > 0) - { /* position */ - float pos; - - pos = (float)cxy / 100 * xpmwidthheight - (cincr / 2); - cp = xpmwidthheight - cincr; - if (pos <= 0) - cp = 0; - else if (pos < cp) - cp = pos; - } - cxy = 0; - cwh = widthheight; - } - } - cincr /= widthheight; - *wh = cwh; - *xy = cxy; - *incr = cincr; - *p = cp; -} - Pixmap rxvt_term::set_bgPixmap (const char *file) { @@ -412,7 +484,10 @@ original_asim = get_asimage( asimman, file, 0xFFFFFFFF, 100 ); else { - f = strndup( file, f - file ); + size_t len = f - file; + f = (char *)malloc (len + 1); + strncpy (f, file, len); + f[len] = '\0'; original_asim = get_asimage( asimman, f, 0xFFFFFFFF, 100 ); free( f ); } @@ -431,7 +506,7 @@ | XpmDepth | XpmSize | XpmReturnPixels); /* search environment variables here too */ - f = (char *)rxvt_File_find (file, ".xpm", rs[Rs_path]); + f = rxvt_File_search_path (rs[Rs_path], file, ".xpm"); if (f == NULL || XpmReadFileToPixmap (dpy, display->root, f, &bgPixmap.pixmap, NULL, @@ -455,13 +530,14 @@ #endif /* XPM_BACKGROUND */ -#ifdef TRANSPARENT +#ifdef ENABLE_TRANSPARENCY #if TINTING && !defined(HAVE_AFTERIMAGE) /* taken from aterm-0.4.2 */ typedef uint32_t RUINT32T; -void ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm) +static void +ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm) { int sh_r, sh_g, sh_b; RUINT32T mask_r, mask_g, mask_b;