1706f2543Smrg/* 2706f2543Smrg *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved. 3706f2543Smrg * 4706f2543Smrg *Permission is hereby granted, free of charge, to any person obtaining 5706f2543Smrg * a copy of this software and associated documentation files (the 6706f2543Smrg *"Software"), to deal in the Software without restriction, including 7706f2543Smrg *without limitation the rights to use, copy, modify, merge, publish, 8706f2543Smrg *distribute, sublicense, and/or sell copies of the Software, and to 9706f2543Smrg *permit persons to whom the Software is furnished to do so, subject to 10706f2543Smrg *the following conditions: 11706f2543Smrg * 12706f2543Smrg *The above copyright notice and this permission notice shall be 13706f2543Smrg *included in all copies or substantial portions of the Software. 14706f2543Smrg * 15706f2543Smrg *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16706f2543Smrg *EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17706f2543Smrg *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18706f2543Smrg *NONINFRINGEMENT. IN NO EVENT SHALL THE XFREE86 PROJECT BE LIABLE FOR 19706f2543Smrg *ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 20706f2543Smrg *CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21706f2543Smrg *WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22706f2543Smrg * 23706f2543Smrg *Except as contained in this notice, the name of the XFree86 Project 24706f2543Smrg *shall not be used in advertising or otherwise to promote the sale, use 25706f2543Smrg *or other dealings in this Software without prior written authorization 26706f2543Smrg *from the XFree86 Project. 27706f2543Smrg * 28706f2543Smrg * Authors: Alexander Gottwald 29706f2543Smrg */ 30706f2543Smrg 31706f2543Smrg#ifdef HAVE_XWIN_CONFIG_H 32706f2543Smrg#include <xwin-config.h> 33706f2543Smrg#endif 34706f2543Smrg#include "win.h" 35706f2543Smrg#include "winconfig.h" 36706f2543Smrg#include "winmsg.h" 37706f2543Smrg#include "globals.h" 38706f2543Smrg 39706f2543Smrg#include "xkbsrv.h" 40706f2543Smrg 41706f2543Smrg#ifdef XWIN_XF86CONFIG 42706f2543Smrg#ifndef CONFIGPATH 43706f2543Smrg#define CONFIGPATH "%A," "%R," \ 44706f2543Smrg "/etc/X11/%R," "%P/etc/X11/%R," \ 45706f2543Smrg "%E," "%F," \ 46706f2543Smrg "/etc/X11/%F," "%P/etc/X11/%F," \ 47706f2543Smrg "/etc/X11/%X-%M," "/etc/X11/%X," "/etc/%X," \ 48706f2543Smrg "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ 49706f2543Smrg "%P/etc/X11/%X," \ 50706f2543Smrg "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ 51706f2543Smrg "%P/lib/X11/%X" 52706f2543Smrg#endif 53706f2543Smrg#ifndef CONFIGDIRPATH 54706f2543Smrg#define CONFIGDIRPATH "/etc/X11/%X-%M," "/etc/X11/%X," "/etc/%X," \ 55706f2543Smrg "%P/etc/X11/%X.%H," "%P/etc/X11/%X-%M," \ 56706f2543Smrg "%P/etc/X11/%X," \ 57706f2543Smrg "%P/lib/X11/%X.%H," "%P/lib/X11/%X-%M," \ 58706f2543Smrg "%P/lib/X11/%X" 59706f2543Smrg#endif 60706f2543Smrg 61706f2543SmrgXF86ConfigPtr g_xf86configptr = NULL; 62706f2543Smrg#endif 63706f2543Smrg 64706f2543SmrgWinCmdlineRec g_cmdline = { 65706f2543Smrg#ifdef XWIN_XF86CONFIG 66706f2543Smrg NULL, /* configFile */ 67706f2543Smrg NULL, /* configDir */ 68706f2543Smrg#endif 69706f2543Smrg NULL, /* fontPath */ 70706f2543Smrg#ifdef XWIN_XF86CONFIG 71706f2543Smrg NULL, /* keyboard */ 72706f2543Smrg#endif 73706f2543Smrg NULL, /* xkbRules */ 74706f2543Smrg NULL, /* xkbModel */ 75706f2543Smrg NULL, /* xkbLayout */ 76706f2543Smrg NULL, /* xkbVariant */ 77706f2543Smrg NULL, /* xkbOptions */ 78706f2543Smrg NULL, /* screenname */ 79706f2543Smrg NULL, /* mousename */ 80706f2543Smrg FALSE, /* emulate3Buttons */ 81706f2543Smrg 0 /* emulate3Timeout */ 82706f2543Smrg}; 83706f2543Smrg 84706f2543SmrgwinInfoRec g_winInfo = { 85706f2543Smrg { /* keyboard */ 86706f2543Smrg 0, /* leds */ 87706f2543Smrg 500, /* delay */ 88706f2543Smrg 30 /* rate */ 89706f2543Smrg } 90706f2543Smrg , 91706f2543Smrg { /* xkb */ 92706f2543Smrg NULL, /* rules */ 93706f2543Smrg NULL, /* model */ 94706f2543Smrg NULL, /* layout */ 95706f2543Smrg NULL, /* variant */ 96706f2543Smrg NULL, /* options */ 97706f2543Smrg } 98706f2543Smrg , 99706f2543Smrg { 100706f2543Smrg FALSE, 101706f2543Smrg 50} 102706f2543Smrg}; 103706f2543Smrg 104706f2543Smrg#define NULL_IF_EMPTY(x) (winNameCompare(x,"")?x:NULL) 105706f2543Smrg 106706f2543Smrg#ifdef XWIN_XF86CONFIG 107706f2543SmrgserverLayoutRec g_winConfigLayout; 108706f2543Smrg 109706f2543Smrgstatic Bool ParseOptionValue (int scrnIndex, pointer options, 110706f2543Smrg OptionInfoPtr p); 111706f2543Smrgstatic Bool configLayout (serverLayoutPtr, XF86ConfLayoutPtr, char *); 112706f2543Smrgstatic Bool configImpliedLayout (serverLayoutPtr, XF86ConfScreenPtr); 113706f2543Smrgstatic Bool GetBoolValue (OptionInfoPtr p, const char *s); 114706f2543Smrg 115706f2543Smrg 116706f2543SmrgBool 117706f2543SmrgwinReadConfigfile () 118706f2543Smrg{ 119706f2543Smrg Bool retval = TRUE; 120706f2543Smrg const char *filename, *dirname; 121706f2543Smrg MessageType filefrom = X_DEFAULT; 122706f2543Smrg MessageType dirfrom = X_DEFAULT; 123706f2543Smrg char *xf86ConfigFile = NULL; 124706f2543Smrg char *xf86ConfigDir = NULL; 125706f2543Smrg 126706f2543Smrg if (g_cmdline.configFile) 127706f2543Smrg { 128706f2543Smrg filefrom = X_CMDLINE; 129706f2543Smrg xf86ConfigFile = g_cmdline.configFile; 130706f2543Smrg } 131706f2543Smrg if (g_cmdline.configDir) 132706f2543Smrg { 133706f2543Smrg dirfrom = X_CMDLINE; 134706f2543Smrg xf86ConfigDir = g_cmdline.configDir; 135706f2543Smrg } 136706f2543Smrg 137706f2543Smrg /* Parse config file into data structure */ 138706f2543Smrg xf86initConfigFiles(); 139706f2543Smrg dirname = xf86openConfigDirFiles (CONFIGDIRPATH, xf86ConfigDir, PROJECTROOT); 140706f2543Smrg filename = xf86openConfigFile (CONFIGPATH, xf86ConfigFile, PROJECTROOT); 141706f2543Smrg 142706f2543Smrg /* Hack for backward compatibility */ 143706f2543Smrg if (!filename && from == X_DEFAULT) 144706f2543Smrg filename = xf86openConfigFile (CONFIGPATH, "XF86Config", PROJECTROOT); 145706f2543Smrg 146706f2543Smrg if (filename) 147706f2543Smrg { 148706f2543Smrg winMsg (from, "Using config file: \"%s\"\n", filename); 149706f2543Smrg } 150706f2543Smrg else 151706f2543Smrg { 152706f2543Smrg winMsg (X_ERROR, "Unable to locate/open config file"); 153706f2543Smrg if (xf86ConfigFile) 154706f2543Smrg ErrorF (": \"%s\"", xf86ConfigFile); 155706f2543Smrg ErrorF ("\n"); 156706f2543Smrg } 157706f2543Smrg if (dirname) 158706f2543Smrg { 159706f2543Smrg winMsg (from, "Using config directory: \"%s\"\n", dirname); 160706f2543Smrg } 161706f2543Smrg else 162706f2543Smrg { 163706f2543Smrg winMsg (X_ERROR, "Unable to locate/open config directory"); 164706f2543Smrg if (xf86ConfigDir) 165706f2543Smrg ErrorF (": \"%s\"", xf86ConfigDir); 166706f2543Smrg ErrorF ("\n"); 167706f2543Smrg } 168706f2543Smrg if (!filename && !dirname) 169706f2543Smrg { 170706f2543Smrg return FALSE; 171706f2543Smrg } 172706f2543Smrg if ((g_xf86configptr = xf86readConfigFile ()) == NULL) 173706f2543Smrg { 174706f2543Smrg winMsg (X_ERROR, "Problem parsing the config file\n"); 175706f2543Smrg return FALSE; 176706f2543Smrg } 177706f2543Smrg xf86closeConfigFile (); 178706f2543Smrg 179706f2543Smrg LogPrintMarkers(); 180706f2543Smrg 181706f2543Smrg /* set options from data structure */ 182706f2543Smrg 183706f2543Smrg if (g_xf86configptr->conf_layout_lst == NULL || g_cmdline.screenname != NULL) 184706f2543Smrg { 185706f2543Smrg if (g_cmdline.screenname == NULL) 186706f2543Smrg { 187706f2543Smrg winMsg (X_WARNING, 188706f2543Smrg "No Layout section. Using the first Screen section.\n"); 189706f2543Smrg } 190706f2543Smrg if (!configImpliedLayout (&g_winConfigLayout, 191706f2543Smrg g_xf86configptr->conf_screen_lst)) 192706f2543Smrg { 193706f2543Smrg winMsg (X_ERROR, "Unable to determine the screen layout\n"); 194706f2543Smrg return FALSE; 195706f2543Smrg } 196706f2543Smrg } 197706f2543Smrg else 198706f2543Smrg { 199706f2543Smrg /* Check if layout is given in the config file */ 200706f2543Smrg if (g_xf86configptr->conf_flags != NULL) 201706f2543Smrg { 202706f2543Smrg char *dfltlayout = NULL; 203706f2543Smrg pointer optlist = g_xf86configptr->conf_flags->flg_option_lst; 204706f2543Smrg 205706f2543Smrg if (optlist && winFindOption (optlist, "defaultserverlayout")) 206706f2543Smrg dfltlayout = 207706f2543Smrg winSetStrOption (optlist, "defaultserverlayout", NULL); 208706f2543Smrg 209706f2543Smrg if (!configLayout (&g_winConfigLayout, 210706f2543Smrg g_xf86configptr->conf_layout_lst, 211706f2543Smrg dfltlayout)) 212706f2543Smrg { 213706f2543Smrg winMsg (X_ERROR, "Unable to determine the screen layout\n"); 214706f2543Smrg return FALSE; 215706f2543Smrg } 216706f2543Smrg } 217706f2543Smrg else 218706f2543Smrg { 219706f2543Smrg if (!configLayout (&g_winConfigLayout, 220706f2543Smrg g_xf86configptr->conf_layout_lst, 221706f2543Smrg NULL)) 222706f2543Smrg { 223706f2543Smrg winMsg (X_ERROR, "Unable to determine the screen layout\n"); 224706f2543Smrg return FALSE; 225706f2543Smrg } 226706f2543Smrg } 227706f2543Smrg } 228706f2543Smrg 229706f2543Smrg /* setup special config files */ 230706f2543Smrg winConfigFiles (); 231706f2543Smrg return retval; 232706f2543Smrg} 233706f2543Smrg#endif 234706f2543Smrg 235706f2543Smrg/* load layout definitions */ 236706f2543Smrg#include "winlayouts.h" 237706f2543Smrg 238706f2543Smrg/* Set the keyboard configuration */ 239706f2543SmrgBool 240706f2543SmrgwinConfigKeyboard (DeviceIntPtr pDevice) 241706f2543Smrg{ 242706f2543Smrg char layoutName[KL_NAMELENGTH]; 243706f2543Smrg unsigned char layoutFriendlyName[256]; 244706f2543Smrg static unsigned int layoutNum = 0; 245706f2543Smrg int keyboardType; 246706f2543Smrg#ifdef XWIN_XF86CONFIG 247706f2543Smrg XF86ConfInputPtr kbd = NULL; 248706f2543Smrg XF86ConfInputPtr input_list = NULL; 249706f2543Smrg MessageType kbdfrom = X_CONFIG; 250706f2543Smrg#endif 251706f2543Smrg MessageType from = X_DEFAULT; 252706f2543Smrg char *s = NULL; 253706f2543Smrg 254706f2543Smrg /* Setup defaults */ 255706f2543Smrg XkbGetRulesDflts(&g_winInfo.xkb); 256706f2543Smrg 257706f2543Smrg /* 258706f2543Smrg * Query the windows autorepeat settings and change the xserver defaults. 259706f2543Smrg */ 260706f2543Smrg { 261706f2543Smrg int kbd_delay; 262706f2543Smrg DWORD kbd_speed; 263706f2543Smrg if (SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &kbd_delay, 0) && 264706f2543Smrg SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &kbd_speed, 0)) 265706f2543Smrg { 266706f2543Smrg switch (kbd_delay) 267706f2543Smrg { 268706f2543Smrg case 0: g_winInfo.keyboard.delay = 250; break; 269706f2543Smrg case 1: g_winInfo.keyboard.delay = 500; break; 270706f2543Smrg case 2: g_winInfo.keyboard.delay = 750; break; 271706f2543Smrg default: 272706f2543Smrg case 3: g_winInfo.keyboard.delay = 1000; break; 273706f2543Smrg } 274706f2543Smrg g_winInfo.keyboard.rate = (kbd_speed>0)?kbd_speed:1; 275706f2543Smrg winMsgVerb(X_PROBED, 1, "Setting autorepeat to delay=%d, rate=%d\n", 276706f2543Smrg g_winInfo.keyboard.delay, g_winInfo.keyboard.rate); 277706f2543Smrg } 278706f2543Smrg } 279706f2543Smrg 280706f2543Smrg 281706f2543Smrg keyboardType = GetKeyboardType (0); 282706f2543Smrg if (keyboardType > 0 && GetKeyboardLayoutName (layoutName)) 283706f2543Smrg { 284706f2543Smrg WinKBLayoutPtr pLayout; 285706f2543Smrg Bool bfound = FALSE; 286706f2543Smrg 287706f2543Smrg if (! layoutNum) 288706f2543Smrg layoutNum = strtoul (layoutName, (char **)NULL, 16); 289706f2543Smrg if ((layoutNum & 0xffff) == 0x411) { 290706f2543Smrg /* The japanese layouts know a lot of different IMEs which all have 291706f2543Smrg different layout numbers set. Map them to a single entry. 292706f2543Smrg Same might apply for chinese, korean and other symbol languages 293706f2543Smrg too */ 294706f2543Smrg layoutNum = (layoutNum & 0xffff); 295706f2543Smrg if (keyboardType == 7) 296706f2543Smrg { 297706f2543Smrg /* Japanese layouts have problems with key event messages 298706f2543Smrg such as the lack of WM_KEYUP for Caps Lock key. 299706f2543Smrg Loading US layout fixes this problem. */ 300706f2543Smrg if (LoadKeyboardLayout("00000409", KLF_ACTIVATE) != NULL) 301706f2543Smrg winMsg (X_INFO, "Loading US keyboard layout.\n"); 302706f2543Smrg else 303706f2543Smrg winMsg (X_ERROR, "LoadKeyboardLayout failed.\n"); 304706f2543Smrg } 305706f2543Smrg } 306706f2543Smrg 307706f2543Smrg /* Discover the friendly name of the current layout */ 308706f2543Smrg { 309706f2543Smrg HKEY regkey = NULL; 310706f2543Smrg const char regtempl[] = "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\"; 311706f2543Smrg char *regpath; 312706f2543Smrg DWORD namesize = sizeof(layoutFriendlyName); 313706f2543Smrg 314706f2543Smrg regpath = malloc(sizeof(regtempl) + KL_NAMELENGTH + 1); 315706f2543Smrg strcpy(regpath, regtempl); 316706f2543Smrg strcat(regpath, layoutName); 317706f2543Smrg 318706f2543Smrg if (!RegOpenKey(HKEY_LOCAL_MACHINE, regpath, ®key)) 319706f2543Smrg RegQueryValueEx(regkey, "Layout Text", 0, NULL, layoutFriendlyName, &namesize); 320706f2543Smrg 321706f2543Smrg /* Close registry key */ 322706f2543Smrg if (regkey) 323706f2543Smrg RegCloseKey (regkey); 324706f2543Smrg free(regpath); 325706f2543Smrg } 326706f2543Smrg 327706f2543Smrg winMsg (X_PROBED, "Windows keyboard layout: \"%s\" (%08x) \"%s\", type %d\n", 328706f2543Smrg layoutName, layoutNum, layoutFriendlyName, keyboardType); 329706f2543Smrg 330706f2543Smrg for (pLayout = winKBLayouts; pLayout->winlayout != -1; pLayout++) 331706f2543Smrg { 332706f2543Smrg if (pLayout->winlayout != layoutNum) 333706f2543Smrg continue; 334706f2543Smrg if (pLayout->winkbtype > 0 && pLayout->winkbtype != keyboardType) 335706f2543Smrg continue; 336706f2543Smrg 337706f2543Smrg bfound = TRUE; 338706f2543Smrg winMsg (X_PROBED, 339706f2543Smrg "Found matching XKB configuration \"%s\"\n", 340706f2543Smrg pLayout->layoutname); 341706f2543Smrg 342706f2543Smrg winMsg(X_PROBED, 343706f2543Smrg "Model = \"%s\" Layout = \"%s\"" 344706f2543Smrg " Variant = \"%s\" Options = \"%s\"\n", 345706f2543Smrg pLayout->xkbmodel ? pLayout->xkbmodel : "none", 346706f2543Smrg pLayout->xkblayout ? pLayout->xkblayout : "none", 347706f2543Smrg pLayout->xkbvariant ? pLayout->xkbvariant : "none", 348706f2543Smrg pLayout->xkboptions ? pLayout->xkboptions : "none"); 349706f2543Smrg 350706f2543Smrg g_winInfo.xkb.model = pLayout->xkbmodel; 351706f2543Smrg g_winInfo.xkb.layout = pLayout->xkblayout; 352706f2543Smrg g_winInfo.xkb.variant = pLayout->xkbvariant; 353706f2543Smrg g_winInfo.xkb.options = pLayout->xkboptions; 354706f2543Smrg 355706f2543Smrg 356706f2543Smrg break; 357706f2543Smrg } 358706f2543Smrg 359706f2543Smrg if (!bfound) 360706f2543Smrg { 361706f2543Smrg winMsg (X_ERROR, "Keyboardlayout \"%s\" (%s) is unknown, using X server default layout\n", layoutFriendlyName, layoutName); 362706f2543Smrg } 363706f2543Smrg } 364706f2543Smrg 365706f2543Smrg /* parse the configuration */ 366706f2543Smrg#ifdef XWIN_XF86CONFIG 367706f2543Smrg if (g_cmdline.keyboard) 368706f2543Smrg kbdfrom = X_CMDLINE; 369706f2543Smrg 370706f2543Smrg /* 371706f2543Smrg * Until the layout code is finished, I search for the keyboard 372706f2543Smrg * device and configure the server with it. 373706f2543Smrg */ 374706f2543Smrg 375706f2543Smrg if (g_xf86configptr != NULL) 376706f2543Smrg input_list = g_xf86configptr->conf_input_lst; 377706f2543Smrg 378706f2543Smrg while (input_list != NULL) 379706f2543Smrg { 380706f2543Smrg if (winNameCompare (input_list->inp_driver, "keyboard") == 0) 381706f2543Smrg { 382706f2543Smrg /* Check if device name matches requested name */ 383706f2543Smrg if (g_cmdline.keyboard && winNameCompare (input_list->inp_identifier, 384706f2543Smrg g_cmdline.keyboard)) 385706f2543Smrg continue; 386706f2543Smrg kbd = input_list; 387706f2543Smrg } 388706f2543Smrg input_list = input_list->list.next; 389706f2543Smrg } 390706f2543Smrg 391706f2543Smrg if (kbd != NULL) 392706f2543Smrg { 393706f2543Smrg 394706f2543Smrg if (kbd->inp_identifier) 395706f2543Smrg winMsg (kbdfrom, "Using keyboard \"%s\" as primary keyboard\n", 396706f2543Smrg kbd->inp_identifier); 397706f2543Smrg 398706f2543Smrg if ((s = winSetStrOption(kbd->inp_option_lst, "AutoRepeat", NULL))) 399706f2543Smrg { 400706f2543Smrg if ((sscanf(s, "%ld %ld", &g_winInfo.keyboard.delay, 401706f2543Smrg &g_winInfo.keyboard.rate) != 2) || 402706f2543Smrg (g_winInfo.keyboard.delay < 1) || 403706f2543Smrg (g_winInfo.keyboard.rate == 0) || 404706f2543Smrg (1000 / g_winInfo.keyboard.rate) < 1) 405706f2543Smrg { 406706f2543Smrg winErrorFVerb (2, "\"%s\" is not a valid AutoRepeat value", s); 407706f2543Smrg free(s); 408706f2543Smrg return FALSE; 409706f2543Smrg } 410706f2543Smrg free(s); 411706f2543Smrg winMsg (X_CONFIG, "AutoRepeat: %ld %ld\n", 412706f2543Smrg g_winInfo.keyboard.delay, g_winInfo.keyboard.rate); 413706f2543Smrg } 414706f2543Smrg#endif 415706f2543Smrg 416706f2543Smrg s = NULL; 417706f2543Smrg if (g_cmdline.xkbRules) 418706f2543Smrg { 419706f2543Smrg s = g_cmdline.xkbRules; 420706f2543Smrg from = X_CMDLINE; 421706f2543Smrg } 422706f2543Smrg#ifdef XWIN_XF86CONFIG 423706f2543Smrg else 424706f2543Smrg { 425706f2543Smrg s = winSetStrOption (kbd->inp_option_lst, "XkbRules", NULL); 426706f2543Smrg from = X_CONFIG; 427706f2543Smrg } 428706f2543Smrg#endif 429706f2543Smrg if (s) 430706f2543Smrg { 431706f2543Smrg g_winInfo.xkb.rules = NULL_IF_EMPTY (s); 432706f2543Smrg winMsg (from, "XKB: rules: \"%s\"\n", s); 433706f2543Smrg } 434706f2543Smrg 435706f2543Smrg s = NULL; 436706f2543Smrg if (g_cmdline.xkbModel) 437706f2543Smrg { 438706f2543Smrg s = g_cmdline.xkbModel; 439706f2543Smrg from = X_CMDLINE; 440706f2543Smrg } 441706f2543Smrg#ifdef XWIN_XF86CONFIG 442706f2543Smrg else 443706f2543Smrg { 444706f2543Smrg s = winSetStrOption (kbd->inp_option_lst, "XkbModel", NULL); 445706f2543Smrg from = X_CONFIG; 446706f2543Smrg } 447706f2543Smrg#endif 448706f2543Smrg if (s) 449706f2543Smrg { 450706f2543Smrg g_winInfo.xkb.model = NULL_IF_EMPTY (s); 451706f2543Smrg winMsg (from, "XKB: model: \"%s\"\n", s); 452706f2543Smrg } 453706f2543Smrg 454706f2543Smrg s = NULL; 455706f2543Smrg if (g_cmdline.xkbLayout) 456706f2543Smrg { 457706f2543Smrg s = g_cmdline.xkbLayout; 458706f2543Smrg from = X_CMDLINE; 459706f2543Smrg } 460706f2543Smrg#ifdef XWIN_XF86CONFIG 461706f2543Smrg else 462706f2543Smrg { 463706f2543Smrg s = winSetStrOption (kbd->inp_option_lst, "XkbLayout", NULL); 464706f2543Smrg from = X_CONFIG; 465706f2543Smrg } 466706f2543Smrg#endif 467706f2543Smrg if (s) 468706f2543Smrg { 469706f2543Smrg g_winInfo.xkb.layout = NULL_IF_EMPTY (s); 470706f2543Smrg winMsg (from, "XKB: layout: \"%s\"\n", s); 471706f2543Smrg } 472706f2543Smrg 473706f2543Smrg s = NULL; 474706f2543Smrg if (g_cmdline.xkbVariant) 475706f2543Smrg { 476706f2543Smrg s = g_cmdline.xkbVariant; 477706f2543Smrg from = X_CMDLINE; 478706f2543Smrg } 479706f2543Smrg#ifdef XWIN_XF86CONFIG 480706f2543Smrg else 481706f2543Smrg { 482706f2543Smrg s = winSetStrOption (kbd->inp_option_lst, "XkbVariant", NULL); 483706f2543Smrg from = X_CONFIG; 484706f2543Smrg } 485706f2543Smrg#endif 486706f2543Smrg if (s) 487706f2543Smrg { 488706f2543Smrg g_winInfo.xkb.variant = NULL_IF_EMPTY (s); 489706f2543Smrg winMsg (from, "XKB: variant: \"%s\"\n", s); 490706f2543Smrg } 491706f2543Smrg 492706f2543Smrg s = NULL; 493706f2543Smrg if (g_cmdline.xkbOptions) 494706f2543Smrg { 495706f2543Smrg s = g_cmdline.xkbOptions; 496706f2543Smrg from = X_CMDLINE; 497706f2543Smrg } 498706f2543Smrg#ifdef XWIN_XF86CONFIG 499706f2543Smrg else 500706f2543Smrg { 501706f2543Smrg s = winSetStrOption (kbd->inp_option_lst, "XkbOptions", NULL); 502706f2543Smrg from = X_CONFIG; 503706f2543Smrg } 504706f2543Smrg#endif 505706f2543Smrg if (s) 506706f2543Smrg { 507706f2543Smrg g_winInfo.xkb.options = NULL_IF_EMPTY (s); 508706f2543Smrg winMsg (from, "XKB: options: \"%s\"\n", s); 509706f2543Smrg } 510706f2543Smrg 511706f2543Smrg#ifdef XWIN_XF86CONFIG 512706f2543Smrg } 513706f2543Smrg#endif 514706f2543Smrg 515706f2543Smrg return TRUE; 516706f2543Smrg} 517706f2543Smrg 518706f2543Smrg 519706f2543Smrg#ifdef XWIN_XF86CONFIG 520706f2543SmrgBool 521706f2543SmrgwinConfigMouse (DeviceIntPtr pDevice) 522706f2543Smrg{ 523706f2543Smrg MessageType mousefrom = X_CONFIG; 524706f2543Smrg 525706f2543Smrg XF86ConfInputPtr mouse = NULL; 526706f2543Smrg XF86ConfInputPtr input_list = NULL; 527706f2543Smrg 528706f2543Smrg if (g_cmdline.mouse) 529706f2543Smrg mousefrom = X_CMDLINE; 530706f2543Smrg 531706f2543Smrg if (g_xf86configptr != NULL) 532706f2543Smrg input_list = g_xf86configptr->conf_input_lst; 533706f2543Smrg 534706f2543Smrg while (input_list != NULL) 535706f2543Smrg { 536706f2543Smrg if (winNameCompare (input_list->inp_driver, "mouse") == 0) 537706f2543Smrg { 538706f2543Smrg /* Check if device name matches requested name */ 539706f2543Smrg if (g_cmdline.mouse && winNameCompare (input_list->inp_identifier, 540706f2543Smrg g_cmdline.mouse)) 541706f2543Smrg continue; 542706f2543Smrg mouse = input_list; 543706f2543Smrg } 544706f2543Smrg input_list = input_list->list.next; 545706f2543Smrg } 546706f2543Smrg 547706f2543Smrg if (mouse != NULL) 548706f2543Smrg { 549706f2543Smrg if (mouse->inp_identifier) 550706f2543Smrg winMsg (mousefrom, "Using pointer \"%s\" as primary pointer\n", 551706f2543Smrg mouse->inp_identifier); 552706f2543Smrg 553706f2543Smrg g_winInfo.pointer.emulate3Buttons = 554706f2543Smrg winSetBoolOption (mouse->inp_option_lst, "Emulate3Buttons", FALSE); 555706f2543Smrg if (g_cmdline.emulate3buttons) 556706f2543Smrg g_winInfo.pointer.emulate3Buttons = g_cmdline.emulate3buttons; 557706f2543Smrg 558706f2543Smrg g_winInfo.pointer.emulate3Timeout = 559706f2543Smrg winSetIntOption (mouse->inp_option_lst, "Emulate3Timeout", 50); 560706f2543Smrg if (g_cmdline.emulate3timeout) 561706f2543Smrg g_winInfo.pointer.emulate3Timeout = g_cmdline.emulate3timeout; 562706f2543Smrg } 563706f2543Smrg else 564706f2543Smrg { 565706f2543Smrg winMsg (X_ERROR, "No primary pointer configured\n"); 566706f2543Smrg winMsg (X_DEFAULT, "Using compiletime defaults for pointer\n"); 567706f2543Smrg } 568706f2543Smrg 569706f2543Smrg return TRUE; 570706f2543Smrg} 571706f2543Smrg 572706f2543Smrg 573706f2543SmrgBool 574706f2543SmrgwinConfigFiles () 575706f2543Smrg{ 576706f2543Smrg MessageType from; 577706f2543Smrg XF86ConfFilesPtr filesptr = NULL; 578706f2543Smrg 579706f2543Smrg /* set some shortcuts */ 580706f2543Smrg if (g_xf86configptr != NULL) 581706f2543Smrg { 582706f2543Smrg filesptr = g_xf86configptr->conf_files; 583706f2543Smrg } 584706f2543Smrg 585706f2543Smrg 586706f2543Smrg /* Fontpath */ 587706f2543Smrg from = X_DEFAULT; 588706f2543Smrg 589706f2543Smrg if (g_cmdline.fontPath) 590706f2543Smrg { 591706f2543Smrg from = X_CMDLINE; 592706f2543Smrg defaultFontPath = g_cmdline.fontPath; 593706f2543Smrg } 594706f2543Smrg else if (filesptr != NULL && filesptr->file_fontpath) 595706f2543Smrg { 596706f2543Smrg from = X_CONFIG; 597706f2543Smrg defaultFontPath = strdup (filesptr->file_fontpath); 598706f2543Smrg } 599706f2543Smrg winMsg (from, "FontPath set to \"%s\"\n", defaultFontPath); 600706f2543Smrg 601706f2543Smrg return TRUE; 602706f2543Smrg} 603706f2543Smrg#else 604706f2543SmrgBool 605706f2543SmrgwinConfigFiles (void) 606706f2543Smrg{ 607706f2543Smrg /* Fontpath */ 608706f2543Smrg if (g_cmdline.fontPath) 609706f2543Smrg { 610706f2543Smrg defaultFontPath = g_cmdline.fontPath; 611706f2543Smrg winMsg (X_CMDLINE, "FontPath set to \"%s\"\n", defaultFontPath); 612706f2543Smrg } 613706f2543Smrg 614706f2543Smrg return TRUE; 615706f2543Smrg} 616706f2543Smrg#endif 617706f2543Smrg 618706f2543Smrg 619706f2543SmrgBool 620706f2543SmrgwinConfigOptions (void) 621706f2543Smrg{ 622706f2543Smrg return TRUE; 623706f2543Smrg} 624706f2543Smrg 625706f2543Smrg 626706f2543SmrgBool 627706f2543SmrgwinConfigScreens (void) 628706f2543Smrg{ 629706f2543Smrg return TRUE; 630706f2543Smrg} 631706f2543Smrg 632706f2543Smrg 633706f2543Smrg#ifdef XWIN_XF86CONFIG 634706f2543Smrgchar * 635706f2543SmrgwinSetStrOption (pointer optlist, const char *name, char *deflt) 636706f2543Smrg{ 637706f2543Smrg OptionInfoRec o; 638706f2543Smrg 639706f2543Smrg o.name = name; 640706f2543Smrg o.type = OPTV_STRING; 641706f2543Smrg if (ParseOptionValue (-1, optlist, &o)) 642706f2543Smrg deflt = o.value.str; 643706f2543Smrg if (deflt) 644706f2543Smrg return strdup (deflt); 645706f2543Smrg else 646706f2543Smrg return NULL; 647706f2543Smrg} 648706f2543Smrg 649706f2543Smrg 650706f2543Smrgint 651706f2543SmrgwinSetBoolOption (pointer optlist, const char *name, int deflt) 652706f2543Smrg{ 653706f2543Smrg OptionInfoRec o; 654706f2543Smrg 655706f2543Smrg o.name = name; 656706f2543Smrg o.type = OPTV_BOOLEAN; 657706f2543Smrg if (ParseOptionValue (-1, optlist, &o)) 658706f2543Smrg deflt = o.value.bool; 659706f2543Smrg return deflt; 660706f2543Smrg} 661706f2543Smrg 662706f2543Smrg 663706f2543Smrgint 664706f2543SmrgwinSetIntOption (pointer optlist, const char *name, int deflt) 665706f2543Smrg{ 666706f2543Smrg OptionInfoRec o; 667706f2543Smrg 668706f2543Smrg o.name = name; 669706f2543Smrg o.type = OPTV_INTEGER; 670706f2543Smrg if (ParseOptionValue (-1, optlist, &o)) 671706f2543Smrg deflt = o.value.num; 672706f2543Smrg return deflt; 673706f2543Smrg} 674706f2543Smrg 675706f2543Smrg 676706f2543Smrgdouble 677706f2543SmrgwinSetRealOption (pointer optlist, const char *name, double deflt) 678706f2543Smrg{ 679706f2543Smrg OptionInfoRec o; 680706f2543Smrg 681706f2543Smrg o.name = name; 682706f2543Smrg o.type = OPTV_REAL; 683706f2543Smrg if (ParseOptionValue (-1, optlist, &o)) 684706f2543Smrg deflt = o.value.realnum; 685706f2543Smrg return deflt; 686706f2543Smrg} 687706f2543Smrg 688706f2543Smrgdouble 689706f2543SmrgwinSetPercentOption (pointer optlist, const char *name, double deflt) 690706f2543Smrg{ 691706f2543Smrg OptionInfoRec o; 692706f2543Smrg 693706f2543Smrg o.name = name; 694706f2543Smrg o.type = OPTV_PERCENT; 695706f2543Smrg if (ParseOptionValue (-1, optlist, &o)) 696706f2543Smrg deflt = o.value.realnum; 697706f2543Smrg return deflt; 698706f2543Smrg} 699706f2543Smrg#endif 700706f2543Smrg 701706f2543Smrg 702706f2543Smrg/* 703706f2543Smrg * Compare two strings for equality. This is caseinsensitive and 704706f2543Smrg * The characters '_', ' ' (space) and '\t' (tab) are treated as 705706f2543Smrg * not existing. 706706f2543Smrg */ 707706f2543Smrg 708706f2543Smrgint 709706f2543SmrgwinNameCompare (const char *s1, const char *s2) 710706f2543Smrg{ 711706f2543Smrg char c1, c2; 712706f2543Smrg 713706f2543Smrg if (!s1 || *s1 == 0) 714706f2543Smrg { 715706f2543Smrg if (!s2 || *s2 == 0) 716706f2543Smrg return 0; 717706f2543Smrg else 718706f2543Smrg return 1; 719706f2543Smrg } 720706f2543Smrg 721706f2543Smrg while (*s1 == '_' || *s1 == ' ' || *s1 == '\t') 722706f2543Smrg s1++; 723706f2543Smrg while (*s2 == '_' || *s2 == ' ' || *s2 == '\t') 724706f2543Smrg s2++; 725706f2543Smrg 726706f2543Smrg c1 = (isupper ((int)*s1) ? tolower ((int)*s1) : *s1); 727706f2543Smrg c2 = (isupper ((int)*s2) ? tolower ((int)*s2) : *s2); 728706f2543Smrg 729706f2543Smrg while (c1 == c2) 730706f2543Smrg { 731706f2543Smrg if (c1 == 0) 732706f2543Smrg return 0; 733706f2543Smrg s1++; 734706f2543Smrg s2++; 735706f2543Smrg 736706f2543Smrg while (*s1 == '_' || *s1 == ' ' || *s1 == '\t') 737706f2543Smrg s1++; 738706f2543Smrg while (*s2 == '_' || *s2 == ' ' || *s2 == '\t') 739706f2543Smrg s2++; 740706f2543Smrg 741706f2543Smrg c1 = (isupper ((int)*s1) ? tolower ((int)*s1) : *s1); 742706f2543Smrg c2 = (isupper ((int)*s2) ? tolower ((int)*s2) : *s2); 743706f2543Smrg } 744706f2543Smrg return c1 - c2; 745706f2543Smrg} 746706f2543Smrg 747706f2543Smrg 748706f2543Smrg#ifdef XWIN_XF86CONFIG 749706f2543Smrg/* 750706f2543Smrg * Find the named option in the list. 751706f2543Smrg * @return the pointer to the option record, or NULL if not found. 752706f2543Smrg */ 753706f2543Smrg 754706f2543SmrgXF86OptionPtr 755706f2543SmrgwinFindOption (XF86OptionPtr list, const char *name) 756706f2543Smrg{ 757706f2543Smrg while (list) 758706f2543Smrg { 759706f2543Smrg if (winNameCompare (list->opt_name, name) == 0) 760706f2543Smrg return list; 761706f2543Smrg list = list->list.next; 762706f2543Smrg } 763706f2543Smrg return NULL; 764706f2543Smrg} 765706f2543Smrg 766706f2543Smrg 767706f2543Smrg/* 768706f2543Smrg * Find the Value of an named option. 769706f2543Smrg * @return The option value or NULL if not found. 770706f2543Smrg */ 771706f2543Smrg 772706f2543Smrgchar * 773706f2543SmrgwinFindOptionValue (XF86OptionPtr list, const char *name) 774706f2543Smrg{ 775706f2543Smrg list = winFindOption (list, name); 776706f2543Smrg if (list) 777706f2543Smrg { 778706f2543Smrg if (list->opt_val) 779706f2543Smrg return list->opt_val; 780706f2543Smrg else 781706f2543Smrg return ""; 782706f2543Smrg } 783706f2543Smrg return NULL; 784706f2543Smrg} 785706f2543Smrg 786706f2543Smrg 787706f2543Smrg/* 788706f2543Smrg * Parse the option. 789706f2543Smrg */ 790706f2543Smrg 791706f2543Smrgstatic Bool 792706f2543SmrgParseOptionValue (int scrnIndex, pointer options, OptionInfoPtr p) 793706f2543Smrg{ 794706f2543Smrg char *s, *end; 795706f2543Smrg 796706f2543Smrg if ((s = winFindOptionValue (options, p->name)) != NULL) 797706f2543Smrg { 798706f2543Smrg switch (p->type) 799706f2543Smrg { 800706f2543Smrg case OPTV_INTEGER: 801706f2543Smrg if (*s == '\0') 802706f2543Smrg { 803706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 804706f2543Smrg "Option \"%s\" requires an integer value\n", 805706f2543Smrg p->name); 806706f2543Smrg p->found = FALSE; 807706f2543Smrg } 808706f2543Smrg else 809706f2543Smrg { 810706f2543Smrg p->value.num = strtoul (s, &end, 0); 811706f2543Smrg if (*end == '\0') 812706f2543Smrg { 813706f2543Smrg p->found = TRUE; 814706f2543Smrg } 815706f2543Smrg else 816706f2543Smrg { 817706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 818706f2543Smrg "Option \"%s\" requires an integer value\n", 819706f2543Smrg p->name); 820706f2543Smrg p->found = FALSE; 821706f2543Smrg } 822706f2543Smrg } 823706f2543Smrg break; 824706f2543Smrg case OPTV_STRING: 825706f2543Smrg if (*s == '\0') 826706f2543Smrg { 827706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 828706f2543Smrg "Option \"%s\" requires an string value\n", p->name); 829706f2543Smrg p->found = FALSE; 830706f2543Smrg } 831706f2543Smrg else 832706f2543Smrg { 833706f2543Smrg p->value.str = s; 834706f2543Smrg p->found = TRUE; 835706f2543Smrg } 836706f2543Smrg break; 837706f2543Smrg case OPTV_ANYSTR: 838706f2543Smrg p->value.str = s; 839706f2543Smrg p->found = TRUE; 840706f2543Smrg break; 841706f2543Smrg case OPTV_REAL: 842706f2543Smrg if (*s == '\0') 843706f2543Smrg { 844706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 845706f2543Smrg "Option \"%s\" requires a floating point value\n", 846706f2543Smrg p->name); 847706f2543Smrg p->found = FALSE; 848706f2543Smrg } 849706f2543Smrg else 850706f2543Smrg { 851706f2543Smrg p->value.realnum = strtod (s, &end); 852706f2543Smrg if (*end == '\0') 853706f2543Smrg { 854706f2543Smrg p->found = TRUE; 855706f2543Smrg } 856706f2543Smrg else 857706f2543Smrg { 858706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 859706f2543Smrg "Option \"%s\" requires a floating point value\n", 860706f2543Smrg p->name); 861706f2543Smrg p->found = FALSE; 862706f2543Smrg } 863706f2543Smrg } 864706f2543Smrg break; 865706f2543Smrg case OPTV_BOOLEAN: 866706f2543Smrg if (GetBoolValue (p, s)) 867706f2543Smrg { 868706f2543Smrg p->found = TRUE; 869706f2543Smrg } 870706f2543Smrg else 871706f2543Smrg { 872706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 873706f2543Smrg "Option \"%s\" requires a boolean value\n", p->name); 874706f2543Smrg p->found = FALSE; 875706f2543Smrg } 876706f2543Smrg break; 877706f2543Smrg case OPTV_PERCENT: 878706f2543Smrg if (*s == '\0') 879706f2543Smrg { 880706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 881706f2543Smrg "Option \"%s\" requires a percent value\n", 882706f2543Smrg p->name); 883706f2543Smrg p->found = FALSE; 884706f2543Smrg } 885706f2543Smrg else 886706f2543Smrg { 887706f2543Smrg double percent = strtod (s, &end); 888706f2543Smrg 889706f2543Smrg if (end != s && winNameCompare (end, "%")) 890706f2543Smrg { 891706f2543Smrg p->found = TRUE; 892706f2543Smrg p->value.realnum = percent; 893706f2543Smrg } 894706f2543Smrg else 895706f2543Smrg { 896706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 897706f2543Smrg "Option \"%s\" requires a frequency value\n", 898706f2543Smrg p->name); 899706f2543Smrg p->found = FALSE; 900706f2543Smrg } 901706f2543Smrg } 902706f2543Smrg case OPTV_FREQ: 903706f2543Smrg if (*s == '\0') 904706f2543Smrg { 905706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 906706f2543Smrg "Option \"%s\" requires a frequency value\n", 907706f2543Smrg p->name); 908706f2543Smrg p->found = FALSE; 909706f2543Smrg } 910706f2543Smrg else 911706f2543Smrg { 912706f2543Smrg double freq = strtod (s, &end); 913706f2543Smrg int units = 0; 914706f2543Smrg 915706f2543Smrg if (end != s) 916706f2543Smrg { 917706f2543Smrg p->found = TRUE; 918706f2543Smrg if (!winNameCompare (end, "Hz")) 919706f2543Smrg units = 1; 920706f2543Smrg else if (!winNameCompare (end, "kHz") || 921706f2543Smrg !winNameCompare (end, "k")) 922706f2543Smrg units = 1000; 923706f2543Smrg else if (!winNameCompare (end, "MHz") || 924706f2543Smrg !winNameCompare (end, "M")) 925706f2543Smrg units = 1000000; 926706f2543Smrg else 927706f2543Smrg { 928706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 929706f2543Smrg "Option \"%s\" requires a frequency value\n", 930706f2543Smrg p->name); 931706f2543Smrg p->found = FALSE; 932706f2543Smrg } 933706f2543Smrg if (p->found) 934706f2543Smrg freq *= (double) units; 935706f2543Smrg } 936706f2543Smrg else 937706f2543Smrg { 938706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 939706f2543Smrg "Option \"%s\" requires a frequency value\n", 940706f2543Smrg p->name); 941706f2543Smrg p->found = FALSE; 942706f2543Smrg } 943706f2543Smrg if (p->found) 944706f2543Smrg { 945706f2543Smrg p->value.freq.freq = freq; 946706f2543Smrg p->value.freq.units = units; 947706f2543Smrg } 948706f2543Smrg } 949706f2543Smrg break; 950706f2543Smrg case OPTV_NONE: 951706f2543Smrg /* Should never get here */ 952706f2543Smrg p->found = FALSE; 953706f2543Smrg break; 954706f2543Smrg } 955706f2543Smrg if (p->found) 956706f2543Smrg { 957706f2543Smrg winDrvMsgVerb (scrnIndex, X_CONFIG, 2, "Option \"%s\"", p->name); 958706f2543Smrg if (!(p->type == OPTV_BOOLEAN && *s == 0)) 959706f2543Smrg { 960706f2543Smrg winErrorFVerb (2, " \"%s\"", s); 961706f2543Smrg } 962706f2543Smrg winErrorFVerb (2, "\n"); 963706f2543Smrg } 964706f2543Smrg } 965706f2543Smrg else if (p->type == OPTV_BOOLEAN) 966706f2543Smrg { 967706f2543Smrg /* Look for matches with options with or without a "No" prefix. */ 968706f2543Smrg char *n, *newn; 969706f2543Smrg OptionInfoRec opt; 970706f2543Smrg 971706f2543Smrg n = winNormalizeName (p->name); 972706f2543Smrg if (!n) 973706f2543Smrg { 974706f2543Smrg p->found = FALSE; 975706f2543Smrg return FALSE; 976706f2543Smrg } 977706f2543Smrg if (strncmp (n, "no", 2) == 0) 978706f2543Smrg { 979706f2543Smrg newn = n + 2; 980706f2543Smrg } 981706f2543Smrg else 982706f2543Smrg { 983706f2543Smrg free (n); 984706f2543Smrg n = malloc (strlen (p->name) + 2 + 1); 985706f2543Smrg if (!n) 986706f2543Smrg { 987706f2543Smrg p->found = FALSE; 988706f2543Smrg return FALSE; 989706f2543Smrg } 990706f2543Smrg strcpy (n, "No"); 991706f2543Smrg strcat (n, p->name); 992706f2543Smrg newn = n; 993706f2543Smrg } 994706f2543Smrg if ((s = winFindOptionValue (options, newn)) != NULL) 995706f2543Smrg { 996706f2543Smrg if (GetBoolValue (&opt, s)) 997706f2543Smrg { 998706f2543Smrg p->value.bool = !opt.value.bool; 999706f2543Smrg p->found = TRUE; 1000706f2543Smrg } 1001706f2543Smrg else 1002706f2543Smrg { 1003706f2543Smrg winDrvMsg (scrnIndex, X_WARNING, 1004706f2543Smrg "Option \"%s\" requires a boolean value\n", newn); 1005706f2543Smrg p->found = FALSE; 1006706f2543Smrg } 1007706f2543Smrg } 1008706f2543Smrg else 1009706f2543Smrg { 1010706f2543Smrg p->found = FALSE; 1011706f2543Smrg } 1012706f2543Smrg if (p->found) 1013706f2543Smrg { 1014706f2543Smrg winDrvMsgVerb (scrnIndex, X_CONFIG, 2, "Option \"%s\"", newn); 1015706f2543Smrg if (*s != 0) 1016706f2543Smrg { 1017706f2543Smrg winErrorFVerb (2, " \"%s\"", s); 1018706f2543Smrg } 1019706f2543Smrg winErrorFVerb (2, "\n"); 1020706f2543Smrg } 1021706f2543Smrg free (n); 1022706f2543Smrg } 1023706f2543Smrg else 1024706f2543Smrg { 1025706f2543Smrg p->found = FALSE; 1026706f2543Smrg } 1027706f2543Smrg return p->found; 1028706f2543Smrg} 1029706f2543Smrg 1030706f2543Smrg 1031706f2543Smrgstatic Bool 1032706f2543SmrgconfigLayout (serverLayoutPtr servlayoutp, XF86ConfLayoutPtr conf_layout, 1033706f2543Smrg char *default_layout) 1034706f2543Smrg{ 1035706f2543Smrg#if 0 1036706f2543Smrg#pragma warn UNIMPLEMENTED 1037706f2543Smrg#endif 1038706f2543Smrg return TRUE; 1039706f2543Smrg} 1040706f2543Smrg 1041706f2543Smrg 1042706f2543Smrgstatic Bool 1043706f2543SmrgconfigImpliedLayout (serverLayoutPtr servlayoutp, 1044706f2543Smrg XF86ConfScreenPtr conf_screen) 1045706f2543Smrg{ 1046706f2543Smrg#if 0 1047706f2543Smrg#pragma warn UNIMPLEMENTED 1048706f2543Smrg#endif 1049706f2543Smrg return TRUE; 1050706f2543Smrg} 1051706f2543Smrg 1052706f2543Smrg 1053706f2543Smrgstatic Bool 1054706f2543SmrgGetBoolValue (OptionInfoPtr p, const char *s) 1055706f2543Smrg{ 1056706f2543Smrg if (*s == 0) 1057706f2543Smrg { 1058706f2543Smrg p->value.bool = TRUE; 1059706f2543Smrg } 1060706f2543Smrg else 1061706f2543Smrg { 1062706f2543Smrg if (winNameCompare (s, "1") == 0) 1063706f2543Smrg p->value.bool = TRUE; 1064706f2543Smrg else if (winNameCompare (s, "on") == 0) 1065706f2543Smrg p->value.bool = TRUE; 1066706f2543Smrg else if (winNameCompare (s, "true") == 0) 1067706f2543Smrg p->value.bool = TRUE; 1068706f2543Smrg else if (winNameCompare (s, "yes") == 0) 1069706f2543Smrg p->value.bool = TRUE; 1070706f2543Smrg else if (winNameCompare (s, "0") == 0) 1071706f2543Smrg p->value.bool = FALSE; 1072706f2543Smrg else if (winNameCompare (s, "off") == 0) 1073706f2543Smrg p->value.bool = FALSE; 1074706f2543Smrg else if (winNameCompare (s, "false") == 0) 1075706f2543Smrg p->value.bool = FALSE; 1076706f2543Smrg else if (winNameCompare (s, "no") == 0) 1077706f2543Smrg p->value.bool = FALSE; 1078706f2543Smrg } 1079706f2543Smrg return TRUE; 1080706f2543Smrg} 1081706f2543Smrg#endif 1082706f2543Smrg 1083706f2543Smrg 1084706f2543Smrgchar * 1085706f2543SmrgwinNormalizeName (const char *s) 1086706f2543Smrg{ 1087706f2543Smrg char *ret, *q; 1088706f2543Smrg const char *p; 1089706f2543Smrg 1090706f2543Smrg if (s == NULL) 1091706f2543Smrg return NULL; 1092706f2543Smrg 1093706f2543Smrg ret = malloc (strlen (s) + 1); 1094706f2543Smrg for (p = s, q = ret; *p != 0; p++) 1095706f2543Smrg { 1096706f2543Smrg switch (*p) 1097706f2543Smrg { 1098706f2543Smrg case '_': 1099706f2543Smrg case ' ': 1100706f2543Smrg case '\t': 1101706f2543Smrg continue; 1102706f2543Smrg default: 1103706f2543Smrg if (isupper ((int)*p)) 1104706f2543Smrg *q++ = tolower ((int)*p); 1105706f2543Smrg else 1106706f2543Smrg *q++ = *p; 1107706f2543Smrg } 1108706f2543Smrg } 1109706f2543Smrg *q = '\0'; 1110706f2543Smrg return ret; 1111706f2543Smrg} 1112706f2543Smrg 1113