* Supports both 16 and 265 color terminals
* 16 color output supports ascii and utf8 brightness

Signed-off-by: Andy Spencer <andy753...@gmail.com>
---

Here's an updated patch that uses setupterm and tigetnum, it also adds a
check for curses and term.h in configure.ac..

When I test it in xterm, it says it only supports 8 colors, even though
running colortest works correctly with all 256 colors so I'm not sure
what's going on there.

>From what I can tell, there's a difference in the color tables for 8
color and 16 color terminals? Does anyone have any suggestions on how to
actually test these? (e.g. old terminals that only support 8/16 colors)

 configure.ac |    4 +-
 xprop.c      |  122 +++++++++++++++++++++++++++++++++++----------------------
 2 files changed, 78 insertions(+), 48 deletions(-)

diff --git a/configure.ac b/configure.ac
index 58b49ee..f2b6380 100644
--- a/configure.ac
+++ b/configure.ac
@@ -37,7 +37,9 @@ AC_PROG_INSTALL
 
 XORG_DEFAULT_OPTIONS
 
-AC_CHECK_HEADERS([wchar.h wctype.h langinfo.h])
+AC_CHECK_HEADERS([wchar.h wctype.h langinfo.h term.h])
+AC_SEARCH_LIBS(setupterm, curses)
+AC_SEARCH_LIBS(tigetnum, curses)
 
 # Checks for pkg-config packages
 PKG_CHECK_MODULES(XPROP, x11)
diff --git a/xprop.c b/xprop.c
index ea65013..eebe947 100644
--- a/xprop.c
+++ b/xprop.c
@@ -49,6 +49,13 @@ from The Open Group.
 #include <langinfo.h>
 #endif
 
+#ifdef HAVE_TERM_H
+#include <term.h>
+#else
+#define setupterm(...)
+#define tigetnum(...) 0
+#endif
+
 #ifndef HAVE_WCTYPE_H
 #define iswprint(x) isprint(x)
 #endif
@@ -770,20 +777,21 @@ 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;
-       
+       int colors;
+
        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 +800,76 @@ 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)
-       {
+
+       setupterm(NULL, 0, 0);
+       colors = tigetnum("colors");
+
+       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];
+
+               if (colors >= 256) {
+                   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))));
+
+                   if (colors >= 16) {
+                       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 +877,8 @@ Format_Icons (const unsigned long *icon, int len)
        }
 
        tail += sprintf (tail, "\n");
+       if (colors >= 16)
+           tail += sprintf (tail, "\33[0m");
     }
 
     return result;
-- 
1.6.5.2

_______________________________________________
xorg mailing list
xorg@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/xorg

Reply via email to