debian/changelog    |    7 
 xrandr/aclocal.m4   |    2 
 xrandr/configure    |   24 +--
 xrandr/configure.ac |    2 
 xrandr/xrandr.c     |  378 +++++++++++++++++++++++++++++++++++++++++++++++++---
 5 files changed, 378 insertions(+), 35 deletions(-)

New commits:
commit 413f6c501a0422df045750499450dd69204fafd9
Author: Julien Cristau <[EMAIL PROTECTED]>
Date:   Thu Jun 21 16:23:55 2007 +0100

    Add xrandr 1.2.1.

diff --git a/debian/changelog b/debian/changelog
index 42504b7..df84310 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+x11-xserver-utils (7.2-1) experimental; urgency=low
+
+  * Change versioning scheme, base it on the latest X katamari release.
+  * Add xrandr 1.2.1.
+
+ -- Julien Cristau <[EMAIL PROTECTED]>  Thu, 21 Jun 2007 16:20:45 +0100
+
 x11-xserver-utils (0.1) experimental; urgency=low
 
   [ Timo Aaltonen ]
diff --git a/xrandr/aclocal.m4 b/xrandr/aclocal.m4
index f17e720..2d86b12 100644
--- a/xrandr/aclocal.m4
+++ b/xrandr/aclocal.m4
@@ -159,7 +159,7 @@ path to pkg-config.
 
 _PKG_TEXT
 
-To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
                [$4])
 else
        $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
diff --git a/xrandr/configure b/xrandr/configure
index eae87ba..aeeb231 100755
--- a/xrandr/configure
+++ b/xrandr/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for xrandr 1.2.0.
+# Generated by GNU Autoconf 2.61 for xrandr 1.2.1.
 #
 # Report bugs to <https://bugs.freedesktop.org/enter_bug.cgi?product=xorg>.
 #
@@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='xrandr'
 PACKAGE_TARNAME='xrandr'
-PACKAGE_VERSION='1.2.0'
-PACKAGE_STRING='xrandr 1.2.0'
+PACKAGE_VERSION='1.2.1'
+PACKAGE_STRING='xrandr 1.2.1'
 PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg'
 
 ac_subst_vars='SHELL
@@ -1194,7 +1194,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures xrandr 1.2.0 to adapt to many kinds of systems.
+\`configure' configures xrandr 1.2.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1264,7 +1264,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of xrandr 1.2.0:";;
+     short | recursive ) echo "Configuration of xrandr 1.2.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1359,7 +1359,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-xrandr configure 1.2.0
+xrandr configure 1.2.1
 generated by GNU Autoconf 2.61
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1373,7 +1373,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by xrandr $as_me 1.2.0, which was
+It was created by xrandr $as_me 1.2.1, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   $ $0 $@
@@ -2043,7 +2043,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='xrandr'
- VERSION='1.2.0'
+ VERSION='1.2.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3603,7 +3603,7 @@ Alternatively, you may set the environment variables 
XRANDR_CFLAGS
 and XRANDR_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 
-To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&5
 echo "$as_me: error: The pkg-config script could not be found or is too old.  
Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
@@ -3613,7 +3613,7 @@ Alternatively, you may set the environment variables 
XRANDR_CFLAGS
 and XRANDR_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 
-To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 else
@@ -4239,7 +4239,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by xrandr $as_me 1.2.0, which was
+This file was extended by xrandr $as_me 1.2.1, which was
 generated by GNU Autoconf 2.61.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4292,7 +4292,7 @@ Report bugs to <[EMAIL PROTECTED]>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-xrandr config.status 1.2.0
+xrandr config.status 1.2.1
 configured by $0, generated by GNU Autoconf 2.61,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`\\"
 
diff --git a/xrandr/configure.ac b/xrandr/configure.ac
index ae7d2f2..96443ff 100644
--- a/xrandr/configure.ac
+++ b/xrandr/configure.ac
@@ -22,7 +22,7 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ([2.57])
-AC_INIT(xrandr,[1.2.0], 
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xrandr)
+AC_INIT(xrandr,[1.2.1], 
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],xrandr)
 AM_INIT_AUTOMAKE([dist-bzip2])
 AM_MAINTAINER_MODE
 
