On Wed, Sep 7, 2011 at 8:35 PM, Peter Hutterer <[email protected]> wrote:
> 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.
>
The value of the variables in this and the next patch only have
meaning if the associated else-block is entered. While you could in
theory use the variables again later by verifying the necessary
preconditions again, getting it right would be error-prone. Ideally
you'd *only* use the variable within the else-block where it has
meaning. Unfortunately I can't just declare the variables local to
that scope since the functions doing the checks
(convert_value_from_user here, and XParseGeometry in the next patch)
rely on the variables being present. Since I can't force the compiler
to complain when you start doing dangerous things, I'd like to ensure
the next person to touch this bit of code thinks twice before using
the variables.
>>
>> 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.
Things started to look cluttered to me without them, but I'll swap them in v4.
>
> anyway, with those two fixed: Reviewed-by: Peter Hutterer
> <[email protected]>
>
> Cheers,
> Peter
>
Jason
---
Day xee-nee-svsh duu-'ushtlh-ts'it;
nuu-wee-ya' duu-xan' 'vm-nvshtlh-ts'it.
Huu-chan xuu naa~-gha.
------------------------------------------------------------------------------
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