[PATCH v4 3/3] xfree86: Introduce InputClass configuration
Peter Hutterer
peter.hutterer at who-t.net
Wed Dec 23 02:18:16 PST 2009
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 <dbn.lists at gmail.com>
> ---
> 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 <peter.hutterer at who-t.net>
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
More information about the xorg-devel
mailing list