diff --git a/xrandr/xrandr.c b/xrandr/xrandr.c
index 7425263..7754741 100644
--- a/xrandr/xrandr.c
+++ b/xrandr/xrandr.c
@@ -111,8 +111,17 @@ usage(void)
     fprintf(stderr, "      --right-of <output>\n");
     fprintf(stderr, "      --above <output>\n");
     fprintf(stderr, "      --below <output>\n");
+    fprintf(stderr, "      --same-as <output>\n");
+    fprintf(stderr, "      --set <property> <value>\n");
     fprintf(stderr, "      --off\n");
     fprintf(stderr, "      --crtc <crtc>\n");
+    fprintf(stderr, "  --newmode <name> <clock MHz>\n");
+    fprintf(stderr, "            <hdisp> <hsync-start> <hsync-end> 
<htotal>\n");
+    fprintf(stderr, "            <vdisp> <vsync-start> <vsync-end> 
<vtotal>\n");
+    fprintf(stderr, "            [+HSync] [-HSync] [+VSync] [-VSync]\n");
+    fprintf(stderr, "  --rmmode <name>\n");
+    fprintf(stderr, "  --addmode <output> <mode>\n");
+    fprintf(stderr, "  --delmode <output> <mode>\n");
 #endif
 
     exit(1);
@@ -159,6 +168,7 @@ reflection_name (Rotation rotation)
     case RR_Reflect_X|RR_Reflect_Y:
        return "X and Y axis";
     }
+    return "invalid reflection";
 }
 
 #if HAS_RANDR_1_2
