On Wed, Sep 07, 2011 at 04:36:51PM -0700, Jason Gerecke wrote:
> The 'set_output' function is now responsible for parsing the
> command-line arguments to both determine the proper function
> to call, as well as converting them into a form that can be
> more easily used by the helper functions. This patch also
> breaks the RandR compatibility check out into its own function
> to improve readability.
> 
> Signed-off-by: Jason Gerecke <[email protected]>
> ---
>  Changes from v2:
>   * Helper functions no longer "intelligent" like earlier
>     patches tried to make them
> 
>   * Helper functions now take explicit arguments instead
>     of the remaining commandline string
> 
>   * Break-out Xinerama compatibility check into its own
>    function for readability
> 
>  tools/xsetwacom.c |   84 ++++++++++++++++++++++++++++++++++------------------
>  1 files changed, 55 insertions(+), 29 deletions(-)
> 
> diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
> index 7bc5b54..2f2e922 100644
> --- a/tools/xsetwacom.c
> +++ b/tools/xsetwacom.c
> @@ -1930,6 +1930,32 @@ static void get_map(Display *dpy, XDevice *dev, 
> param_t *param, int argc, char**
>       }
>  }
>  
> +/**
> + * Determine if we need to use fall back to Xinerama, or if the RandR
> + * extension will work OK. We depend on RandR 1.3 or better in order
> + * to work.
> + *
> + * A server bug causes the NVIDIA driver to report RandR 1.3 support
> + * despite not exposing RandR CRTCs. We need to fall back to Xinerama
> + * for this case as well.
> + */
> +static Bool need_xinerama(Display *dpy)
> +{
> +     int opcode, event, error;
> +     int maj, min;
> +
> +     if (!XQueryExtension(dpy, "RANDR", &opcode, &event, &error) ||
> +         !XRRQueryVersion(dpy, &maj, &min) || (maj * 1000 + min) < 1002 ||
> +         XQueryExtension(dpy, "NV-CONTROL", &opcode, &event, &error))
> +     {
> +             TRACE("RandR extension not found, too old, or NV-CONTROL "
> +                     "extension is also present.\n");
> +             return True;
> +     }
> +
> +     return False;
> +}
> +
>  static void _set_matrix_prop(Display *dpy, XDevice *dev, const float 
> fmatrix[9])
>  {
>       Atom matrix_prop = XInternAtom(dpy, "Coordinate Transformation Matrix", 
> True);
> @@ -2003,17 +2029,19 @@ static void _set_matrix(Display *dpy, XDevice *dev,
>       _set_matrix_prop(dpy, dev, matrix);
>  }
>  
> -static void set_output_xrandr(Display *dpy, XDevice *dev, param_t *param, 
> int argc, char **argv)
> +/**
> + * Adjust the transformation matrix based on RandR settings. This function
> + * will attempt to map the given device to the output with the given RandR
> + * output name.
> + */
> +static void set_output_xrandr(Display *dpy, XDevice *dev, char *output_name)
>  {
>       int i, found = 0;
>       int x, y, width, height;
> -     char *output_name;
>       XRRScreenResources *res;
>       XRROutputInfo *output_info;
>       XRRCrtcInfo *crtc_info;
>  
> -     output_name = argv[0];
> -
>       res = XRRGetScreenResources(dpy, DefaultRootWindow(dpy));
>       for (i = 0; i < res->noutput && !found; i++)
>       {
> @@ -2054,17 +2082,20 @@ static void set_output_xrandr(Display *dpy, XDevice 
> *dev, param_t *param, int ar
>  }
>  
>  /**
> - * Adjust the transformation matrix based on the Xinerama settings. For
> - * TwinView This would better be done with libXNVCtrl but until they learn
> - * to package it properly, rely on Xinerama. Besides, libXNVCtrl isn't
> - * available on RHEL, so we'd have to do it through Xinerama there anyway.
> + * Adjust the transformation matrix based on the Xinerama settings. This
> + * function will attempt to map the given device to the specified Xinerama
> + * head number.
> + *
> + * For TwinView This would better be done with libXNVCtrl but until they
> + * learn to package it properly, we need to rely on Xinerama. Besides,
> + * libXNVCtrl isn't available on RHEL, so we'd have to do it through
> + * Xinerama there anyway.
>   */
> -static void set_output_xinerama(Display *dpy, XDevice *dev, param_t *param, 
> int argc, char **argv)
> +static void set_output_xinerama(Display *dpy, XDevice *dev, int head)
>  {
>       int event, error;
>       XineramaScreenInfo *screens;
>       int nscreens;
> -     int head;
>  
>       if (!XineramaQueryExtension(dpy, &event, &error))
>       {
> @@ -2072,13 +2103,6 @@ static void set_output_xinerama(Display *dpy, XDevice 
> *dev, param_t *param, int
>               return;
>       }
>  
> -     if (!convert_value_from_user(param, argv[0], &head))
> -     {
> -             fprintf(stderr, "Please specify the output name as HEAD-X,"
> -                             "where X is the screen number\n");
> -             return;
> -     }
> -
>       screens = XineramaQueryScreens(dpy, &nscreens);
>  
>       if (nscreens == 0)
> @@ -2087,8 +2111,8 @@ static void set_output_xinerama(Display *dpy, XDevice 
> *dev, param_t *param, int
>               goto out;
>       } else if (nscreens <= head)
>       {
> -             fprintf(stderr, "Found %d screens, but you requested %s.\n",
> -                             nscreens, argv[0]);
> +             fprintf(stderr, "Found %d screens, but you requested number 
> %d.\n",
> +                             nscreens, head);
>               goto out;
>       }
>  
> @@ -2104,8 +2128,7 @@ out:
>  
>  static void set_output(Display *dpy, XDevice *dev, param_t *param, int argc, 
> char **argv)
>  {
> -     int opcode, event, error;
> -     int maj, min;
> +     int tmp_int;

tmp_int suggests that this value isn't used. It is, afaict. Mabye change it
to head_no, that seems to be what the value represents.

>  
>       if (argc == 0)
>       {
> @@ -2122,15 +2145,18 @@ static void set_output(Display *dpy, XDevice *dev, 
> param_t *param, int argc, cha
>               return;
>       }
>  
> -     /* Check for RandR 1.2. Server bug causes the NVIDIA driver to
> -      * report with RandR 1.3 support but it doesn't expose RandR CRTCs.
> -      * Force Xinerama if NV-CONTROL is present */
> -     if (XQueryExtension(dpy, "NV-CONTROL", &opcode, &event, &error) ||
> -         !XQueryExtension(dpy, "RANDR", &opcode, &event, &error) ||
> -         !XRRQueryVersion(dpy, &maj, &min) || (maj * 1000 + min) < 1002)
> -             set_output_xinerama(dpy, dev, param, argc, argv);
> +     if (!need_xinerama(dpy))
> +     {
> +             set_output_xrandr(dpy, dev, argv[0]);
> +     }
> +     else if  (convert_value_from_user(param, argv[0], &tmp_int))
> +     {
> +             set_output_xinerama(dpy, dev, tmp_int);
> +     }
>       else
> -             set_output_xrandr(dpy, dev, param, argc, argv);
> +     {
> +             fprintf(stderr, "Unable to find an output '%s'.\n", argv[0]);
> +     }

we usually don't use {} for single-line blocks.

anyway, with those two fixed: Reviewed-by: Peter Hutterer 
<[email protected]>

Cheers,
  Peter

------------------------------------------------------------------------------
Doing More with Less: The Next Generation Virtual Desktop 
What are the key obstacles that have prevented many mid-market businesses
from deploying virtual desktops?   How do next-generation virtual desktops
provide companies an easier-to-deploy, easier-to-manage and more affordable
virtual desktop model.http://www.accelacomm.com/jaw/sfnl/114/51426474/
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to