From 413f6c501a0422df045750499450dd69204fafd9 Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Thu, 21 Jun 2007 16:23:55 +0100 Subject: [PATCH] Add xrandr 1.2.1. --- 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(-) 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 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 .])], +To get pkg-config, see .])], [$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 . # @@ -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 . +To get pkg-config, see . 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 . +To get pkg-config, see . 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 ." _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 \n"); fprintf(stderr, " --above \n"); fprintf(stderr, " --below \n"); + fprintf(stderr, " --same-as \n"); + fprintf(stderr, " --set \n"); fprintf(stderr, " --off\n"); fprintf(stderr, " --crtc \n"); + fprintf(stderr, " --newmode \n"); + fprintf(stderr, " \n"); + fprintf(stderr, " \n"); + fprintf(stderr, " [+HSync] [-HSync] [+VSync] [-VSync]\n"); + fprintf(stderr, " --rmmode \n"); + fprintf(stderr, " --addmode \n"); + fprintf(stderr, " --delmode \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 (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) + { + + 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) { - 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 (); @@ -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 )",