From 33a317f48eb3fe888177235ee49b635fbb8cda2f Mon Sep 17 00:00:00 2001 From: marha Date: Mon, 4 Jan 2010 15:34:07 +0000 Subject: Git update 4/1/2010 --- xorg-server/hw/xfree86/parser/Configint.h | 2 + xorg-server/hw/xfree86/parser/Input.c | 7 - xorg-server/hw/xfree86/parser/InputClass.c | 232 ++++++++++++++++++ xorg-server/hw/xfree86/parser/Layout.c | 96 +++++--- xorg-server/hw/xfree86/parser/Makefile.am | 1 + xorg-server/hw/xfree86/parser/configProcs.h | 4 + xorg-server/hw/xfree86/parser/read.c | 8 + xorg-server/hw/xfree86/parser/scan.c | 356 +++++++++++++++++++++------- xorg-server/hw/xfree86/parser/write.c | 2 + xorg-server/hw/xfree86/parser/xf86Parser.h | 47 +++- xorg-server/hw/xfree86/parser/xf86tokens.h | 13 +- 11 files changed, 633 insertions(+), 135 deletions(-) create mode 100644 xorg-server/hw/xfree86/parser/InputClass.c (limited to 'xorg-server/hw/xfree86/parser') diff --git a/xorg-server/hw/xfree86/parser/Configint.h b/xorg-server/hw/xfree86/parser/Configint.h index cdc7be806..03509b397 100644 --- a/xorg-server/hw/xfree86/parser/Configint.h +++ b/xorg-server/hw/xfree86/parser/Configint.h @@ -148,6 +148,8 @@ else\ "The %s keyword requires a number to follow it." #define POSITIVE_INT_MSG \ "The %s keyword requires a positive integer to follow it." +#define BOOL_MSG \ +"The %s keyword requires a boolean to follow it." #define ZAXISMAPPING_MSG \ "The ZAxisMapping keyword requires 2 positive numbers or X or Y to follow it." #define AUTOREPEAT_MSG \ diff --git a/xorg-server/hw/xfree86/parser/Input.c b/xorg-server/hw/xfree86/parser/Input.c index 4e3c04e53..8c8e46fb4 100644 --- a/xorg-server/hw/xfree86/parser/Input.c +++ b/xorg-server/hw/xfree86/parser/Input.c @@ -172,13 +172,6 @@ xf86validateInput (XF86ConfigPtr p) { XF86ConfInputPtr input = p->conf_input_lst; -#if 0 /* Enable this later */ - if (!input) { - xf86validationError ("At least one InputDevice section is required."); - return (FALSE); - } -#endif - while (input) { if (!input->inp_driver) { xf86validationError (UNDEFINED_INPUTDRIVER_MSG, input->inp_identifier); diff --git a/xorg-server/hw/xfree86/parser/InputClass.c b/xorg-server/hw/xfree86/parser/InputClass.c new file mode 100644 index 000000000..1c9816012 --- /dev/null +++ b/xorg-server/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 +#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/xorg-server/hw/xfree86/parser/Layout.c b/xorg-server/hw/xfree86/parser/Layout.c index d548cd210..00c1e7d09 100644 --- a/xorg-server/hw/xfree86/parser/Layout.c +++ b/xorg-server/hw/xfree86/parser/Layout.c @@ -64,6 +64,10 @@ #include "Configint.h" #include + +/* Needed for auto server layout */ +extern int xf86CheckBoolOption(void* optlist, const char *name, int deflt); + extern LexRec val; static xf86ConfigSymTabRec LayoutTab[] = @@ -435,18 +439,58 @@ xf86freeLayoutList (XF86ConfLayoutPtr ptr) } } -#define CheckScreen(str, ptr)\ -if (str[0] != '\0') \ -{ \ -screen = xf86findScreen (str, p->conf_screen_lst); \ -if (!screen) \ -{ \ - xf86validationError (UNDEFINED_SCREEN_MSG, \ - str, layout->lay_identifier); \ - return (FALSE); \ -} \ -else \ - ptr = screen; \ +int +xf86layoutAddInputDevices(XF86ConfigPtr config, XF86ConfLayoutPtr layout) +{ + int count = 0; + XF86ConfInputPtr input = config->conf_input_lst; + XF86ConfInputrefPtr inptr; + + /* add all AutoServerLayout devices to the server layout */ + while (input) + { + if (xf86CheckBoolOption(input->inp_option_lst, "AutoServerLayout", FALSE)) + { + XF86ConfInputrefPtr iref = layout->lay_input_lst; + + /* avoid duplicates if referenced but lists AutoServerLayout too */ + while (iref) + { + if (strcmp(iref->iref_inputdev_str, input->inp_identifier) == 0) + break; + iref = iref->list.next; + } + + if (!iref) + { + XF86ConfInputrefPtr iptr; + iptr = calloc(1, sizeof(XF86ConfInputrefRec)); + iptr->iref_inputdev_str = input->inp_identifier; + layout->lay_input_lst = (XF86ConfInputrefPtr) + xf86addListItem((glp)layout->lay_input_lst, (glp)iptr); + count++; + } + } + input = input->list.next; + } + + inptr = layout->lay_input_lst; + while (inptr) + { + input = xf86findInput (inptr->iref_inputdev_str, + config->conf_input_lst); + if (!input) + { + xf86validationError (UNDEFINED_INPUT_MSG, + inptr->iref_inputdev_str, layout->lay_identifier); + return -1; + } + else + inptr->iref_inputdev = input; + inptr = inptr->list.next; + } + + return count; } int @@ -455,10 +499,8 @@ xf86validateLayout (XF86ConfigPtr p) XF86ConfLayoutPtr layout = p->conf_layout_lst; XF86ConfAdjacencyPtr adj; XF86ConfInactivePtr iptr; - XF86ConfInputrefPtr inptr; XF86ConfScreenPtr screen; XF86ConfDevicePtr device; - XF86ConfInputPtr input; while (layout) { @@ -476,13 +518,6 @@ xf86validateLayout (XF86ConfigPtr p) else adj->adj_screen = screen; -#if 0 - CheckScreen (adj->adj_top_str, adj->adj_top); - CheckScreen (adj->adj_bottom_str, adj->adj_bottom); - CheckScreen (adj->adj_left_str, adj->adj_left); - CheckScreen (adj->adj_right_str, adj->adj_right); -#endif - adj = adj->list.next; } iptr = layout->lay_inactive_lst; @@ -500,21 +535,10 @@ xf86validateLayout (XF86ConfigPtr p) iptr->inactive_device = device; iptr = iptr->list.next; } - inptr = layout->lay_input_lst; - while (inptr) - { - input = xf86findInput (inptr->iref_inputdev_str, - p->conf_input_lst); - if (!input) - { - xf86validationError (UNDEFINED_INPUT_MSG, - inptr->iref_inputdev_str, layout->lay_identifier); - return (FALSE); - } - else - inptr->iref_inputdev = input; - inptr = inptr->list.next; - } + + if (xf86layoutAddInputDevices(p, layout) == -1) + return FALSE; + layout = layout->list.next; } return (TRUE); diff --git a/xorg-server/hw/xfree86/parser/Makefile.am b/xorg-server/hw/xfree86/parser/Makefile.am index b8fab2835..49c191f2a 100644 --- a/xorg-server/hw/xfree86/parser/Makefile.am +++ b/xorg-server/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/xorg-server/hw/xfree86/parser/configProcs.h b/xorg-server/hw/xfree86/parser/configProcs.h index 26ba40ebb..7d8a8e53a 100644 --- a/xorg-server/hw/xfree86/parser/configProcs.h +++ b/xorg-server/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/xorg-server/hw/xfree86/parser/read.c b/xorg-server/hw/xfree86/parser/read.c index e965d209e..1091be5e5 100644 --- a/xorg-server/hw/xfree86/parser/read.c +++ b/xorg-server/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/xorg-server/hw/xfree86/parser/scan.c b/xorg-server/hw/xfree86/parser/scan.c index d2e8b6d2b..b80fbfb8f 100644 --- a/xorg-server/hw/xfree86/parser/scan.c +++ b/xorg-server/hw/xfree86/parser/scan.c @@ -62,8 +62,11 @@ #include #include #include +#include +#include #include #include +#include #include #if defined(_POSIX_SOURCE) @@ -90,17 +93,24 @@ #include "xf86tokens.h" #define CONFIG_BUF_LEN 1024 +#define CONFIG_MAX_FILES 64 static int StringToToken (char *, xf86ConfigSymTabRec *); -static FILE *configFile = NULL; +static struct { + FILE *file; + char *path; +} configFiles[CONFIG_MAX_FILES]; static const char **builtinConfig = NULL; static int builtinIndex = 0; static int configPos = 0; /* current readers position */ static int configLineNo = 0; /* linenumber */ static char *configBuf, *configRBuf; /* buffer for lines */ static char *configPath; /* path to config file */ +static char *configDirPath; /* path to config dir */ static char *configSection = NULL; /* name of current section being parsed */ +static int numFiles = 0; /* number of config files */ +static int curFileIndex = 0; /* index of current config file */ static int pushToken = LOCK_TOKEN; static int eol_seen = 0; /* private state to handle comments */ LexRec val; @@ -155,7 +165,7 @@ xf86strToUL (char *str) /* * xf86getNextLine -- * - * read from the configFile FILE stream until we encounter a new + * read from the configFiles FILE stream until we encounter a new * line; this is effectively just a big wrapper for fgets(3). * * xf86getToken() assumes that we will read up to the next @@ -213,9 +223,18 @@ xf86getNextLine(void) /* read in another block of chars */ do { - ret = fgets(configBuf + pos, configBufLen - pos - 1, configFile); + ret = fgets(configBuf + pos, configBufLen - pos - 1, + configFiles[curFileIndex].file); - if (!ret) break; + if (!ret) { + /* stop if there are no more files */ + if (++curFileIndex >= numFiles) { + curFileIndex = 0; + break; + } + configLineNo = 0; + continue; + } /* search for EOL in the new block of chars */ @@ -306,7 +325,7 @@ again: if (!c) { char *ret; - if (configFile) + if (numFiles > 0) ret = xf86getNextLine(); else { if (builtinConfig[builtinIndex] == NULL) @@ -575,6 +594,12 @@ xf86pathIsSafe(const char *path) #ifndef XCONFIGFILE #define XCONFIGFILE "xorg.conf" #endif +#ifndef XCONFIGDIR +#define XCONFIGDIR "xorg.conf.d" +#endif +#ifndef XCONFIGSUFFIX +#define XCONFIGSUFFIX ".conf" +#endif #ifndef PROJECTROOT #define PROJECTROOT "/usr/X11R6" #endif @@ -616,7 +641,8 @@ xf86pathIsSafe(const char *path) static char * DoSubstitution(const char *template, const char *cmdline, const char *projroot, - int *cmdlineUsed, int *envUsed, char *XConfigFile) + int *cmdlineUsed, int *envUsed, + const char *XConfigFile) { char *result; int i, l; @@ -745,7 +771,164 @@ DoSubstitution(const char *template, const char *cmdline, const char *projroot, return result; } -/* +/* + * Given some searching parameters, locate and open the xorg config file. + */ +static char * +OpenConfigFile(const char *path, const char *cmdline, const char *projroot, + const char *confname) +{ + char *filepath = NULL; + char *pathcopy; + const char *template; + int cmdlineUsed = 0; + FILE *file = NULL; + + pathcopy = strdup(path); + for (template = strtok(pathcopy, ","); template && !file; + template = strtok(NULL, ",")) { + filepath = DoSubstitution(template, cmdline, projroot, + &cmdlineUsed, NULL, confname); + if (!filepath) + continue; + if (cmdline && !cmdlineUsed) { + free(filepath); + filepath = NULL; + continue; + } + file = fopen(filepath, "r"); + if (!file) { + free(filepath); + filepath = NULL; + } + } + + if (file) { + configFiles[numFiles].file = file; + configFiles[numFiles].path = strdup(filepath); + numFiles++; + } + return filepath; +} + +/* + * Match non-hidden files in the xorg config directory with a .conf + * suffix. This filter is passed to scandir(3). + */ +static int +ConfigFilter(const struct dirent *de) +{ + const char *name = de->d_name; + size_t len = strlen(name); + size_t suflen = strlen(XCONFIGSUFFIX); + + if (!name || name[0] == '.' || len <= suflen) + return 0; + if (strcmp(&name[len-suflen], XCONFIGSUFFIX) != 0) + return 0; + return 1; +} + +static Bool +AddConfigDirFiles(const char *dirpath, struct dirent **list, int num) +{ + int i; + Bool openedFile = FALSE; + Bool warnOnce = FALSE; + + for (i = 0; i < num; i++) { + char *path; + FILE *file; + + if (numFiles >= CONFIG_MAX_FILES) { + if (!warnOnce) { + ErrorF("Maximum number of configuration " + "files opened\n"); + warnOnce = TRUE; + } + free(list[i]); + continue; + } + + path = malloc(PATH_MAX + 1); + snprintf(path, PATH_MAX + 1, "%s/%s", dirpath, + list[i]->d_name); + free(list[i]); + file = fopen(path, "r"); + if (!file) { + free(path); + continue; + } + openedFile = TRUE; + + configFiles[numFiles].file = file; + configFiles[numFiles].path = path; + numFiles++; + } + + return openedFile; +} + +/* + * Given some searching parameters, locate and open the xorg config + * directory. The directory does not need to contain config files. + */ +static char * +OpenConfigDir(const char *path, const char *cmdline, const char *projroot, + const char *confname) +{ + char *dirpath, *pathcopy; + const char *template; + Bool found = FALSE; + int cmdlineUsed = 0; + + pathcopy = strdup(path); + for (template = strtok(pathcopy, ","); template && !found; + template = strtok(NULL, ",")) { + struct dirent **list = NULL; + int num; + + dirpath = DoSubstitution(template, cmdline, projroot, + &cmdlineUsed, NULL, confname); + if (!dirpath) + continue; + if (cmdline && !cmdlineUsed) { + free(dirpath); + dirpath = NULL; + continue; + } + + /* match files named *.conf */ + num = scandir(dirpath, &list, ConfigFilter, alphasort); + found = AddConfigDirFiles(dirpath, list, num); + if (!found) { + free(dirpath); + dirpath = NULL; + if (list) + free(list); + } + } + + return dirpath; +} + +/* + * xf86initConfigFiles -- Setup global variables and buffers. + */ +void +xf86initConfigFiles(void) +{ + curFileIndex = 0; + configPos = 0; + configLineNo = 0; + pushToken = LOCK_TOKEN; + + configBuf = malloc(CONFIG_BUF_LEN); + configRBuf = malloc(CONFIG_BUF_LEN); + configBuf[0] = '\0'; /* sanity ... */ +} + +/* * xf86openConfigFile -- * * This function take a config file search path (optional), a command-line @@ -758,7 +941,7 @@ DoSubstitution(const char *template, const char *cmdline, const char *projroot, * opened. When no file is found, the return value is NULL. * * The escape sequences allowed in the search path are defined above. - * + * */ #ifndef DEFAULT_CONF_PATH @@ -780,117 +963,90 @@ DoSubstitution(const char *template, const char *cmdline, const char *projroot, const char * xf86openConfigFile(const char *path, const char *cmdline, const char *projroot) { - char *pathcopy; - const char *template; - int cmdlineUsed = 0; - - configFile = NULL; - configPos = 0; /* current readers position */ - configLineNo = 0; /* linenumber */ - pushToken = LOCK_TOKEN; - if (!path || !path[0]) path = DEFAULT_CONF_PATH; - pathcopy = malloc(strlen(path) + 1); - strcpy(pathcopy, path); if (!projroot || !projroot[0]) projroot = PROJECTROOT; - template = strtok(pathcopy, ","); - - /* First, search for a config file. */ - while (template && !configFile) { - if ((configPath = DoSubstitution(template, cmdline, projroot, - &cmdlineUsed, NULL, - XCONFIGFILE))) { - if ((configFile = fopen(configPath, "r")) != 0) { - if (cmdline && !cmdlineUsed) { - fclose(configFile); - configFile = NULL; - } - } - } - if (configPath && !configFile) { - free(configPath); - configPath = NULL; - } - template = strtok(NULL, ","); - } - - /* Then search for fallback */ - if (!configFile) { - strcpy(pathcopy, path); - template = strtok(pathcopy, ","); - - while (template && !configFile) { - if ((configPath = DoSubstitution(template, cmdline, projroot, - &cmdlineUsed, NULL, - XFREE86CFGFILE))) { - if ((configFile = fopen(configPath, "r")) != 0) { - if (cmdline && !cmdlineUsed) { - fclose(configFile); - configFile = NULL; - } - } - } - if (configPath && !configFile) { - free(configPath); - configPath = NULL; - } - template = strtok(NULL, ","); - } - } - - free(pathcopy); - if (!configFile) { - - return NULL; - } + /* Search for a config file or a fallback */ + configPath = OpenConfigFile(path, cmdline, projroot, XCONFIGFILE); + if (!configPath) + configPath = OpenConfigFile(path, cmdline, projroot, + XFREE86CFGFILE); + return configPath; +} - configBuf = malloc (CONFIG_BUF_LEN); - configRBuf = malloc (CONFIG_BUF_LEN); - configBuf[0] = '\0'; /* sanity ... */ +/* + * xf86openConfigDirFiles -- + * + * This function take a config directory search path (optional), a + * command-line specified directory name (optional) and the ProjectRoot path + * (optional) and locates and opens a config directory based on that + * information. If a command-line name is specified, then this function + * fails if it is not found. + * + * The return value is a pointer to the actual name of the direcoty that was + * opened. When no directory is found, the return value is NULL. + * + * The escape sequences allowed in the search path are defined above. + * + */ +const char * +xf86openConfigDirFiles(const char *path, const char *cmdline, + const char *projroot) +{ + if (!path || !path[0]) + path = DEFAULT_CONF_PATH; + if (!projroot || !projroot[0]) + projroot = PROJECTROOT; - return configPath; + /* Search for the multiconf directory */ + configDirPath = OpenConfigDir(path, cmdline, projroot, XCONFIGDIR); + return configDirPath; } void xf86closeConfigFile (void) { + int i; + free (configPath); configPath = NULL; + free (configDirPath); + configDirPath = NULL; free (configRBuf); configRBuf = NULL; free (configBuf); configBuf = NULL; - if (configFile) { - fclose (configFile); - configFile = NULL; - } else { + if (numFiles == 0) { builtinConfig = NULL; builtinIndex = 0; } + for (i = 0; i < numFiles; i++) { + fclose(configFiles[i].file); + configFiles[i].file = NULL; + free(configFiles[i].path); + configFiles[i].path = NULL; + } + numFiles = 0; } void xf86setBuiltinConfig(const char *config[]) { builtinConfig = config; - configPath = strdup(""); - configBuf = malloc (CONFIG_BUF_LEN); - configRBuf = malloc (CONFIG_BUF_LEN); - configBuf[0] = '\0'; /* sanity ... */ - } void xf86parseError (char *format,...) { va_list ap; + char *filename = numFiles ? configFiles[curFileIndex].path : + ""; ErrorF ("Parse error on line %d of section %s in file %s\n\t", - configLineNo, configSection, configPath); + configLineNo, configSection, filename); va_start (ap, format); VErrorF (format, ap); va_end (ap); @@ -902,8 +1058,10 @@ void xf86validationError (char *format,...) { va_list ap; + char *filename = numFiles ? configFiles[curFileIndex].path : + ""; - ErrorF ("Data incomplete in file %s\n\t", configPath); + ErrorF ("Data incomplete in file %s\n\t", filename); va_start (ap, format); VErrorF (format, ap); va_end (ap); @@ -1028,3 +1186,33 @@ xf86addComment(char *cur, char *add) return (cur); } + +Bool +xf86getBoolValue(Bool *val, const char *str) +{ + if (!val || !str) + return FALSE; + if (*str == '\0') { + *val = TRUE; + } else { + if (strcmp(str, "1") == 0) + *val = TRUE; + else if (strcmp(str, "on") == 0) + *val = TRUE; + else if (strcmp(str, "true") == 0) + *val = TRUE; + else if (strcmp(str, "yes") == 0) + *val = TRUE; + else if (strcmp(str, "0") == 0) + *val = FALSE; + else if (strcmp(str, "off") == 0) + *val = FALSE; + else if (strcmp(str, "false") == 0) + *val = FALSE; + else if (strcmp(str, "no") == 0) + *val = FALSE; + else + return FALSE; + } + return TRUE; +} diff --git a/xorg-server/hw/xfree86/parser/write.c b/xorg-server/hw/xfree86/parser/write.c index 3b77b9314..083203c05 100644 --- a/xorg-server/hw/xfree86/parser/write.c +++ b/xorg-server/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/xorg-server/hw/xfree86/parser/xf86Parser.h b/xorg-server/hw/xfree86/parser/xf86Parser.h index 603080066..5e8351fc4 100644 --- a/xorg-server/hw/xfree86/parser/xf86Parser.h +++ b/xorg-server/hw/xfree86/parser/xf86Parser.h @@ -64,6 +64,7 @@ #ifndef _xf86Parser_h_ #define _xf86Parser_h_ +#include #include "xf86Optrec.h" #define HAVE_PARSER_DECLS @@ -330,6 +331,32 @@ typedef struct } XF86ConfInputrefRec, *XF86ConfInputrefPtr; +typedef struct +{ + Bool set; + Bool val; +} +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 @@ -438,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; @@ -456,13 +484,16 @@ xf86ConfigSymTabRec, *xf86ConfigSymTabPtr; /* * prototypes for public functions */ -extern _X_EXPORT const char *xf86openConfigFile (const char *, const char *, - const char *); -extern _X_EXPORT void xf86setBuiltinConfig(const char *config[]); -extern _X_EXPORT XF86ConfigPtr xf86readConfigFile (void); -extern _X_EXPORT void xf86closeConfigFile (void); -extern _X_EXPORT void xf86freeConfig (XF86ConfigPtr p); -extern _X_EXPORT int xf86writeConfigFile (const char *, XF86ConfigPtr); +extern void xf86initConfigFiles(void); +extern const char *xf86openConfigFile(const char *path, const char *cmdline, + const char *projroot); +extern const char *xf86openConfigDirFiles(const char *path, const char *cmdline, + const char *projroot); +extern void xf86setBuiltinConfig(const char *config[]); +extern XF86ConfigPtr xf86readConfigFile(void); +extern void xf86closeConfigFile(void); +extern void xf86freeConfig(XF86ConfigPtr p); +extern int xf86writeConfigFile(const char *, XF86ConfigPtr); extern _X_EXPORT XF86ConfDevicePtr xf86findDevice(const char *ident, XF86ConfDevicePtr p); extern _X_EXPORT XF86ConfLayoutPtr xf86findLayout(const char *name, XF86ConfLayoutPtr list); extern _X_EXPORT XF86ConfMonitorPtr xf86findMonitor(const char *ident, XF86ConfMonitorPtr p); @@ -473,6 +504,7 @@ extern _X_EXPORT XF86ConfInputPtr xf86findInput(const char *ident, XF86ConfInput extern _X_EXPORT XF86ConfInputPtr xf86findInputByDriver(const char *driver, XF86ConfInputPtr p); extern _X_EXPORT XF86ConfVideoAdaptorPtr xf86findVideoAdaptor(const char *ident, XF86ConfVideoAdaptorPtr p); +extern int xf86layoutAddInputDevices(XF86ConfigPtr config, XF86ConfLayoutPtr layout); extern _X_EXPORT GenericListPtr xf86addListItem(GenericListPtr head, GenericListPtr c_new); extern _X_EXPORT int xf86itemNotSublist(GenericListPtr list_1, GenericListPtr list_2); @@ -480,5 +512,6 @@ extern _X_EXPORT int xf86itemNotSublist(GenericListPtr list_1, GenericListPtr li extern _X_EXPORT int xf86pathIsAbsolute(const char *path); extern _X_EXPORT int xf86pathIsSafe(const char *path); extern _X_EXPORT char *xf86addComment(char *cur, char *add); +extern _X_EXPORT Bool xf86getBoolValue(Bool *val, const char *str); #endif /* _xf86Parser_h_ */ diff --git a/xorg-server/hw/xfree86/parser/xf86tokens.h b/xorg-server/hw/xfree86/parser/xf86tokens.h index 4c1d38c03..e3a9d716b 100644 --- a/xorg-server/hw/xfree86/parser/xf86tokens.h +++ b/xorg-server/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 */ -- cgit v1.2.3