On Mon, Dec 21, 2009 at 12:29:03PM -0800, Dan Nicholson wrote: > Currently Xorg uses hal's fdi files to decide what configuration options > are applied to automatically added input devices. This is sub-optimal > since it requires users to use a new and different configuration store > than xorg.conf. > > The InputClass section attempts to provide a system similar to hal where > configuration can be applied to all devices with certain attributes. For > now, devices can be matched to: > > * A substring of the product name via a MatchProduct entry > * A substring of the vendir name via a MatchVendor entry > * A pathname pattern of the device file via a MatchDevicePath entry > * A device type via boolean entries for MatchIsKeyboard, MatchIsPointer, > MatchIsJoystick, MatchIsTablet, MatchIsTouchpad and MatchIsTouchscreen > > See the INPUTCLASS section in xorg.conf(5) for more details. > > Signed-off-by: Dan Nicholson <[email protected]> > --- > configure.ac | 2 +- > hw/xfree86/common/xf86Xinput.c | 93 ++++++++++++++ > hw/xfree86/doc/man/xorg.conf.man.pre | 96 ++++++++++++++ > hw/xfree86/parser/InputClass.c | 232 > ++++++++++++++++++++++++++++++++++ > hw/xfree86/parser/Makefile.am | 1 + > hw/xfree86/parser/configProcs.h | 4 + > hw/xfree86/parser/read.c | 8 ++ > hw/xfree86/parser/write.c | 2 + > hw/xfree86/parser/xf86Parser.h | 20 +++ > hw/xfree86/parser/xf86tokens.h | 13 ++- > include/dix-config.h.in | 3 + > 11 files changed, 472 insertions(+), 2 deletions(-) > create mode 100644 hw/xfree86/parser/InputClass.c > > diff --git a/configure.ac b/configure.ac > index 6cdef15..fe4e6fc 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -122,7 +122,7 @@ AM_CONDITIONAL(SPECIAL_DTRACE_OBJECTS, [test > "x$SPECIAL_DTRACE_OBJECTS" = "xyes" > > AC_HEADER_DIRENT > AC_HEADER_STDC > -AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h]) > +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h dlfcn.h stropts.h > fnmatch.h]) > > dnl Checks for typedefs, structures, and compiler characteristics. > AC_C_CONST > diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c > index 11b7315..e0c7830 100644 > --- a/hw/xfree86/common/xf86Xinput.c > +++ b/hw/xfree86/common/xf86Xinput.c > @@ -57,9 +57,11 @@ > #include <X11/Xatom.h> > #include "xf86.h" > #include "xf86Priv.h" > +#include "xf86Config.h" > #include "xf86Xinput.h" > #include "XIstubs.h" > #include "xf86Optrec.h" > +#include "xf86Parser.h" > #include "mipointer.h" > #include "xf86InPriv.h" > #include "compiler.h" > @@ -74,6 +76,11 @@ > #include "exglobals.h" > #include "eventstr.h" > > +#include <string.h> /* InputClassMatches */ > +#ifdef HAVE_FNMATCH_H > +#include <fnmatch.h> > +#endif > + > #include "extnsionst.h" > > #include "windowstr.h" /* screenIsSaved */ > @@ -466,6 +473,85 @@ AddOtherInputDevices(void) > { > } > > +/* > + * Classes without any Match statements match all devices. Otherwise, all > + * statements must match. > + */ > +static Bool > +InputClassMatches(XF86ConfInputClassPtr iclass, InputAttributes *attrs) > +{ > + if (iclass->match_product && > + (!attrs->product || !strstr(attrs->product, iclass->match_product))) > + return False; > + if (iclass->match_vendor && > + (!attrs->vendor || !strstr(attrs->vendor, iclass->match_vendor))) > + return False; > + if (iclass->match_device && > +#ifdef HAVE_FNMATCH_H > + (!attrs->device || > + fnmatch(iclass->match_device, attrs->device, 0) != 0)) > +#else > + (!attrs->device || !strstr(attrs->device, iclass->match_device))) > +#endif > + return False; > + if (iclass->is_keyboard.set && > + iclass->is_keyboard.val != !!(attrs->flags & ATTR_KEYBOARD)) > + return False; > + if (iclass->is_pointer.set && > + iclass->is_pointer.val != !!(attrs->flags & ATTR_POINTER)) > + return False; > + if (iclass->is_joystick.set && > + iclass->is_joystick.val != !!(attrs->flags & ATTR_JOYSTICK)) > + return False; > + if (iclass->is_tablet.set && > + iclass->is_tablet.val != !!(attrs->flags & ATTR_TABLET)) > + return False; > + if (iclass->is_touchpad.set && > + iclass->is_touchpad.val != !!(attrs->flags & ATTR_TOUCHPAD)) > + return False; > + if (iclass->is_touchscreen.set && > + iclass->is_touchscreen.val != !!(attrs->flags & ATTR_TOUCHSCREEN)) > + return False; > + return True; > +} > + > +/* > + * Merge in any InputClass configurations. Each InputClass section can > + * add to the original device configuration as well as any previous > + * InputClass sections. > + */ > +static int > +MergeInputClasses(IDevPtr idev, InputAttributes *attrs) > +{ > + XF86ConfInputClassPtr cl; > + XF86OptionPtr classopts; > + > + for (cl = xf86configptr->conf_inputclass_lst; cl; cl = cl->list.next) { > + if (!InputClassMatches(cl, attrs)) > + continue; > + > + xf86Msg(X_CONFIG, "%s: Applying InputClass \"%s\"\n", > + idev->identifier, cl->identifier); > + if (cl->driver && !idev->driver) { > + idev->driver = xstrdup(cl->driver); > + if (!idev->driver) { > + xf86Msg(X_ERROR, "Could not allocate memory while merging " > + "InputClass configuration"); > + return BadAlloc; > + } > + } > + > + classopts = xf86optionListDup(cl->option_lst); > + if (idev->commonOptions) > + idev->commonOptions = xf86optionListMerge(classopts, > + idev->commonOptions); > + else > + idev->commonOptions = classopts; > + } > + > + return Success; > +} > + > /** > * Create a new input device, activate and enable it. > * > @@ -636,6 +722,13 @@ NewInputDeviceRequest (InputOption *options, > InputAttributes *attrs, > option->value = NULL; > } > > + /* Apply InputClass settings */ > + if (attrs) { > + rval = MergeInputClasses(idev, attrs); > + if (rval != Success) > + goto unwind; > + } > + > rval = xf86NewInputDevice(idev, pdev, > (!is_auto || (is_auto && xf86Info.autoEnableDevices))); > if (rval == Success) > diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre > b/hw/xfree86/doc/man/xorg.conf.man.pre > index ace041c..08575e8 100644 > --- a/hw/xfree86/doc/man/xorg.conf.man.pre > +++ b/hw/xfree86/doc/man/xorg.conf.man.pre > @@ -117,6 +117,7 @@ The section names are: > .BR "Module " "Dynamic module loading" > .BR "Extensions " "Extension enabling" > .BR "InputDevice " "Input device description" > +.BR "InputClass " "Input class description" > .BR "Device " "Graphics device description" > .BR "VideoAdaptor " "Xv video adaptor description" > .BR "Monitor " "Monitor description" > @@ -889,6 +890,101 @@ Default: 0. > .TP 7 > .BI "Option \*qSendDragEvents\*q \*q" boolean \*q > ??? > +.SH "INPUTCLASS SECTION" > +The config file may have multiple > +.B InputClass > +sections. > +These sections are optional and are used to provide configuration for a > +class of input devices as they are automatically added. An input device can > +match more than one > +.B InputClass > +section. Each class can only supplement settings from a previous class, so > +it is best to arrange the sections with the most generic matches last. > +.PP > +.B InputClass > +sections have the following format: > +.PP > +.RS 4 > +.nf > +.B "Section \*qInputClass\*q" > +.BI " Identifier \*q" name \*q > +.I " entries" > +.I " ..." > +.I " options" > +.I " ..." > +.B "EndSection" > +.fi > +.RE > +.PP > +The > +.B Identifier > +entry is required in all > +.B InputClass > +sections. > +All other entries are optional. > +.PP > +The > +.B Identifier > +entry specifies the unique name for this input class. > +The > +.B Driver > +entry specifies the name of the driver to use for this input device. > +After all classes have been examined, the > +.RI \*q inputdriver \*q > +module from the final > +.B Driver > +entry will be enabled when using the loadable server. > +.PP > +When an input device is automatically added, its characteristics are > +checked against all > +.B InputClass > +sections. Each section can contain optional entries to narrow the match > +of the class. If none of the optional entries appear, the > +.B InputClass > +section is generic and will match any input device. If more than one of > +these entries appear, they all must match for the configuration to apply. > +The allowed matching entries are shown below. > +.PP > +.TP 7 > +.BI "MatchProduct \*q" matchproduct \*q > +This entry can be used to check if the substring > +.RI \*q matchproduct \*q > +occurs in the device's product name. > +.TP 7 > +.BI "MatchVendor \*q" matchvendor \*q > +This entry can be used to check if the substring > +.RI \*q matchvendor \*q > +occurs in the device's vendor name. > +.TP 7 > +.BI "MatchDevicePath \*q" matchdevice \*q > +This entry can be used to check if the device file matches the > +.RI \*q matchdevice \*q > +pathname pattern. > +.TP 7 > +.BI "MatchIsKeyboard \*q" bool \*q > +.TP 7 > +.BI "MatchIsPointer \*q" bool \*q > +.TP 7 > +.BI "MatchIsJoystick \*q" bool \*q > +.TP 7 > +.BI "MatchIsTablet \*q" bool \*q > +.TP 7 > +.BI "MatchIsTouchpad \*q" bool \*q > +.TP 7 > +.BI "MatchIsTouchscreen \*q" bool \*q > +Match device types. These entries take a boolean argument similar to > +.B Option > +entries. > +.PP > +When an input device has been matched to the > +.B InputClass > +section, any > +.B Option > +entries are applied to the device. See the > +.B InputDevice > +section above for a description of the various > +.B Option > +entries. > .SH "DEVICE SECTION" > The config file may have multiple > .B Device > diff --git a/hw/xfree86/parser/InputClass.c b/hw/xfree86/parser/InputClass.c > new file mode 100644 > index 0000000..1c98160 > --- /dev/null > +++ b/hw/xfree86/parser/InputClass.c > @@ -0,0 +1,232 @@ > +/* > + * Copyright (c) 2009 Dan Nicholson > + * > + * Permission is hereby granted, free of charge, to any person > + * obtaining a copy of this software and associated documentation > + * files (the "Software"), to deal in the Software without > + * restriction, including without limitation the rights to use, > + * copy, modify, merge, publish, distribute, sublicense, and/or sell > + * copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following > + * conditions: > + * > + * The above copyright notice and this permission notice shall be > + * included in all copies or substantial portions of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES > + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND > + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT > + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, > + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR > + * OTHER DEALINGS IN THE SOFTWARE. > + */ > + > +/* View/edit this file with tab stops set to 4 */ > + > +#ifdef HAVE_XORG_CONFIG_H > +#include <xorg-config.h> > +#endif > + > +#include "xf86Parser.h" > +#include "xf86tokens.h" > +#include "Configint.h" > + > +extern LexRec val; > + > +static > +xf86ConfigSymTabRec InputClassTab[] = > +{ > + {ENDSECTION, "endsection"}, > + {IDENTIFIER, "identifier"}, > + {OPTION, "option"}, > + {DRIVER, "driver"}, > + {MATCH_PRODUCT, "matchproduct"}, > + {MATCH_VENDOR, "matchvendor"}, > + {MATCH_DEVICE_PATH, "matchdevicepath"}, > + {MATCH_IS_KEYBOARD, "matchiskeyboard"}, > + {MATCH_IS_POINTER, "matchispointer"}, > + {MATCH_IS_JOYSTICK, "matchisjoystick"}, > + {MATCH_IS_TABLET, "matchistablet"}, > + {MATCH_IS_TOUCHPAD, "matchistouchpad"}, > + {MATCH_IS_TOUCHSCREEN, "matchistouchscreen"}, > + {-1, ""}, > +}; > + > +#define CLEANUP xf86freeInputClassList > + > +XF86ConfInputClassPtr > +xf86parseInputClassSection(void) > +{ > + int has_ident = FALSE; > + int token; > + > + parsePrologue(XF86ConfInputClassPtr, XF86ConfInputClassRec) > + > + while ((token = xf86getToken(InputClassTab)) != ENDSECTION) { > + switch (token) { > + case COMMENT: > + ptr->comment = xf86addComment(ptr->comment, val.str); > + break; > + case IDENTIFIER: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "Identifier"); > + if (has_ident == TRUE) > + Error(MULTIPLE_MSG, "Identifier"); > + ptr->identifier = val.str; > + has_ident = TRUE; > + break; > + case DRIVER: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "Driver"); > + if (strcmp(val.str, "keyboard") == 0) > + ptr->driver = "kbd"; > + else > + ptr->driver = val.str; > + break; > + case OPTION: > + ptr->option_lst = xf86parseOption(ptr->option_lst); > + break; > + case MATCH_PRODUCT: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchProduct"); > + ptr->match_product = val.str; > + break; > + case MATCH_VENDOR: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchVendor"); > + ptr->match_vendor = val.str; > + break; > + case MATCH_DEVICE_PATH: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchDevicePath"); > + ptr->match_device = val.str; > + break; > + case MATCH_IS_KEYBOARD: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsKeyboard"); > + ptr->is_keyboard.set = xf86getBoolValue(&ptr->is_keyboard.val, > + val.str); > + if (!ptr->is_keyboard.set) > + Error(BOOL_MSG, "MatchIsKeyboard"); > + break; > + case MATCH_IS_POINTER: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsPointer"); > + ptr->is_pointer.set = xf86getBoolValue(&ptr->is_pointer.val, > + val.str); > + if (!ptr->is_pointer.set) > + Error(BOOL_MSG, "MatchIsPointer"); > + break; > + case MATCH_IS_JOYSTICK: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsJoystick"); > + ptr->is_joystick.set = xf86getBoolValue(&ptr->is_joystick.val, > + val.str); > + if (!ptr->is_joystick.set) > + Error(BOOL_MSG, "MatchIsJoystick"); > + break; > + case MATCH_IS_TABLET: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsTablet"); > + ptr->is_tablet.set = xf86getBoolValue(&ptr->is_tablet.val, > + val.str); > + if (!ptr->is_tablet.set) > + Error(BOOL_MSG, "MatchIsTablet"); > + break; > + case MATCH_IS_TOUCHPAD: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsTouchpad"); > + ptr->is_touchpad.set = xf86getBoolValue(&ptr->is_touchpad.val, > + val.str); > + if (!ptr->is_touchpad.set) > + Error(BOOL_MSG, "MatchIsTouchpad"); > + break; > + case MATCH_IS_TOUCHSCREEN: > + if (xf86getSubToken(&(ptr->comment)) != STRING) > + Error(QUOTE_MSG, "MatchIsTouchscreen"); > + ptr->is_touchscreen.set = > xf86getBoolValue(&ptr->is_touchscreen.val, > + val.str); > + if (!ptr->is_touchscreen.set) > + Error(BOOL_MSG, "MatchIsTouchscreen"); > + break; > + case EOF_TOKEN: > + Error(UNEXPECTED_EOF_MSG, NULL); > + break; > + default: > + Error(INVALID_KEYWORD_MSG, xf86tokenString ()); > + break; > + } > + } > + > + if (!has_ident) > + Error(NO_IDENT_MSG, NULL); > + > +#ifdef DEBUG > + printf("InputClass section parsed\n"); > +#endif > + > + return ptr; > +} > + > +void > +xf86printInputClassSection (FILE * cf, XF86ConfInputClassPtr ptr) > +{ > + while (ptr) { > + fprintf(cf, "Section \"InputClass\"\n"); > + if (ptr->comment) > + fprintf(cf, "%s", ptr->comment); > + if (ptr->identifier) > + fprintf(cf, "\tIdentifier \"%s\"\n", ptr->identifier); > + if (ptr->driver) > + fprintf(cf, "\tDriver \"%s\"\n", ptr->driver); > + if (ptr->match_product) > + fprintf(cf, "\tMatchProduct \"%s\"\n", ptr->match_product); > + if (ptr->match_vendor) > + fprintf(cf, "\tMatchVendor \"%s\"\n", ptr->match_vendor); > + if (ptr->match_device) > + fprintf(cf, "\tMatchDevicePath \"%s\"\n", ptr->match_device); > + if (ptr->is_keyboard.set) > + fprintf(cf, "\tIsKeyboard \"%s\"\n", > + ptr->is_keyboard.val ? "yes" : "no"); > + if (ptr->is_pointer.set) > + fprintf(cf, "\tIsPointer \"%s\"\n", > + ptr->is_pointer.val ? "yes" : "no"); > + if (ptr->is_joystick.set) > + fprintf(cf, "\tIsJoystick \"%s\"\n", > + ptr->is_joystick.val ? "yes" : "no"); > + if (ptr->is_tablet.set) > + fprintf(cf, "\tIsTablet \"%s\"\n", > + ptr->is_tablet.val ? "yes" : "no"); > + if (ptr->is_touchpad.set) > + fprintf(cf, "\tIsTouchpad \"%s\"\n", > + ptr->is_touchpad.val ? "yes" : "no"); > + if (ptr->is_touchscreen.set) > + fprintf(cf, "\tIsTouchscreen \"%s\"\n", > + ptr->is_touchscreen.val ? "yes" : "no"); > + xf86printOptionList(cf, ptr->option_lst, 1); > + fprintf(cf, "EndSection\n\n"); > + ptr = ptr->list.next; > + } > +} > + > +void > +xf86freeInputClassList (XF86ConfInputClassPtr ptr) > +{ > + XF86ConfInputClassPtr prev; > + > + while (ptr) { > + TestFree(ptr->identifier); > + TestFree(ptr->driver); > + TestFree(ptr->match_product); > + TestFree(ptr->match_vendor); > + TestFree(ptr->match_device); > + TestFree(ptr->comment); > + xf86optionListFree(ptr->option_lst); > + > + prev = ptr; > + ptr = ptr->list.next; > + free(prev); > + } > +} > diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am > index b8fab28..49c191f 100644 > --- a/hw/xfree86/parser/Makefile.am > +++ b/hw/xfree86/parser/Makefile.am > @@ -13,6 +13,7 @@ INTERNAL_SOURCES= \ > Files.c \ > Flags.c \ > Input.c \ > + InputClass.c \ > Layout.c \ > Module.c \ > Video.c \ > diff --git a/hw/xfree86/parser/configProcs.h b/hw/xfree86/parser/configProcs.h > index 26ba40e..7d8a8e5 100644 > --- a/hw/xfree86/parser/configProcs.h > +++ b/hw/xfree86/parser/configProcs.h > @@ -48,6 +48,10 @@ XF86ConfInputPtr xf86parseInputSection(void); > void xf86printInputSection(FILE *f, XF86ConfInputPtr ptr); > void xf86freeInputList(XF86ConfInputPtr ptr); > int xf86validateInput (XF86ConfigPtr p); > +/* InputClass.c */ > +XF86ConfInputClassPtr xf86parseInputClassSection(void); > +void xf86printInputClassSection(FILE *f, XF86ConfInputClassPtr ptr); > +void xf86freeInputClassList(XF86ConfInputClassPtr ptr); > /* Layout.c */ > XF86ConfLayoutPtr xf86parseLayoutSection(void); > void xf86printLayoutSection(FILE *cf, XF86ConfLayoutPtr ptr); > diff --git a/hw/xfree86/parser/read.c b/hw/xfree86/parser/read.c > index e965d20..1091be5 100644 > --- a/hw/xfree86/parser/read.c > +++ b/hw/xfree86/parser/read.c > @@ -177,6 +177,14 @@ xf86readConfigFile (void) > HANDLE_LIST (conf_input_lst, > xf86parseInputSection, > XF86ConfInputPtr); > } > + else if (xf86nameCompare(val.str, "inputclass") == 0) > + { > + free(val.str); > + val.str = NULL; > + HANDLE_LIST (conf_inputclass_lst, > + xf86parseInputClassSection, > + XF86ConfInputClassPtr); > + } > else if (xf86nameCompare (val.str, "module") == 0) > { > free(val.str); > diff --git a/hw/xfree86/parser/write.c b/hw/xfree86/parser/write.c > index 3b77b93..083203c 100644 > --- a/hw/xfree86/parser/write.c > +++ b/hw/xfree86/parser/write.c > @@ -117,6 +117,8 @@ doWriteConfigFile (const char *filename, XF86ConfigPtr > cptr) > > xf86printInputSection (cf, cptr->conf_input_lst); > > + xf86printInputClassSection (cf, cptr->conf_inputclass_lst); > + > xf86printVideoAdaptorSection (cf, cptr->conf_videoadaptor_lst); > > xf86printModesSection (cf, cptr->conf_modes_lst); > diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h > index 72beb5f..4e30993 100644 > --- a/hw/xfree86/parser/xf86Parser.h > +++ b/hw/xfree86/parser/xf86Parser.h > @@ -338,6 +338,25 @@ typedef struct > } > xf86TriState; > > +typedef struct > +{ > + GenericListRec list; > + char *identifier; > + char *driver; > + char *match_product; > + char *match_vendor; > + char *match_device; > + xf86TriState is_keyboard; > + xf86TriState is_pointer; > + xf86TriState is_joystick; > + xf86TriState is_tablet; > + xf86TriState is_touchpad; > + xf86TriState is_touchscreen; > + XF86OptionPtr option_lst; > + char *comment; > +} > +XF86ConfInputClassRec, *XF86ConfInputClassPtr; > + > /* Values for adj_where */ > #define CONF_ADJ_OBSOLETE -1 > #define CONF_ADJ_ABSOLUTE 0 > @@ -446,6 +465,7 @@ typedef struct > XF86ConfDevicePtr conf_device_lst; > XF86ConfScreenPtr conf_screen_lst; > XF86ConfInputPtr conf_input_lst; > + XF86ConfInputClassPtr conf_inputclass_lst; > XF86ConfLayoutPtr conf_layout_lst; > XF86ConfVendorPtr conf_vendor_lst; > XF86ConfDRIPtr conf_dri; > diff --git a/hw/xfree86/parser/xf86tokens.h b/hw/xfree86/parser/xf86tokens.h > index 4c1d38c..e3a9d71 100644 > --- a/hw/xfree86/parser/xf86tokens.h > +++ b/hw/xfree86/parser/xf86tokens.h > @@ -273,7 +273,18 @@ typedef enum { > > /* DRI Tokens */ > GROUP, > - BUFFERS > + BUFFERS, > + > + /* InputClass Tokens */ > + MATCH_PRODUCT, > + MATCH_VENDOR, > + MATCH_DEVICE_PATH, > + MATCH_IS_KEYBOARD, > + MATCH_IS_POINTER, > + MATCH_IS_JOYSTICK, > + MATCH_IS_TABLET, > + MATCH_IS_TOUCHPAD, > + MATCH_IS_TOUCHSCREEN > } ParserTokens; > > #endif /* _xf86_tokens_h */ > diff --git a/include/dix-config.h.in b/include/dix-config.h.in > index 1096371..ab04414 100644 > --- a/include/dix-config.h.in > +++ b/include/dix-config.h.in > @@ -231,6 +231,9 @@ > /* Define to 1 if you have the <unistd.h> header file. */ > #undef HAVE_UNISTD_H > > +/* Define to 1 if you have the <fnmatch.h> header file. */ > +#undef HAVE_FNMATCH_H > + > /* Have /dev/urandom */ > #undef HAVE_URANDOM > > -- > 1.6.2.5
Reviewed-by: Peter Hutterer <[email protected]> This set of patches, the xorg.conf.d and Julien's udev patch (and some compile fixes with the changed ABI) I managed to set up a server that didn't have any HAL or udev configuration bits. Nice! Cheers, Peter _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
