[PATCH] xprop: Add colored icon support
Andy Spencer
andy753421 at gmail.com
Wed Nov 11 21:49:49 PST 2009
* Supports both 16 and 265 color terminals
* 8 color output supports ascii and utf8 brightness
Signed-off-by: Andy Spencer <andy753421 at 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;
--
1.6.5.2
More information about the xorg
mailing list