We need at least one more voter to break the tie - I like the second approach.
Why? It uses MatchTag instead of MatchProduct. Eraser/Cursor/Pad is a tag/type not a product. Plus, duplicated MatchProduct confuses people IMO. Let's see what the list would choose. My friends, it is time to show your support :)! Ping P.S., just kidding. I don't have a strong preference in the names/tags as long as Wacom is in it :). On Sun, May 23, 2010 at 7:47 PM, Peter Hutterer <[email protected]> wrote: > Note that the patch below won't apply just yet, you'll need some changes to > the X server, marginal ones though. Also, hence the FIXME's the ABI number > needs to be bumped. > > The problem we face at the moment is that the driver can hotplug dependent > devices but the configuration options from the xorg.conf.d snippets only > apply to the first device (usually the stylus). It's not possible to use > xorg.conf.d snippets to configure the eraser, for example. > > With a proposed change to the X server to copy the input attributes into the > device file, we can counteract this by passing these attributes to the next > device. The attributes are essentially what we get from the config backend > (hal or udev) and contain some of the information exported by the kernel. > That's easy enough and the code is quite straightforward as you can see > below. > > Now, what we need to decide on though is which path to chose for the extra > information (this patch implements both). > Approach 1 is to append the type to the product name - as we do with the > device name. So if the device has a product name of "Wacom Intuos", the > eraser will have a product name of "Wacom Intuos eraser". > This would lead to the following configuration: > Section "InputClass" > Identifier "Wacom eraser class" > MatchProduct "Wacom" > MatchProduct "eraser" > Option "Foo" "bar" > EndSection > > MatchProduct doesn't do regex, so a match of "Wacom*eraser" won't work, it > has to be two different lines. > The MatchProduct "Wacom" is just there so other devices that may have > "eraser" in their name won't get matched. > > > Approach 2 is to append the type to the tags (tags are arbitrary names > assigned to devices by the config backend that can be mached against). > This would lead to the following configuration: > Section "InputClass" > Identifier "Wacom eraser class" > MatchProduct "Wacom" > MatchTag "eraser" > Option "Foo" "bar" > EndSection > > The MatchProduct "Wacom" is just there so other devices that may have the > same tag don't get matched. > > I personally prefer the first approach since the name is quite exposed > already anyway and it IMO makes for more obvious matching. But I'd like to > hear some comments on which one is preferable. > > Cheers, > Peter > --- > src/wcmValidateDevice.c | 84 > ++++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 83 insertions(+), 1 deletions(-) > > diff --git a/src/wcmValidateDevice.c b/src/wcmValidateDevice.c > index 438cf38..3f668b4 100644 > --- a/src/wcmValidateDevice.c > +++ b/src/wcmValidateDevice.c > @@ -295,6 +295,76 @@ static void wcmFreeInputOpts(InputOption* opts) > } > } > > +/* FIXME: should be different number */ > +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 9 > +/** > + * Duplicate the attributes of the given device. "product" gets the type > + * appended, so a device of product "Wacom" will then have a product "Wacom > + * eraser", "Wacom cursor", etc. > + * And the type is added to the tags as well. > + */ > +static InputAttributes* wcmDuplicateAttributes(LocalDevicePtr local, > + const char *type) > +{ > + InputAttributes *new_attr = NULL; > + > + InputAttributes *attr = local->attrs; > + char **tag, **new_tag; > + int ntags = 0; > + > + new_attr = calloc(1, sizeof(InputAttributes)); > + new_attr->flags = attr->flags; > + if (attr->vendor) > + new_attr->vendor = strdup(attr->vendor); > + if (attr->device) > + new_attr->device = strdup(attr->device); > + > + if (attr->product) > + { > + /* one space, one \0 > */ > + new_attr->product = calloc(strlen(attr->product) + > strlen(type) + 2, 1); > + strcpy(new_attr->product, attr->product); > + } > + if (type) { > + strcat(new_attr->product, " "); > + strcat(new_attr->product, type); > + } > + > + tag = attr->tags; > + while(*tag++) > + ntags++; > + > + new_attr->tags = calloc(ntags + 2, sizeof(char*)); > + > + tag = attr->tags; > + new_tag = new_attr->tags; > + while(*tag) > + { > + *new_tag = strdup(*tag); > + tag++; > + new_tag++; > + } > + *new_tag = strdup(type); > + return new_attr; > +} > + > +static void wcmFreeAttributes(InputAttributes *attr) > +{ > + char **tag = attr->tags; > + while(*tag) > + { > + free(*tag); > + tag++; > + } > + > + free(attr->tags); > + free(attr->product); > + free(attr->vendor); > + free(attr->device); > + free(attr); > +} > +#endif > + > /** > * Hotplug one device of the given type. > * Device has the same options as the "parent" device, type is one of > @@ -305,15 +375,27 @@ static void wcmHotplug(LocalDevicePtr local, const char > *type) > { > DeviceIntPtr dev; /* dummy */ > InputOption *input_options; > +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 9 > + InputAttributes *attrs = NULL; > +#endif > > input_options = wcmOptionDupConvert(local, type); > > +/* FIXME: should be different number */ > +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 9 > + attrs = wcmDuplicateAttributes(local, type); > +#endif > + > NewInputDeviceRequest(input_options, > #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 9 > - NULL, > + attrs, > #endif > &dev); > wcmFreeInputOpts(input_options); > + > +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 9 > + wcmFreeAttributes(attrs); > +#endif > } > > void wcmHotplugOthers(LocalDevicePtr local) > -- > 1.7.0.1 > > ------------------------------------------------------------------------------ _______________________________________________ Linuxwacom-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