@@ -167,7 +177,7 @@ typedef enum _policy {
 } policy_t;
 
 typedef enum _relation {
-    left_of, right_of, above, below
+    left_of, right_of, above, below, same_as,
 } relation_t;
 
 typedef enum _changes {
@@ -180,6 +190,7 @@ typedef enum _changes {
     changes_reflection = (1 << 5),
     changes_automatic = (1 << 6),
     changes_refresh = (1 << 7),
+    changes_property = (1 << 8),
 } changes_t;
 
 typedef enum _name_kind {
@@ -199,6 +210,8 @@ typedef struct {
 
 typedef struct _crtc crtc_t;
 typedef struct _output output_t;
+typedef struct _umode  umode_t;
+typedef struct _output_prop output_prop_t;
 
 struct _crtc {
     name_t         crtc;
@@ -213,11 +226,19 @@ struct _crtc {
     int                    noutput;
 };
 
+struct _output_prop {
+    struct _output_prop        *next;
+    char               *name;
+    char               *value;
+};
+
 struct _output {
     struct _output   *next;
     
     changes_t      changes;
     
+    output_prop_t   *props;
+
     name_t         output;
     XRROutputInfo   *output_info;
     
@@ -228,6 +249,8 @@ struct _output {
     float          refresh;
     XRRModeInfo            *mode_info;
     
+    name_t         addmode;
+
     relation_t     relation;
     char           *relative_to;
 
@@ -237,6 +260,20 @@ struct _output {
     Bool           automatic;
 };
 
+typedef enum _umode_action {
+    umode_create, umode_destroy, umode_add, umode_delete
+} umode_action_t;
+
+
+struct _umode {
+    struct _umode   *next;
+    
+    umode_action_t  action;
+    XRRModeInfo            mode;
+    name_t         output;
+    name_t         name;
+};
+
 static char *connection[3] = {
     "connected",
     "disconnected",
@@ -258,6 +295,7 @@ static char *connection[3] = {
 static output_t        *outputs = NULL;
 static output_t        **outputs_tail = &outputs;
 static crtc_t  *crtcs;
+static umode_t *umodes;
 static int     num_crtcs;
 static XRRScreenResources  *res;
 static int     fb_width = 0, fb_height = 0;
@@ -412,7 +450,7 @@ find_output (name_t *name)
            break;
        if ((common & name_string) && !strcmp (name->string, 
output->output.string))
            break;
-       if ((common & name_index) & name->index == output->output.index)
+       if ((common & name_index) && name->index == output->output.index)
            break;
     }
     return output;
@@ -516,6 +554,15 @@ find_mode_by_xid (RRMode mode)
     return find_mode (&mode_name, 0);
 }
 
+static XRRModeInfo *
+find_mode_by_name (char *name)
+{
+    name_t  mode_name;
+    init_name (&mode_name);
+    set_name_string (&mode_name, name);
+    return find_mode (&mode_name, 0);
+}
+
 static
 XRRModeInfo *
 find_mode_for_output (output_t *output, name_t *name)
@@ -852,8 +899,6 @@ set_crtcs (void)
 static Status
 crtc_disable (crtc_t *crtc)
 {
-    XRRCrtcInfo        *crtc_info = crtc->crtc_info;
-    
     if (verbose)
        printf ("crtc %d: disable\n", crtc->crtc.index);
        
@@ -919,7 +964,7 @@ static void
 screen_revert (void)
 {
     if (verbose)
-       printf ("screen %d: revert\n");
+       printf ("screen %d: revert\n", screen);
 
     if (dryrun)
        return;
@@ -1183,7 +1228,7 @@ find_crtc_for_output (output_t *output)
     for (c = 0; c < output->output_info->ncrtc; c++)
     {
        crtc_t      *crtc;
-       int         l, o;
+       int         l;
        output_t    *other;
 
        crtc = find_crtc_by_xid (output->output_info->crtcs[c]);
@@ -1242,6 +1287,8 @@ set_positions (void)
 
            if (!(output->changes & changes_relation)) continue;
            
+           if (output->mode_info == NULL) continue;
+
            init_name (&relation_name);
            set_name_string (&relation_name, output->relative_to);
            relation = find_output (&relation_name);
@@ -1282,6 +1329,9 @@ set_positions (void)
                output->x = relation->x;
                output->y = relation->y + mode_height (relation->mode_info, 
relation->rotation);
                break;
+           case same_as:
+               output->x = relation->x;
+               output->y = relation->y;
            }
            output->changes |= changes_position;
            any_set = True;
@@ -1397,10 +1447,11 @@ main (int argc, char **argv)
     int                ret = 0;
 #if HAS_RANDR_1_2
     output_t   *output = NULL;
-    char       *crtc;
     policy_t   policy = clone;
     Bool       setit_1_2 = False;
     Bool       query_1_2 = False;
+    Bool       modeit = False;
+    Bool       propit = False;
     Bool       query_1 = False;
     int                major, minor;
 #endif
@@ -1600,6 +1651,29 @@ main (int argc, char **argv)
            output->changes |= changes_relation;
            continue;
        }
+       if (!strcmp ("--same-as", argv[i])) {
+           if (++i>=argc) usage ();
+           if (!output) usage();
+           output->relation = same_as;
+           output->relative_to = argv[i];
+           output->changes |= changes_relation;
+           continue;
+       }
+       if (!strcmp ("--set", argv[i])) {
+           output_prop_t   *prop;
+           if (!output) usage();
+           prop = malloc (sizeof (output_prop_t));
+           prop->next = output->props;
+           output->props = prop;
+           if (++i>=argc) usage ();
+           prop->name = argv[i];
+           if (++i>=argc) usage ();
+           prop->value = argv[i];
+           propit = True;
+           output->changes |= changes_property;
+           setit_1_2 = True;
+           continue;
+       }
        if (!strcmp ("--off", argv[i])) {
            if (!output) usage();
            set_name_xid (&output->mode, None);
@@ -1649,7 +1723,8 @@ main (int argc, char **argv)
                output->automatic = True;
                output->changes |= changes_automatic;
            }
-           automatic = True;
+           else
+               automatic = True;
            setit_1_2 = True;
            continue;
        }
@@ -1663,6 +1738,102 @@ main (int argc, char **argv)
            query_1 = True;
            continue;
        }
+       if (!strcmp ("--newmode", argv[i]))
+       {
+           umode_t  *m = malloc (sizeof (umode_t));
+           float   clock;
+           
+           ++i;
+           if (i + 9 >= argc) usage ();
+           m->mode.name = argv[i];
+           m->mode.nameLength = strlen (argv[i]);
+           i++;
+           if (sscanf (argv[i++], "%f", &clock) != 1)
+               usage ();
+           m->mode.dotClock = clock * 1e6;
+
+           if (sscanf (argv[i++], "%d", &m->mode.width) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.hSyncStart) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.hSyncEnd) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.hTotal) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.height) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.vSyncStart) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.vSyncEnd) != 1) usage();
+           if (sscanf (argv[i++], "%d", &m->mode.vTotal) != 1) usage();
+           m->mode.modeFlags = 0;
+           while (i < argc) {
+               static const struct {
+                   char            *string;
+                   unsigned long   flag;
+               } mode_flags[] = {
+                   { "+HSync", RR_HSyncPositive },
+                   { "-HSync", RR_HSyncNegative },
+                   { "+VSync", RR_VSyncPositive },
+                   { "-VSync", RR_VSyncNegative },
+                   { "Interlace", RR_Interlace },
+                   { "DoubleScan", RR_DoubleScan },
+                   { "CSync",      RR_CSync },
+                   { "+CSync",     RR_CSyncPositive },
+                   { "-CSync",     RR_CSyncNegative },
+                   { NULL,         0 }
+               };
+               int f;
+               
+               for (f = 0; mode_flags[f].string; f++)
+                   if (!strcasecmp (mode_flags[f].string, argv[i]))
+                       break;
+               
+               if (!mode_flags[f].string)
+                   break;
+               m->mode.modeFlags |= mode_flags[f].flag;
+               i++;
+           }
+           m->next = umodes;
+           m->action = umode_create;
+           umodes = m;
+           modeit = True;
+           continue;
+       }
+       if (!strcmp ("--rmmode", argv[i]))
+       {
+           umode_t  *m = malloc (sizeof (umode_t));
+
+           if (++i>=argc) usage ();
+           set_name (&m->name, argv[i], name_string|name_xid);
+           m->action = umode_destroy;
+           m->next = umodes;
+           umodes = m;
+           modeit = True;
+           continue;
+       }
+       if (!strcmp ("--addmode", argv[i]))
+       {
+           umode_t  *m = malloc (sizeof (umode_t));
+
+           if (++i>=argc) usage ();
+           set_name (&m->output, argv[i], name_string|name_xid);
+           if (++i>=argc) usage();
+           set_name (&m->name, argv[i], name_string|name_xid);
+           m->action = umode_add;
+           m->next = umodes;
+           umodes = m;
+           modeit = True;
+           continue;
+       }
+       if (!strcmp ("--delmode", argv[i]))
+       {
+           umode_t  *m = malloc (sizeof (umode_t));
+
+           if (++i>=argc) usage ();
+           set_name (&m->output, argv[i], name_string|name_xid);
+           if (++i>=argc) usage();
+           set_name (&m->name, argv[i], name_string|name_xid);
+           m->action = umode_delete;
+           m->next = umodes;
+           umodes = m;
+           modeit = True;
+           continue;
+       }
 #endif
        usage();
     }
