[Patches usually go to xorg-devel@, not xorg@, for review/submission.] The greybeard in me wants to suggest that hardcoding the escape codes is wrong and that termcap/terminfo should be used instead to find the right ones for $TERM, but the realist in me wonders if there are any $TERM values in widespread use these days other than xterm, screen, and various vt100-variants.
-alan- Andy Spencer wrote: > * Supports both 16 and 265 color terminals > * 8 color output supports ascii and utf8 brightness > > Signed-off-by: Andy Spencer <andy753...@gmail.com> > --- > > I'm not sure how to test for 16 and 256 color so I left them set to 0. > If someone can point out the proper way to do this I'll update it. > > I also modified the bracing style in Format_Icons function to match the > rest of xprop.c. > > And an obligatory screenshot: :) > http://andy753421.ath.cx/temp/pidgin.png > > xprop.c | 114 > +++++++++++++++++++++++++++++++++++++-------------------------- > 1 files changed, 67 insertions(+), 47 deletions(-) > > diff --git a/xprop.c b/xprop.c > index ea65013..2267e7d 100644 > --- a/xprop.c > +++ b/xprop.c > @@ -770,20 +770,20 @@ Format_Icons (const unsigned long *icon, int len) > > alloced = 0; > > - while (icon < end) > - { > + while (icon < end) { > unsigned long width, height; > int w, h; > int offset; > - > + > width = *icon++; > height = *icon++; > > offset = (tail - result); > - > + > alloced += 80; /* For the header */ > - alloced += (width*4 + 8) * height; /* For the rows (plus padding) > */ > - > + alloced += (width*14 + 8) * height; /* For the rows (plus padding) > */ > + alloced += 3; /* For the footer */ > + > result = Realloc (result, alloced); > tail = &result[offset]; > > @@ -792,58 +792,75 @@ Format_Icons (const unsigned long *icon, int len) > > tail += sprintf (tail, "\tIcon (%lu x %lu):\n", width, height); > > - if (width > 144 || height > 144) > - { > + if (width > 144 || height > 144) { > tail += sprintf (tail, "\t(not shown)"); > icon += width * height; > continue; > } > - > - for (h = 0; h < height; ++h) > - { > + > + for (h = 0; h < height; ++h) { > tail += sprintf (tail, "\t"); > - > - for (w = 0; w < width; ++w) > - { > + > + for (w = 0; w < width; ++w) { > unsigned char a, r, g, b; > unsigned long pixel = *icon++; > - unsigned long brightness; > - > + > a = (pixel & 0xff000000) >> 24; > r = (pixel & 0x00ff0000) >> 16; > g = (pixel & 0x0000ff00) >> 8; > b = (pixel & 0x000000ff); > - > - brightness = > - (a / 255.0) * (1000 - ((299 * (r / 255.0)) + > - (587 * (g / 255.0)) + > - (114 * (b / 255.0)))); > - > - if (is_utf8_locale()) > - { > - static const char palette[][4] = > - { > - " ", > - "\342\226\221", /* 25% */ > - "\342\226\222", /* 50% */ > - "\342\226\223", /* 75% */ > - "\342\226\210", /* 100% */ > - }; > - int idx; > - > - idx = (brightness * ((sizeof (palette)/sizeof(palette[0])) > - 1)) / 1000; > - > - tail += sprintf (tail, "%s", palette[idx]); > - } > - else > - { > - static const char palette[] = > - " > .'`,^:\";~-_+<>i!lI?/\\|()1{}[]rcvunxzjftLCJUYXZO0Qoahkbdpqwm*WMB8&%$#@"; > - int idx; > - > - idx = (brightness * (sizeof(palette) - 2)) / 1000; > - > - *tail++ = palette[idx]; > + > + /* TODO: test for 256 color */ > + if (0) { > + unsigned char color; > + > + color = 16 + > + ((r<48?0 : r<116?1 : (r-116)/40+2) * 36) + > + ((g<48?0 : g<116?1 : (g-116)/40+2) * 6) + > + ((b<48?0 : b<116?1 : (b-116)/40+2) * 1); > + tail += sprintf (tail, "\33[7;38;5;%dm", color); > + tail += sprintf (tail, " "); > + } else { > + unsigned long brightness; > + > + brightness = > + (a / 255.0) * (1000 - ((299 * (r / 255.0)) + > + (587 * (g / 255.0)) + > + (114 * (b / 255.0)))); > + > + /* TODO: test for 16 color */ > + if (0) { > + unsigned char colors[] = {16, 12, 10, 14, 9, 13, 11, > 15}; > + int cidx; > + > + cidx = (r/128 << 2) | > + (g/128 << 1) | > + (b/128 << 0); > + tail += sprintf (tail, "\33[38;5;%dm", colors[cidx]); > + } > + > + if (is_utf8_locale()) { > + static const char palette[][4] = { > + " ", > + "\342\226\221", /* 25% */ > + "\342\226\222", /* 50% */ > + "\342\226\223", /* 75% */ > + "\342\226\210", /* 100% */ > + }; > + int idx; > + > + idx = (brightness * ((sizeof > (palette)/sizeof(palette[0])) - 1)) / 1000; > + > + tail += sprintf (tail, "%s", palette[idx]); > + } else { > + static const char palette[] = > + " > .'`,^:\";~-_+<>i!lI?/\\|()1{}[]rcvunxzjftLCJUYXZO0Qoahkbdpqwm*WMB8&%$#@"; > + int idx; > + > + idx = (brightness * (sizeof(palette) - 2)) / 1000; > + > + *tail++ = palette[idx]; > + } > } > } > > @@ -851,6 +868,9 @@ Format_Icons (const unsigned long *icon, int len) > } > > tail += sprintf (tail, "\n"); > + /* TODO: test for color */ > + if (0 || 0) > + tail += sprintf (tail, "\33[0m"); > } > > return result; -- -Alan Coopersmith- alan.coopersm...@sun.com Sun Microsystems, Inc. - X Window System Engineering _______________________________________________ xorg mailing list xorg@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/xorg