From b26fd532b3dab222956ea27eef4e41345978b5b2 Mon Sep 17 00:00:00 2001 From: Andy Ritger Date: Fri, 7 Sep 2012 17:58:46 -0700 Subject: [PATCH] xrandr: generalize output property printing Signed-off-by: Andy Ritger Reviewed-by: Aaron Plattner --- xrandr.c | 182 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 125 insertions(+), 57 deletions(-) diff --git a/xrandr.c b/xrandr.c index d5f0d5a..548015c 100644 --- a/xrandr.c +++ b/xrandr.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -2293,6 +2294,81 @@ property_values_from_string(const char *str, const Atom type, const int format, } +static void +print_output_property_value(Bool is_edid, + int value_format, /* 8, 16, 32 */ + Atom value_type, /* XA_{ATOM,INTEGER,CARDINAL} */ + const void *value_bytes) +{ + /* special-case the EDID */ + if (is_edid && value_format == 8) + { + const uint8_t *val = value_bytes; + printf ("%02" PRIx8, *val); + return; + } + + if (value_type == XA_ATOM && value_format == 32) + { + const Atom *val = value_bytes; + char *str = XGetAtomName (dpy, *val); + if (str != NULL) + { + printf ("%s", str); + XFree (str); + return; + } + } + + if (value_type == XA_INTEGER) + { + if (value_format == 8) + { + const int8_t *val = value_bytes; + printf ("%" PRId8, *val); + return; + } + if (value_format == 16) + { + const int16_t *val = value_bytes; + printf ("%" PRId16, *val); + return; + } + if (value_format == 32) + { + const int32_t *val = value_bytes; + printf ("%" PRId32, *val); + return; + } + } + + if (value_type == XA_CARDINAL) + { + if (value_format == 8) + { + const uint8_t *val = value_bytes; + printf ("%" PRIu8, *val); + return; + } + if (value_format == 16) + { + const uint16_t *val = value_bytes; + printf ("%" PRIu16, *val); + return; + } + if (value_format == 32) + { + const uint32_t *val = value_bytes; + printf ("%" PRIu32, *val); + return; + } + } + + printf ("?"); +} + + + int main (int argc, char **argv) { @@ -3311,7 +3387,10 @@ main (int argc, char **argv) unsigned long nitems, bytes_after; Atom actual_type; XRRPropertyInfo *propinfo; - + char *atom_name = XGetAtomName (dpy, props[j]); + Bool is_edid = strcmp (atom_name, "EDID") == 0; + int bytes_per_item; + XRRGetOutputProperty (dpy, output->output.xid, props[j], 0, 100, False, False, AnyPropertyType, @@ -3321,70 +3400,59 @@ main (int argc, char **argv) propinfo = XRRQueryOutputProperty(dpy, output->output.xid, props[j]); - if (actual_type == XA_INTEGER && actual_format == 8) { - int k; - - printf("\t%s:\n", XGetAtomName (dpy, props[j])); - for (k = 0; k < nitems; k++) { - if (k % 16 == 0) - printf ("\t\t"); - printf("%02x", (unsigned char)prop[k]); - if (k % 16 == 15) - printf("\n"); - } - } else if (actual_type == XA_INTEGER && - actual_format == 32) - { - printf("\t%s: ", XGetAtomName (dpy, props[j])); - for (k = 0; k < nitems; k++) { - if (k > 0) - printf ("\n\t\t\t"); - printf("%d (0x%08x)", - (int)((INT32 *)prop)[k], (int)((INT32 *)prop)[k]); - } + bytes_per_item = actual_format / 8; - if (propinfo->range && propinfo->num_values > 0) { - if (nitems > 1) - printf ("\n\t\t"); - printf("\trange%s: ", - (propinfo->num_values == 2) ? "" : "s"); + printf ("\t%s: ", atom_name); - for (k = 0; k < propinfo->num_values / 2; k++) - printf(" (%d,%d)", (int)propinfo->values[k * 2], - (int)propinfo->values[k * 2 + 1]); - } + if (is_edid) + { + printf ("\n\t\t"); + } - printf("\n"); - } else if (actual_type == XA_ATOM && - actual_format == 32) + for (k = 0; k < nitems; k++) { - printf("\t%s:", XGetAtomName (dpy, props[j])); - for (k = 0; k < nitems; k++) { - if (k > 0 && (k & 1) == 0) + if (k != 0) + { + if ((k % 16) == 0) + { printf ("\n\t\t"); - printf("\t%s", XGetAtomName (dpy, ((Atom *)prop)[k])); + } } + print_output_property_value (is_edid, actual_format, + actual_type, + prop + (k * bytes_per_item)); + if (!is_edid) + { + printf (" "); + } + } + printf ("\n"); - if (!propinfo->range && propinfo->num_values > 0) { - printf("\n\t\tsupported:"); - - for (k = 0; k < propinfo->num_values; k++) - { - printf(" %-12.12s", XGetAtomName (dpy, - propinfo->values[k])); - if (k % 4 == 3 && k < propinfo->num_values - 1) - printf ("\n\t\t "); - } + if (propinfo->range && propinfo->num_values > 0) + { + printf ("\t\trange%s: ", + (propinfo->num_values == 2) ? "" : "s"); + for (k = 0; k < propinfo->num_values / 2; k++) + { + printf ("("); + print_output_property_value (False, 32, actual_type, + (unsigned char *) &(propinfo->values[k * 2])); + printf (", "); + print_output_property_value (False, 32, actual_type, + (unsigned char *) &(propinfo->values[k * 2 + 1])); + printf (")"); + } + printf ("\n"); + } + if (!propinfo->range && propinfo->num_values > 0) + { + printf ("\t\tsupported: "); + for (k = 0; k < propinfo->num_values; k++) + { + print_output_property_value (False, 32, actual_type, + (unsigned char *) &(propinfo->values[k])); } - printf("\n"); - } else if (actual_format == 8) { - printf ("\t%s: %s%s\n", XGetAtomName (dpy, props[j]), - prop, bytes_after ? "..." : ""); - } else { - const char *type = actual_type ? XGetAtomName (dpy, actual_type) : "none"; - printf ("\t%s: %s(%d) (format %d items %d) ????\n", - XGetAtomName (dpy, props[j]), - type, (int)actual_type, actual_format, (int)nitems); + printf ("\n"); } free(propinfo); -- 2.32.0.93.g670b81a890