@@ -1698,17 +1869,134 @@ main (int argc, char **argv)
     if (major > 1 || (major == 1 && minor >= 2))
        has_1_2 = True;
        
-    if (setit_1_2)
+    if (has_1_2 && modeit)
+    {
+       umode_t *m;
+
+        get_screen ();
+       get_crtcs();
+       get_outputs();
+       
+       for (m = umodes; m; m = m->next)
+       {
+           XRRModeInfo *e;
+           output_t    *o;
+           
+           switch (m->action) {
+           case umode_create:
+               XRRCreateMode (dpy, root, &m->mode);
+               break;
+           case umode_destroy:
+               e = find_mode (&m->name, 0);
+               if (!e)
+                   fatal ("cannot find mode \"%s\"\n", m->name.string);
+               XRRDestroyMode (dpy, e->id);
+               break;
+           case umode_add:
+               o = find_output (&m->output);
+               if (!o)
+                   fatal ("cannot find output \"%s\"\n", m->output.string);
+               e = find_mode (&m->name, 0);
+               if (!e)
+                   fatal ("cannot find mode \"%s\"\n", m->name.string);
+               XRRAddOutputMode (dpy, o->output.xid, e->id);
+               break;
+           case umode_delete:
+               o = find_output (&m->output);
+               if (!o)
+                   fatal ("cannot find output \"%s\"\n", m->output.string);
+               e = find_mode (&m->name, 0);
+               if (!e)
+                   fatal ("cannot find mode \"%s\"\n", m->name.string);
+               XRRDeleteOutputMode (dpy, o->output.xid, e->id);
+               break;
+           }
+       }
+       if (!setit_1_2)
+       {
+           XSync (dpy, False);
+           exit (0);
+       }
+    }
+    if (has_1_2 && propit)
     {
-       XRROutputInfo       *output_info;
-       XRRCrtcInfo         *crtc_info;
-       XRRCrtcInfo         *crtc_cur;
-       XRRModeInfo         *mode_info;
-       RROutput            *crtc_outputs;
-       int                 n_crtc_output;
-       int                 c, o, m;
-       int                 om, sm;
+       
+        get_screen ();
+       get_crtcs();
+       get_outputs();
+       
+       for (output = outputs; output; output = output->next)
+       {
+           output_prop_t   *prop;
 
+           for (prop = output->props; prop; prop = prop->next)
+           {
+               Atom            name = XInternAtom (dpy, prop->name, False);
+               Atom            type;
+               int             format;
+               unsigned char   *data;
+               int             nelements;
+               int             int_value;
+               unsigned long   ulong_value;
+               unsigned char   *prop_data;
+               int             actual_format;
+               unsigned long   nitems, bytes_after;
+               Atom            actual_type;
+               XRRPropertyInfo *propinfo;
+
+               type = AnyPropertyType;
+               format=0;
+               
+               if (XRRGetOutputProperty (dpy, output->output.xid, name,
+                                         0, 100, False, False,
+                                         AnyPropertyType,
+                                         &actual_type, &actual_format,
+                                         &nitems, &bytes_after, &prop_data) == 
Success &&
+
+                   (propinfo = XRRQueryOutputProperty(dpy, output->output.xid,
+                                                     name)))
+               {
+                   type = actual_type;
+                   format = actual_format;
+               }
+               
+               if ((type == XA_INTEGER || type == AnyPropertyType) &&
+                   (sscanf (prop->value, "%d", &int_value) == 1 ||
+                    sscanf (prop->value, "0x%x", &int_value) == 1))
+               {
+                   type = XA_INTEGER;
+                   ulong_value = int_value;
+                   data = (unsigned char *) &ulong_value;
+                   nelements = 1;
+                   format = 32;
+               }
+               else if ((type == XA_ATOM))
+               {
+                   ulong_value = XInternAtom (dpy, prop->value, False);
+                   data = (unsigned char *) &ulong_value;
+                   nelements = 1;
+                   format = 32;
+               }
+               else if ((type == XA_STRING || type == AnyPropertyType))
+               {
+                   type = XA_STRING;
+                   data = (unsigned char *) prop->value;
+                   nelements = strlen (prop->value);
+                   format = 8;
+               }
+               XRRChangeOutputProperty (dpy, output->output.xid,
+                                        name, type, format, PropModeReplace,
+                                        data, nelements);
+           }
+       }
+       if (!setit_1_2)
+       {
+           XSync (dpy, False);
+           exit (0);
+       }
+    }
+    if (setit_1_2)
+    {
        get_screen ();
        get_crtcs ();
        get_outputs ();
@@ -1801,6 +2089,9 @@ main (int argc, char **argv)
     if (query_1_2 || (query && has_1_2 && !query_1))
     {
        output_t    *output;
+       int         m;
+       
+#define ModeShown   0x80000000
        
        get_screen ();
        get_crtcs ();
@@ -1871,7 +2162,7 @@ main (int argc, char **argv)
                printf ("\tIdentifier: 0x%x\n", output->output.xid);
                printf ("\tTimestamp:  %d\n", output_info->timestamp);
                printf ("\tSubpixel:   %s\n", 
order[output_info->subpixel_order]);
-               printf ("\tClones:     ");
+               printf ("\tClones:    ");
                for (j = 0; j < output_info->nclone; j++)
                {
                    output_t    *clone = find_output_by_xid 
(output_info->clones[j]);
@@ -1926,7 +2217,7 @@ main (int argc, char **argv)
                    {
                        printf("\t%s: %d (0x%08x)",
                               XGetAtomName (dpy, props[j]),
-                              *(INT32 *)prop);
+                              *(INT32 *)prop, *(INT32 *)prop);
 
                        if (propinfo->range && propinfo->num_values > 0) {
                            printf(" range%s: ",
@@ -1938,6 +2229,26 @@ main (int argc, char **argv)
                        }
 
                        printf("\n");
+                   } else if (actual_type == XA_ATOM &&
+                              actual_format == 32)
+                   {
+                       printf("\t%s: %s",
+                              XGetAtomName (dpy, props[j]),
+                              XGetAtomName (dpy, *(Atom *)prop));
+
+                       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          ");
+                           }
+                       }
+                       printf("\n");
+                       
                    } else if (actual_format == 8) {
                        printf ("\t\t%s: %s%s\n", XGetAtomName (dpy, props[j]),
                                prop, bytes_after ? "..." : "");
@@ -1964,6 +2275,7 @@ main (int argc, char **argv)
                    printf ("        v: height %4d start %4d end %4d total %4d  
         clock %6.1fHz\n",
                            mode->height, mode->vSyncStart, mode->vSyncEnd, 
mode->vTotal,
                            mode_refresh (mode));
+                   mode->modeFlags |= ModeShown;
                }
            }
            else
