#ifndef __WIN_CONFIG_H__
#define __WIN_CONFIG_H__
/*
 *Copyright (C) 1994-2000 The XFree86 Project, Inc. All Rights Reserved.
 *
 *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 XFREE86 PROJECT 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.
 *
 *Except as contained in this notice, the name of the XFree86 Project
 *shall not be used in advertising or otherwise to promote the sale, use
 *or other dealings in this Software without prior written authorization
 *from the XFree86 Project.
 *
 * Authors: Alexander Gottwald	
 */

#include "win.h"
#ifdef XWIN_XF86CONFIG
#include "../xfree86/parser/xf86Parser.h"
#endif


/* These are taken from hw/xfree86/common/xf86str.h */

typedef struct
{
  CARD32 red, green, blue;
}
rgb;


typedef struct
{
  float red, green, blue;
}
Gamma;


typedef struct
{
  char *identifier;
  char *vendor;
  char *board;
  char *chipset;
  char *ramdac;
  char *driver;
  struct _confscreenrec *myScreenSection;
  Bool claimed;
  Bool active;
  Bool inUse;
  int videoRam;
  int textClockFreq;
  pointer options;
  int screen;			/* For multi-CRTC cards */
}
GDevRec, *GDevPtr;


typedef struct
{
  char *identifier;
  char *driver;
  pointer commonOptions;
  pointer extraOptions;
}
IDevRec, *IDevPtr;


typedef struct
{
  int frameX0;
  int frameY0;
  int virtualX;
  int virtualY;
  int depth;
  int fbbpp;
  rgb weight;
  rgb blackColour;
  rgb whiteColour;
  int defaultVisual;
  char **modes;
  pointer options;
}
DispRec, *DispPtr;


typedef struct _confxvportrec
{
  char *identifier;
  pointer options;
}
confXvPortRec, *confXvPortPtr;


typedef struct _confxvadaptrec
{
  char *identifier;
  int numports;
  confXvPortPtr ports;
  pointer options;
}
confXvAdaptorRec, *confXvAdaptorPtr;


typedef struct _confscreenrec
{
  char *id;
  int screennum;
  int defaultdepth;
  int defaultbpp;
  int defaultfbbpp;
  GDevPtr device;
  int numdisplays;
  DispPtr displays;
  int numxvadaptors;
  confXvAdaptorPtr xvadaptors;
  pointer options;
}
confScreenRec, *confScreenPtr;


typedef enum
{
  PosObsolete = -1,
  PosAbsolute = 0,
  PosRightOf,
  PosLeftOf,
  PosAbove,
  PosBelow,
  PosRelative
}
PositionType;


typedef struct _screenlayoutrec
{
  confScreenPtr screen;
  char *topname;
  confScreenPtr top;
  char *bottomname;
  confScreenPtr bottom;
  char *leftname;
  confScreenPtr left;
  char *rightname;
  confScreenPtr right;
  PositionType where;
  int x;
  int y;
  char *refname;
  confScreenPtr refscreen;
}
screenLayoutRec, *screenLayoutPtr;


typedef struct _serverlayoutrec
{
  char *id;
  screenLayoutPtr screens;
  GDevPtr inactives;
  IDevPtr inputs;
  pointer options;
}
serverLayoutRec, *serverLayoutPtr;


/*
 * winconfig.c
 */

typedef struct
{
  /* Files */
#ifdef XWIN_XF86CONFIG
  char *configFile;
  char *configDir;
#endif
  char *fontPath;
  /* input devices - keyboard */
#ifdef XWIN_XF86CONFIG
  char *keyboard;
#endif
  char *xkbRules; 
  char *xkbModel;
  char *xkbLayout;
  char *xkbVariant;
  char *xkbOptions;
  /* layout */
  char *screenname;
  /* mouse settings */
  char *mouse;
  Bool emulate3buttons;
  long emulate3timeout;
}
WinCmdlineRec, *WinCmdlinePtr;


extern WinCmdlineRec g_cmdline;
#ifdef XWIN_XF86CONFIG
extern XF86ConfigPtr g_xf86configptr;
#endif
extern serverLayoutRec g_winConfigLayout;


/*
 * Function prototypes
 */

Bool winReadConfigfile (void);
Bool winConfigFiles (void);
Bool winConfigOptions (void);
Bool winConfigScreens (void);
Bool winConfigKeyboard (DeviceIntPtr pDevice);
Bool winConfigMouse (DeviceIntPtr pDevice);


typedef struct
{
  double freq;
  int units;
}
OptFrequency;


typedef union
{
  unsigned long num;
  char *str;
  double realnum;
  Bool bool;
  OptFrequency freq;
}
ValueUnion;


typedef enum
{
  OPTV_NONE = 0,
  OPTV_INTEGER,
  OPTV_STRING,			/* a non-empty string */
  OPTV_ANYSTR,			/* Any string, including an empty one */
  OPTV_REAL,
  OPTV_BOOLEAN,
  OPTV_FREQ
}
OptionValueType;


typedef enum
{
  OPTUNITS_HZ = 1,
  OPTUNITS_KHZ,
  OPTUNITS_MHZ
}
OptFreqUnits;


typedef struct
{
  int token;
  const char *name;
  OptionValueType type;
  ValueUnion value;
  Bool found;
}
OptionInfoRec, *OptionInfoPtr;


/*
 * Function prototypes
 */

char *winSetStrOption (pointer optlist, const char *name, char *deflt);
int winSetBoolOption (pointer optlist, const char *name, int deflt);
int winSetIntOption (pointer optlist, const char *name, int deflt);
double winSetRealOption (pointer optlist, const char *name, double deflt);
#ifdef XWIN_XF86CONFIG
XF86OptionPtr winFindOption (XF86OptionPtr list, const char *name);
char *winFindOptionValue (XF86OptionPtr list, const char *name);
#endif
int winNameCompare (const char *s1, const char *s2);
char *winNormalizeName (const char *s);


typedef struct
{
  struct
  {
    long leds;
    long delay;
    long rate;
  }
  keyboard;
  XkbRMLVOSet xkb;
  struct
  {
    Bool emulate3Buttons;
    long emulate3Timeout;
  }
  pointer;
}
winInfoRec, *winInfoPtr;


extern winInfoRec g_winInfo;

#endif