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, &regkey))
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