@@ -1985,6 +2297,7 @@ main (int argc, char **argv)
                        kmode = find_mode_by_xid (output_info->modes[k]);
                        if (strcmp (jmode->name, kmode->name) != 0) continue;
                        mode_shown[k] = True;
+                       kmode->modeFlags |= ModeShown;
                        printf (" %6.1f", mode_refresh (kmode));
                        if (kmode == output->mode_info)
                            printf ("*");
@@ -2000,6 +2313,23 @@ main (int argc, char **argv)
                free (mode_shown);
            }
        }
+       for (m = 0; m < res->nmode; m++)
+       {
+           XRRModeInfo *mode = &res->modes[m];
+
+           if (!(mode->modeFlags & ModeShown))
+           {
+               printf ("  %s (0x%x) %6.1fMHz\n",
+                       mode->name, mode->id,
+                       (float)mode->dotClock / 1000000.0);
+               printf ("        h: width  %4d start %4d end %4d total %4d skew 
%4d clock %6.1fKHz\n",
+                       mode->width, mode->hSyncStart, mode->hSyncEnd,
+                       mode->hTotal, mode->hSkew, mode_hsync (mode) / 1000);
+               printf ("        v: height %4d start %4d end %4d total %4d      
     clock %6.1fHz\n",
+                       mode->height, mode->vSyncStart, mode->vSyncEnd, 
mode->vTotal,
+                       mode_refresh (mode));
+           }
+       }
        exit (0);
     }
 #endif
@@ -2027,6 +2357,12 @@ main (int argc, char **argv)
     }
     else if (size < 0)
        size = current_size;
+    else if (size >= nsize) {
+       fprintf (stderr,
+                "Size index %d is too large, there are only %d sizes\n",
+                size, nsize);
+       exit (1);
+    }
 
     if (rot < 0)
     {
@@ -2051,7 +2387,7 @@ main (int argc, char **argv)
            if (rate == rates[i])
                break;
        if (i == nrate) {
-           fprintf (stderr, "Rate %d not available for this size\n", rate);
+           fprintf (stderr, "Rate %.1f Hz not available for this size\n", 
rate);
            exit (1);
        }
     }
@@ -2063,7 +2399,7 @@ main (int argc, char **argv)
               major_version, minor_version);
     }
 
-    if (query) {
+    if (query || query_1) {
        printf(" SZ:    Pixels          Physical       Refresh\n");
        for (i = 0; i < nsize; i++) {
            printf ("%c%-2d %5d x %-5d  (%4dmm x%4dmm )",


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to