basic architecture for game configuration at runtime. writes out a .game, no sanity...
[xonotic/netradiant.git] / radiant / preferences.h
index 7abd86ebd751ae95142083fab30faae895d99e3f..908616adc5eea9bd889d0428daddd25fb8b97253 100644 (file)
-/*\r
-Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
-For a list of contributors, see the accompanying CONTRIBUTORS file.\r
-\r
-This file is part of GtkRadiant.\r
-\r
-GtkRadiant is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or\r
-(at your option) any later version.\r
-\r
-GtkRadiant is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-GNU General Public License for more details.\r
-\r
-You should have received a copy of the GNU General Public License\r
-along with GtkRadiant; if not, write to the Free Software\r
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
-*/\r
-\r
-#ifndef _PREFERENCES_H_\r
-#define _PREFERENCES_H_\r
-\r
-#include "dialog.h"\r
-#include "gtkr_list.h"\r
-//#include "profile.h"\r
-\r
-#define MAX_TEXTURE_QUALITY 3\r
-\r
-enum PrefTypes_t\r
-{\r
-  PREF_STR,\r
-  PREF_INT,\r
-  PREF_BOOL,\r
-  PREF_FLOAT,\r
-  PREF_VEC3,\r
-  PREF_WNDPOS,\r
-};\r
-\r
-/*!\r
-a preference assignment, name, type and pointer to value\r
-we don't store the xmlNodePtr because the document itself can be thrown away upon any LoadPref\r
-(see CGameDialog::UpdatePrefTree)\r
-*/\r
-class CPrefAssignment\r
-{\r
-public:\r
-  Str mName;\r
-  PrefTypes_t mType;\r
-  void *mVal;\r
-\r
-  CPrefAssignment(char *name, PrefTypes_t Type, void *Val)\r
-  {\r
-    mName = name; mType = Type; mVal = Val;\r
-  }\r
-  CPrefAssignment() { mVal = NULL; }\r
-  CPrefAssignment(const CPrefAssignment& ass);\r
-  virtual ~CPrefAssignment() { }\r
-  virtual CPrefAssignment& operator =(const CPrefAssignment& ass);\r
-};\r
-\r
-\r
-/*!\r
-generic preferences storage class, using xml files\r
-*/\r
-class CXMLPropertyBag\r
-{\r
-private:\r
-  /*!\r
-  local prefs file\r
-  */\r
-  xmlDocPtr mpDoc;\r
-  xmlNodePtr mpDocNode;\r
-\r
-  /*!\r
-  prefs assignments (what pref name, what type, what variable)\r
-  */\r
-  list<CPrefAssignment> mPrefAssignments;\r
-\r
-  /*!\r
-  name of file to load/save as\r
-  */\r
-  Str mStrFilename;\r
-\r
-  /*!\r
-  store assignment in the property list if not already there\r
-  */\r
-  void PushAssignment(char *name, PrefTypes_t type, void *pV);\r
-\r
-  /*!\r
-  find the xmlnode relating to the epair name\r
-  */\r
-  xmlNodePtr EpairForName(const char *name);\r
-\r
-public:\r
-  CXMLPropertyBag();\r
-  virtual ~CXMLPropertyBag() \r
-  {\r
-    if (InUse())\r
-      Clear();\r
-  };\r
-\r
-  /*!\r
-  read a pref setting, if doesn't exist, will add it to the xml tree (using default value provided)\r
-  \arg name the name of the pref\r
-  \arg pV pointer to the value\r
-  \arg V default value\r
-  those functions will fill in the list of preferences assignments\r
-    (name, type and pointer to value)\r
-    this is used in UpdatePrefTree\r
-  */\r
-  void GetPref(char *name, Str *pV, char *V);\r
-  void GetPref(char *name, int *pV, int V);\r
-  void GetPref(char *name, bool *pV, bool V);\r
-  void GetPref(char *name, float *pV, float V);\r
-  void GetPref(char *name, float *pV, float* V);\r
-  void GetPref(char *name, window_position_t* pV, window_position_t V);\r
-\r
-  /*!\r
-  returns whether or not the property bag is already open\r
-  */\r
-  qboolean InUse() { return (mpDoc != NULL); };\r
-\r
-  /*!\r
-  unload the xml doc, and free the tree\r
-  */\r
-  void Clear();\r
-\r
-  /*|\r
-  read data from our XML file\r
-  */\r
-  void ReadXMLFile(const char* pFilename);\r
-\r
-  /*|\r
-  write out the property bag to an XML data file\r
-  return is success/fail\r
-  */\r
-  qboolean WriteXMLFile(const char* pFilename);\r
-\r
-  /*!\r
-  update the xml tree with data form the property list, usually in preparation for a write\r
-  */\r
-  void UpdatePrefTree();\r
-\r
-  /*!\r
-  did the file have any data or not?\r
-  */\r
-  qboolean mbEmpty;\r
-};\r
-\r
-/*!\r
-holds information for a given game\r
-I'm a bit unclear on that still\r
-it holds game specific configuration stuff\r
-such as base names, engine names, some game specific features to activate in the various modules\r
-it is not strictly a prefs thing since the user is not supposed to edit that (unless he is hacking\r
-support for a new game)\r
-\r
-what we do now is fully generate the information for this during the setup. We might want to\r
-generate a piece that just says "the game pack is there", but put the rest of the config somwhere\r
-else (i.e. not generated, copied over during setup .. for instance in the game tools directory)\r
-*/\r
-class CGameDescription\r
-{\r
-public:\r
-  xmlDocPtr mpDoc; ///< the game description xml tree\r
-  Str mGameToolsPath; ///< the explicit path to the game-dependent modules\r
-  Str mGameName; ///< name of the game used in dialogs\r
-  Str mGameFile; ///< the .game file that describes this game\r
-  Str mBaseGame; ///< basegame directory\r
-  Str mEnginePath; ///< path to the engine\r
-  Str mEngine; ///< engine name\r
-#if defined (__linux__) || defined (__APPLE__)\r
-  Str mUserPathPrefix; ///< prefix for ~/.q3a ~/.wolf init, only on *nix\r
-#endif\r
-  Str mShaderPath; ///< the path in which to look for shaders\r
-  Str mShaderlist; ///< shaderlist file\r
-  float mTextureDefaultScale; ///< default scale (0.5 in q3, 1.0 in q1/q2, 0.25 in JK2 ..)\r
-  bool mEClassSingleLoad; ///< only load a single eclass definition file\r
-  bool mNoPatch; ///< this game doesn't support patch technology\r
-  Str mCaulkShader; ///< the shader to use for caulking\r
-\r
-  CGameDescription() { mpDoc = NULL; }\r
-  /*!\r
-  \todo parse basic info from the node\r
-  user-friendly name of the game\r
-  essential parameters (such as the start dir)\r
-  */\r
-  CGameDescription(xmlDocPtr pDoc, const Str &GameFile);\r
-  virtual ~CGameDescription() { xmlFreeDoc(mpDoc); }\r
-\r
-  void Dump();\r
-};\r
-\r
-/*!\r
-standalone dialog for games selection, and more generally global settings\r
-*/\r
-class CGameDialog : public Dialog\r
-{\r
-  GtkWidget *mFrame; ///< this is built on-demand first time it's used\r
-  GtkWidget *mTopBox; ///< top level box used to store the dialog frame, must unhook after modal use\r
-\r
-\r
-  /*!\r
-  global prefs storage\r
-  */\r
-  CXMLPropertyBag mGlobalPrefs;\r
-\r
-#ifdef _WIN32\r
-  /*!\r
-  run from a network share\r
-  this one is not being saved out in prefs, since we need to know before we load prefs\r
-  we use a dummy file NETRUN_FILENAME as flag\r
-  all done with static stuff\r
-  */\r
-  static bool m_bNetRun;\r
-#endif\r
-\r
-protected:\r
-  \r
-  int m_nComboSelect; ///< intermediate int value for combo in dialog box\r
-\r
-public:\r
-\r
-  /*! \r
-  those settings are saved in the global prefs file \r
-  I'm too lazy to wrap behind protected access, not sure this needs to be public\r
-  NOTE: those are preference settings. if you change them it is likely that you would\r
-  have to restart the editor for them to take effect\r
-  */\r
-  /*@{*/\r
-  /*!\r
-  what game has been selected\r
-  this is the name of the .game file\r
-  */\r
-  Str m_sGameFile;\r
-  /*!\r
-  auto-load the game on startup\r
-  this is linked to auto-load checkbox\r
-  */\r
-  bool m_bAutoLoadGame;\r
-  /*!\r
-  log console to radiant.log\r
-  m_bForceLogConsole is an obscure forced latching situation\r
-  */\r
-  bool m_bLogConsole;\r
-  bool m_bForceLogConsole;\r
-  /*@}*/\r
-\r
-  /*!\r
-  points somewhere in mGames, set once at startup\r
-  */\r
-  CGameDescription *m_pCurrentGameDescription;\r
-\r
-  /*!\r
-  the list of game descriptions we scanned from the game/ dir\r
-  */\r
-  list<CGameDescription *> mGames;\r
-\r
-  CGameDialog() { mFrame = NULL; m_pCurrentGameDescription = NULL; m_bLogConsole = false; m_bForceLogConsole = false; }\r
-  virtual ~CGameDialog(); \r
-\r
-  void AddPacksURL(Str &s);  \r
-    \r
-  /*!\r
-  intialize the game dialog, called at CPrefsDlg::Init\r
-  will scan for games, load prefs, and do game selection dialog if needed\r
-  */\r
-  void Init();\r
-\r
-  /*!\r
-  reset the global settings by removing the file\r
-  */\r
-  void Reset();\r
-\r
-  /*!\r
-  run the dialog UI for the list of games \r
-  */\r
-  void DoGameDialog();\r
-\r
-  /*!\r
-  Dialog API\r
-  this is only called when the dialog is built at startup for main engine select\r
-  */\r
-  void BuildDialog ();\r
-  void UpdateData (bool retrieve);\r
-\r
-  /*!\r
-  construction of the dialog frame\r
-  this is the part to be re-used in prefs dialog\r
-  for the standalone dialog, we include this in a modal box\r
-  for prefs, we hook the frame in the main notebook\r
-  build the frame on-demand (only once)\r
-  */\r
-  GtkWidget *GetGlobalFrame();\r
-\r
-  /*!\r
-  global preferences subsystem\r
-  XML-based this time, hopefully this will generalize to other prefs\r
-  LoadPrefs has hardcoded defaults\r
-  NOTE: it may not be strictly 'CGameDialog' to put the global prefs here\r
-    could have named the class differently I guess\r
-  */\r
-  /*@{*/\r
-  void LoadPrefs(); ///< load from file into variables\r
-  void SavePrefs(); ///< save pref variables to file\r
-  /*@}*/\r
-\r
-  /*!\r
-  read or set netrun (check file)\r
-  \param retrieve \r
-    if false, will check if netrun file is present and will set m_bNetRun\r
-    if true, will create/erase the netrun file depending on m_bNetRun\r
-    NOTE: this is not backwards, 'retrieve' means 'retrieve from settings dialog' - in terms of UI\r
-  */\r
-  static void UpdateNetrun(bool retrieve);\r
-  /*!\r
-  get current netrun setting\r
-  */\r
-  static bool GetNetrun();\r
-\r
-private:\r
-  /*!\r
-  scan for .game files, load them\r
-  */\r
-  void ScanForGames();\r
-\r
-  /*!\r
-  inits g_PrefsDlg.m_global_rc_path\r
-  */\r
-  void InitGlobalPrefPath();\r
-\r
-  /*!\r
-  uses m_nComboItem to find the right mGames\r
-  */\r
-  CGameDescription *GameDescriptionForComboItem();\r
-};\r
-\r
-typedef struct {\r
-  int nEntitySplit1;\r
-  int nEntitySplit2;\r
-  \r
-  window_position_t position;\r
-\r
-  window_position_t posEntityWnd;\r
-  window_position_t posMapInfoWnd;\r
-  window_position_t posCamWnd;\r
-  window_position_t posZWnd;\r
-  window_position_t posXYWnd;\r
-  window_position_t posXZWnd;\r
-  window_position_t posYZWnd;\r
-  window_position_t posPatchWnd;\r
-  window_position_t posSurfaceWnd;\r
-  window_position_t posEntityInfoWnd;\r
-\r
-  int nXYHeight;\r
-  int nZWidth;\r
-  int nXYWidth;\r
-  int nCamWidth;\r
-  int nCamHeight;\r
-  int nZFloatWidth;\r
-  int nState;\r
-} windowPosInfo_t;\r
-\r
-class PrefsDlg : public Dialog\r
-{\r
-  \r
-public:\r
-  /*!\r
-  local prefs file\r
-  */\r
-  CXMLPropertyBag mLocalPrefs;\r
-\r
-  // will enable/disable stuff according to the situation\r
-  void DoSensitivity();\r
-  void PreModal() { DoSensitivity(); }\r
-  \r
-  // enable/disable custom editor entry\r
-  void DoEditorSensitivity();\r
-  \r
-  /*!\r
-  this holds global level preferences\r
-  */\r
-  CGameDialog mGamesDialog;\r
-protected:\r
-  // warning about old project files\r
-  bool m_bWarn;\r
-  list<CGameDescription *> mGames;\r
-  \r
-public:\r
-  // last light intensity used in the CLightPrompt dialog, stored in registry\r
-  int m_iLastLightIntensity;\r
-  // these mirror what goes in the combo box\r
-  // see PrefDlg::m_nShader, tells wether to load NONE / COMMON or ALL shaders at parsing stage\r
-  enum {SHADER_NONE = 0, SHADER_COMMON, SHADER_ALL};\r
-\r
-  // Gef: updated preferences dialog\r
-  /*! Preference notebook page numbers */\r
-  enum {PTAB_FRONT = 0, PTAB_GAME_SETTINGS, PTAB_2D, PTAB_CAMERA, PTAB_TEXTURE, PTAB_LAYOUT, PTAB_MOUSE,\r
-        PTAB_EDITING, PTAB_STARTUP, PTAB_PATHS, PTAB_MISC, PTAB_BSPMONITOR} pref_tabs;\r
-  \r
-  GtkWidget *notebook;\r
-       \r
-  void UpdateTextureCompression();\r
-\r
-#ifdef ATIHACK_812\r
-  void UpdateATIHack();\r
-#endif\r
-        \r
-  void LoadPrefs();\r
-  void SavePrefs();\r
-  void LoadTexdefPref(texdef_t* pTexdef, char* pName);\r
-\r
-  PrefsDlg ();\r
-  virtual ~PrefsDlg ()\r
-  {\r
-    g_string_free (m_rc_path, true );\r
-    g_string_free (m_inipath, true );\r
-  }\r
-\r
-  /*!\r
-  path for global settings\r
-  win32: g_strAppPath\r
-  linux: ~/.radiant/<version>/\r
-  */\r
-  GString *m_global_rc_path;\r
-\r
-  /*!\r
-  path to per-game settings\r
-  used for various game dependant storage\r
-  win32: g_strGameToolsPath\r
-  linux: ~/.radiant/<version>/<gamename>/\r
-  */\r
-  GString *m_rc_path;\r
-\r
-  /*!\r
-  holds per-game settings\r
-  m_rc_path+"local.pref"\r
-  \todo FIXME at some point this should become XML property bag code too\r
-  */\r
-  GString *m_inipath;\r
-\r
-  // initialize the above paths\r
-  void Init();\r
-\r
-#if 0\r
-  // DEPRECATED: use engine path from the current game description instead\r
-       // path to the top-level installation\r
-       Str     m_strEnginePath;\r
-  // name of executable\r
-  // quake2 quake3 etc\r
-       Str     m_strEngine;\r
-  // we use this Str to store the full path to the engine: m_strEnginePath + m_strEngine\r
-  // it's not stored in the registry or anything, just ued for display in prefs\r
-  Str   m_strPrefsDlgEngine;\r
-#endif\r
-\r
-  // Dialog Data\r
-  int   m_nMouse;\r
-  MainFrame::EViewStyle m_nView;\r
-  bool  m_bTextureLock;\r
-  bool  m_bLoadLast;\r
-       // path to the project loaded at startup\r
-       // if g_PrefsDlg can't find the information in the ini file\r
-       // it will try to guess and eventually ask the user\r
-  Str   m_strLastProject;  \r
-  /*!\r
-  version of last loaded project file\r
-  says -1 if there's no version loaded\r
-  if it's a manually constructed project file, will be 0\r
-  otherwise the actual 'version' epair\r
-  */\r
-  int   m_nLastProjectVer;\r
-  Str   m_strLastMap;\r
-  bool  m_bInternalBSP;\r
-  bool  m_bRightClick;\r
-  bool  m_bSetGame;\r
-  bool  m_bAutoSave;\r
-  bool  m_bLoadLastMap;\r
-  bool  m_bTextureWindow;\r
-  bool  m_bSnapShots;\r
-  float m_fTinySize;\r
-  bool  m_bCleanTiny;\r
-  bool  m_bCamXYUpdate;\r
-  int   m_nCamDragMultiSelect;\r
-  bool  m_bCamDragMultiSelect;\r
-  bool  m_bCamFreeLook;\r
-  bool  m_bCamFreeLookStrafe;\r
-  bool m_bCamInverseMouse;\r
-  bool m_bCamDiscrete;\r
-  bool  m_bNewLightDraw;\r
-  Str   m_strPrefabPath;\r
-  int   m_nWhatGame;\r
-  bool  m_bALTEdge;\r
-  bool  m_bFaceColors;\r
-  bool  m_bXZVis;\r
-  bool  m_bYZVis;\r
-  bool  m_bZVis;\r
-  bool  m_bSizePaint;\r
-  bool  m_bDLLEntities;\r
-  bool  m_bRotateLock;\r
-  bool  m_bDetachableMenus;\r
-  bool  m_bPatchToolbar;\r
-  bool  m_bWideToolbar;\r
-  bool  m_bPluginToolbar;\r
-  bool  m_bNoClamp;\r
-       //++timo this is most likely broken, I don't know what it's supposed to do\r
-  Str   m_strUserPath;\r
-  int   m_nRotation;\r
-  bool  m_bChaseMouse;\r
-  bool  m_bTextureScrollbar;\r
-  bool  m_bDisplayLists;\r
-  bool m_bAntialiasedPointsAndLines; // Fishman - Add antialiazed points and lines support. 09/03/00\r
-  bool  m_bShowShaders;\r
-  int   m_nShader;\r
-  bool  m_bNoStipple;\r
-  int   m_nUndoLevels;\r
-  bool  m_bVertexSplit;\r
-\r
-  int   m_nMouseButtons;\r
-  int   m_nAngleSpeed;\r
-  int   m_nMoveSpeed;\r
-  int   m_nAutoSave;\r
-  bool  m_bCubicClipping;\r
-  int   m_nCubicScale;\r
-  bool  m_bSelectCurves;\r
-  bool  m_bSelectModels;\r
-  int   m_nEntityShowState;\r
-  int   m_nTextureScale;\r
-  bool  m_bNormalizeColors;\r
-  bool  m_bSwitchClip;\r
-  bool  m_bSelectWholeEntities;\r
-  int   m_nTextureQuality;\r
-  bool  m_bGLLighting;\r
-  bool  m_bTexturesShaderlistOnly;\r
-  int   m_nSubdivisions;\r
-  bool  m_bFloatingZ;\r
-  bool  m_bLatchedFloatingZ;\r
-  // Gef: Kyro GL_POINT workaround\r
-  bool m_bGlPtWorkaround;\r
-\r
-  // how many menus in the texture thing before we split?\r
-  int   m_nTextureMenuSplit;\r
-\r
-  // watch the BSP process through network connections\r
-  // true: trigger the BSP steps one by one and monitor them through the network\r
-  // false: create a BAT / .sh file and execute it. don't bother monitoring it.\r
-  bool  m_bWatchBSP;\r
-  // do we stop the compilation process if we come accross a leak?\r
-  bool  m_bLeakStop;\r
-  // timeout when beginning a step (in seconds)\r
-  // if we don't get a connection quick enough we assume something failed and go back to idling\r
-  int   m_iTimeout;\r
-  bool  m_bRunQuake;\r
-  // store prefs setting for automatic sleep mode activation\r
-  bool  m_bDoSleep;\r
-  \r
-  bool m_bClipCaulk;\r
-\r
-  // make the texture increments match the grid changes\r
-  bool m_bSnapTToGrid;\r
-\r
-  // try to fix the target/targetname conflicts when importing a map (default true)\r
-  bool m_bDoTargetFix;\r
-\r
-  // the increment step we use against the wheel mouse\r
-  int m_nWheelInc;\r
-\r
-#ifdef _WIN32\r
-  // use the file associations to open files instead of builtin Gtk editor\r
-  bool m_bUseWin32Editor;\r
-#else\r
-  // custom shader editor\r
-  bool m_bUseCustomEditor;\r
-  Str  m_strEditorCommand;  // this is the command executed\r
-#endif\r
-\r
-#ifdef _WIN32\r
-  bool m_bNativeGUI;\r
-  bool m_bStartOnPrimMon;\r
-#endif\r
-\r
-  bool m_bPatchBBoxSelect;\r
-\r
-  // RR2DO2: latched data, for settings that require a restart. We don't want to set\r
-  // these directly in case users set them under preferences and then continue working\r
-  // with the editor.\r
-  MainFrame::EViewStyle m_nLatchedView;\r
-  int m_nMRUCount;\r
-  Str m_strMRUFiles[4];\r
-\r
-  windowPosInfo_t mWindowInfo;\r
-\r
-  bool  m_bLatchedDetachableMenus;\r
-  bool  m_bLatchedPatchToolbar;\r
-  bool  m_bLatchedWideToolbar;\r
-  bool  m_bLatchedPluginToolbar;\r
-  int   m_nLatchedShader;\r
-  int   m_nLatchedTextureQuality;\r
-\r
-  // RIANT\r
-  // texture compression format\r
-  int m_nTextureCompressionFormat;\r
-\r
-  int m_nLightRadiuses;\r
-  \r
-  bool m_bQ3Map2Texturing;\r
-\r
-#ifdef ATIHACK_812\r
-       bool m_bGlATIHack;\r
-#endif\r
-\r
-  void UpdateData (bool retrieve);\r
-\r
-  /*! Utility function for swapping notebook pages for tree list selections */\r
-  void showPrefPage(int prefpage);\r
-\r
-protected:\r
-  /*! Scan for game description files and build a list */\r
-  void ScanForGames();\r
-\r
-  /*! Dialog API */\r
-  void BuildDialog ();\r
-  void PostModal (int code);\r
-};\r
-\r
-#endif // _PREFERENCES_H_\r
+/*
+Copyright (C) 1999-2007 id Software, Inc. and contributors.
+For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+This file is part of GtkRadiant.
+
+GtkRadiant is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+GtkRadiant is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GtkRadiant; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#ifndef _PREFERENCES_H_
+#define _PREFERENCES_H_
+
+#include "dialog.h"
+#include "gtkr_list.h"
+//#include "profile.h"
+
+#define MAX_TEXTURE_QUALITY 3
+
+enum PrefTypes_t
+{
+  PREF_STR,
+  PREF_INT,
+  PREF_BOOL,
+  PREF_FLOAT,
+  PREF_VEC3,
+  PREF_WNDPOS,
+};
+
+/*!
+a preference assignment, name, type and pointer to value
+we don't store the xmlNodePtr because the document itself can be thrown away upon any LoadPref
+(see CGameDialog::UpdatePrefTree)
+*/
+class CPrefAssignment
+{
+public:
+  Str mName;
+  PrefTypes_t mType;
+  void *mVal;
+
+  CPrefAssignment(char *name, PrefTypes_t Type, void *Val)
+  {
+    mName = name; mType = Type; mVal = Val;
+  }
+  CPrefAssignment() { mVal = NULL; }
+  CPrefAssignment(const CPrefAssignment& ass);
+  virtual ~CPrefAssignment() { }
+  virtual CPrefAssignment& operator =(const CPrefAssignment& ass);
+};
+
+
+/*!
+generic preferences storage class, using xml files
+*/
+class CXMLPropertyBag
+{
+private:
+  /*!
+  local prefs file
+  */
+  xmlDocPtr mpDoc;
+  xmlNodePtr mpDocNode;
+
+  /*!
+  prefs assignments (what pref name, what type, what variable)
+  */
+  list<CPrefAssignment> mPrefAssignments;
+
+  /*!
+  name of file to load/save as
+  */
+  Str mStrFilename;
+
+  /*!
+  store assignment in the property list if not already there
+  */
+  void PushAssignment(char *name, PrefTypes_t type, void *pV);
+
+  /*!
+  find the xmlnode relating to the epair name
+  */
+  xmlNodePtr EpairForName(const char *name);
+
+public:
+  CXMLPropertyBag();
+  virtual ~CXMLPropertyBag() 
+  {
+    if (InUse())
+      Clear();
+  };
+
+  /*!
+  read a pref setting, if doesn't exist, will add it to the xml tree (using default value provided)
+  \arg name the name of the pref
+  \arg pV pointer to the value
+  \arg V default value
+  those functions will fill in the list of preferences assignments
+    (name, type and pointer to value)
+    this is used in UpdatePrefTree
+  */
+  void GetPref(char *name, Str *pV, char *V);
+  void GetPref(char *name, int *pV, int V);
+  void GetPref(char *name, bool *pV, bool V);
+  void GetPref(char *name, float *pV, float V);
+  void GetPref(char *name, float *pV, float* V);
+  void GetPref(char *name, window_position_t* pV, window_position_t V);
+
+  /*!
+  returns whether or not the property bag is already open
+  */
+  qboolean InUse() { return (mpDoc != NULL); };
+
+  /*!
+  unload the xml doc, and free the tree
+  */
+  void Clear();
+
+  /*|
+  read data from our XML file
+  */
+  void ReadXMLFile(const char* pFilename);
+
+  /*|
+  write out the property bag to an XML data file
+  return is success/fail
+  */
+  qboolean WriteXMLFile(const char* pFilename);
+
+  /*!
+  update the xml tree with data form the property list, usually in preparation for a write
+  */
+  void UpdatePrefTree();
+
+  /*!
+  did the file have any data or not?
+  */
+  qboolean mbEmpty;
+};
+
+/*!
+holds information for a given game
+I'm a bit unclear on that still
+it holds game specific configuration stuff
+such as base names, engine names, some game specific features to activate in the various modules
+it is not strictly a prefs thing since the user is not supposed to edit that (unless he is hacking
+support for a new game)
+
+what we do now is fully generate the information for this during the setup. We might want to
+generate a piece that just says "the game pack is there", but put the rest of the config somwhere
+else (i.e. not generated, copied over during setup .. for instance in the game tools directory)
+*/
+class CGameDescription
+{
+public:
+  xmlDocPtr mpDoc; ///< the game description xml tree
+  Str mGameToolsPath; ///< the explicit path to the game-dependent modules
+  Str mGameName; ///< name of the game used in dialogs
+  Str mGameFile; ///< the .game file that describes this game
+  Str mBaseGame; ///< basegame directory
+  Str mEnginePath; ///< path to the engine
+  Str mEngine; ///< engine name
+#if defined (__linux__) || defined (__APPLE__)
+  Str mUserPathPrefix; ///< prefix for ~/.q3a ~/.wolf init, only on *nix
+#endif
+  Str mShaderPath; ///< the path in which to look for shaders
+  Str mShaderlist; ///< shaderlist file
+  float mTextureDefaultScale; ///< default scale (0.5 in q3, 1.0 in q1/q2, 0.25 in JK2 ..)
+  bool mEClassSingleLoad; ///< only load a single eclass definition file
+  bool mNoPatch; ///< this game doesn't support patch technology
+  Str mCaulkShader; ///< the shader to use for caulking
+
+  CGameDescription() { mpDoc = NULL; }
+  /*!
+  \todo parse basic info from the node
+  user-friendly name of the game
+  essential parameters (such as the start dir)
+  */
+  CGameDescription(xmlDocPtr pDoc, const Str &GameFile);
+  virtual ~CGameDescription() { xmlFreeDoc(mpDoc); }
+
+  void Dump();
+};
+
+/*!
+select games, copy editing assets and write out configuration files
+ */
+class CGameInstall : public Dialog {
+public:
+       void Run();
+       void BuildDialog();
+
+       enum gameType_e {
+               GAME_Q3,
+               GAME_URT,
+               GAME_WARSOW
+       };
+
+protected:
+       Str m_strName;
+       Str     m_strMod;
+       Str m_strEngine;
+       int m_nComboSelect;
+};
+
+/*!
+standalone dialog for games selection, and more generally global settings
+*/
+class CGameDialog : public Dialog
+{
+  GtkWidget *mFrame; ///< this is built on-demand first time it's used
+  GtkWidget *mTopBox; ///< top level box used to store the dialog frame, must unhook after modal use
+
+
+  /*!
+  global prefs storage
+  */
+  CXMLPropertyBag mGlobalPrefs;
+
+#ifdef _WIN32
+  /*!
+  run from a network share
+  this one is not being saved out in prefs, since we need to know before we load prefs
+  we use a dummy file NETRUN_FILENAME as flag
+  all done with static stuff
+  */
+  static bool m_bNetRun;
+#endif
+
+  bool m_bDoGameInstall;
+
+  CGameInstall mGameInstall;
+
+protected:
+  
+  int m_nComboSelect; ///< intermediate int value for combo in dialog box
+
+public:
+
+  /*! 
+  those settings are saved in the global prefs file 
+  I'm too lazy to wrap behind protected access, not sure this needs to be public
+  NOTE: those are preference settings. if you change them it is likely that you would
+  have to restart the editor for them to take effect
+  */
+  /*@{*/
+  /*!
+  what game has been selected
+  this is the name of the .game file
+  */
+  Str m_sGameFile;
+  /*!
+  auto-load the game on startup
+  this is linked to auto-load checkbox
+  */
+  bool m_bAutoLoadGame;
+  /*!
+  log console to radiant.log
+  m_bForceLogConsole is an obscure forced latching situation
+  */
+  bool m_bLogConsole;
+  bool m_bForceLogConsole;
+  /*@}*/
+
+  /*!
+  points somewhere in mGames, set once at startup
+  */
+  CGameDescription *m_pCurrentGameDescription;
+
+  /*!
+  the list of game descriptions we scanned from the game/ dir
+  */
+  list<CGameDescription *> mGames;
+
+  CGameDialog() {
+         mFrame = NULL;
+         m_pCurrentGameDescription = NULL;
+         m_bLogConsole = false;
+         m_bForceLogConsole = false;
+         m_bDoGameInstall = true;      // go through DoModal at least once
+  }
+  virtual ~CGameDialog(); 
+
+  void AddPacksURL( Str &s );
+    
+  /*!
+  intialize the game dialog, called at CPrefsDlg::Init
+  will scan for games, load prefs, and do game selection dialog if needed
+  */
+  void Init();
+
+  /*!
+  reset the global settings by removing the file
+  */
+  void Reset();
+
+  /*!
+  run the dialog UI for the list of games 
+  */
+  void DoGameDialog();
+
+  /*!
+       call out to the game installation dialog
+  */
+  void DoGameInstall();
+
+  /*!
+  Dialog API
+  this is only called when the dialog is built at startup for main engine select
+  */
+  void BuildDialog();
+  void UpdateData( bool retrieve );
+
+  /*!
+  construction of the dialog frame
+  this is the part to be re-used in prefs dialog
+  for the standalone dialog, we include this in a modal box
+  for prefs, we hook the frame in the main notebook
+  build the frame on-demand (only once)
+  */
+  GtkWidget *GetGlobalFrame();
+
+  /*!
+  global preferences subsystem
+  XML-based this time, hopefully this will generalize to other prefs
+  LoadPrefs has hardcoded defaults
+  NOTE: it may not be strictly 'CGameDialog' to put the global prefs here
+    could have named the class differently I guess
+  */
+  /*@{*/
+  void LoadPrefs(); ///< load from file into variables
+  void SavePrefs(); ///< save pref variables to file
+  /*@}*/
+
+  /*!
+  read or set netrun (check file)
+  \param retrieve 
+    if false, will check if netrun file is present and will set m_bNetRun
+    if true, will create/erase the netrun file depending on m_bNetRun
+    NOTE: this is not backwards, 'retrieve' means 'retrieve from settings dialog' - in terms of UI
+  */
+  static void UpdateNetrun(bool retrieve);
+  /*!
+  get current netrun setting
+  */
+  static bool GetNetrun();
+
+private:
+  /*!
+  scan for .game files, load them
+  */
+  void ScanForGames();
+
+  /*!
+  inits g_PrefsDlg.m_global_rc_path
+  */
+  void InitGlobalPrefPath();
+
+  /*!
+  uses m_nComboItem to find the right mGames
+  */
+  CGameDescription *GameDescriptionForComboItem();
+
+  /*!
+       callback for the game install button
+  */
+  static void SInstallCallback( GtkWidget *widget, gpointer data );
+};
+
+typedef struct {
+  int nEntitySplit1;
+  int nEntitySplit2;
+  
+  window_position_t position;
+
+  window_position_t posEntityWnd;
+  window_position_t posMapInfoWnd;
+  window_position_t posCamWnd;
+  window_position_t posZWnd;
+  window_position_t posXYWnd;
+  window_position_t posXZWnd;
+  window_position_t posYZWnd;
+  window_position_t posPatchWnd;
+  window_position_t posSurfaceWnd;
+  window_position_t posEntityInfoWnd;
+
+  int nXYHeight;
+  int nZWidth;
+  int nXYWidth;
+  int nCamWidth;
+  int nCamHeight;
+  int nZFloatWidth;
+  int nState;
+} windowPosInfo_t;
+
+class PrefsDlg : public Dialog
+{
+  
+public:
+  /*!
+  local prefs file
+  */
+  CXMLPropertyBag mLocalPrefs;
+
+  // will enable/disable stuff according to the situation
+  void DoSensitivity();
+  void PreModal() { DoSensitivity(); }
+  
+  // enable/disable custom editor entry
+  void DoEditorSensitivity();
+  
+  /*!
+  this holds global level preferences
+  */
+  CGameDialog mGamesDialog;
+protected:
+  // warning about old project files
+  bool m_bWarn;
+  list<CGameDescription *> mGames;
+  
+public:
+  // last light intensity used in the CLightPrompt dialog, stored in registry
+  int m_iLastLightIntensity;
+  // these mirror what goes in the combo box
+  // see PrefDlg::m_nShader, tells wether to load NONE / COMMON or ALL shaders at parsing stage
+  enum {SHADER_NONE = 0, SHADER_COMMON, SHADER_ALL};
+
+  // Gef: updated preferences dialog
+  /*! Preference notebook page numbers */
+  enum {PTAB_FRONT = 0, PTAB_GAME_SETTINGS, PTAB_2D, PTAB_CAMERA, PTAB_TEXTURE, PTAB_LAYOUT, PTAB_MOUSE,
+        PTAB_EDITING, PTAB_STARTUP, PTAB_PATHS, PTAB_MISC, PTAB_BSPMONITOR} pref_tabs;
+  
+  GtkWidget *notebook;
+       
+  void UpdateTextureCompression();
+
+#ifdef ATIHACK_812
+  void UpdateATIHack();
+#endif
+        
+  void LoadPrefs();
+  void SavePrefs();
+  void LoadTexdefPref(texdef_t* pTexdef, char* pName);
+
+  PrefsDlg ();
+  virtual ~PrefsDlg ()
+  {
+    g_string_free (m_rc_path, true );
+    g_string_free (m_inipath, true );
+  }
+
+  /*!
+  path for global settings
+  win32: g_strAppPath
+  linux: ~/.radiant/<version>/
+  */
+  GString *m_global_rc_path;
+
+  /*!
+  path to per-game settings
+  used for various game dependant storage
+  win32: g_strGameToolsPath
+  linux: ~/.radiant/<version>/<gamename>/
+  */
+  GString *m_rc_path;
+
+  /*!
+  holds per-game settings
+  m_rc_path+"local.pref"
+  \todo FIXME at some point this should become XML property bag code too
+  */
+  GString *m_inipath;
+
+  // initialize the above paths
+  void Init();
+
+#if 0
+  // DEPRECATED: use engine path from the current game description instead
+       // path to the top-level installation
+       Str     m_strEnginePath;
+  // name of executable
+  // quake2 quake3 etc
+       Str     m_strEngine;
+  // we use this Str to store the full path to the engine: m_strEnginePath + m_strEngine
+  // it's not stored in the registry or anything, just ued for display in prefs
+  Str   m_strPrefsDlgEngine;
+#endif
+
+  // Dialog Data
+  int   m_nMouse;
+  MainFrame::EViewStyle m_nView;
+  bool  m_bTextureLock;
+  bool  m_bLoadLast;
+       // path to the project loaded at startup
+       // if g_PrefsDlg can't find the information in the ini file
+       // it will try to guess and eventually ask the user
+  Str   m_strLastProject;  
+  /*!
+  version of last loaded project file
+  says -1 if there's no version loaded
+  if it's a manually constructed project file, will be 0
+  otherwise the actual 'version' epair
+  */
+  int   m_nLastProjectVer;
+  Str   m_strLastMap;
+  bool  m_bInternalBSP;
+  bool  m_bRightClick;
+  bool  m_bSetGame;
+  bool  m_bAutoSave;
+  bool  m_bLoadLastMap;
+  bool  m_bTextureWindow;
+  bool  m_bSnapShots;
+  float m_fTinySize;
+  bool  m_bCleanTiny;
+  bool  m_bCamXYUpdate;
+  int   m_nCamDragMultiSelect;
+  bool  m_bCamDragMultiSelect;
+  bool  m_bCamFreeLook;
+  bool  m_bCamFreeLookStrafe;
+  bool m_bCamInverseMouse;
+  bool m_bCamDiscrete;
+  bool  m_bNewLightDraw;
+  Str   m_strPrefabPath;
+  int   m_nWhatGame;
+  bool  m_bALTEdge;
+  bool  m_bFaceColors;
+  bool  m_bXZVis;
+  bool  m_bYZVis;
+  bool  m_bZVis;
+  bool  m_bSizePaint;
+  bool  m_bDLLEntities;
+  bool  m_bRotateLock;
+  bool  m_bDetachableMenus;
+  bool  m_bPatchToolbar;
+  bool  m_bWideToolbar;
+  bool  m_bPluginToolbar;
+  bool  m_bNoClamp;
+       //++timo this is most likely broken, I don't know what it's supposed to do
+  Str   m_strUserPath;
+  int   m_nRotation;
+  bool  m_bChaseMouse;
+  bool  m_bTextureScrollbar;
+  bool  m_bDisplayLists;
+  bool m_bAntialiasedPointsAndLines; // Fishman - Add antialiazed points and lines support. 09/03/00
+  bool  m_bShowShaders;
+  int   m_nShader;
+  bool  m_bNoStipple;
+  int   m_nUndoLevels;
+  bool  m_bVertexSplit;
+
+  int   m_nMouseButtons;
+  int   m_nAngleSpeed;
+  int   m_nMoveSpeed;
+  int   m_nAutoSave;
+  bool  m_bCubicClipping;
+  int   m_nCubicScale;
+  bool  m_bSelectCurves;
+  bool  m_bSelectModels;
+  int   m_nEntityShowState;
+  int   m_nTextureScale;
+  bool  m_bNormalizeColors;
+  bool  m_bSwitchClip;
+  bool  m_bSelectWholeEntities;
+  int   m_nTextureQuality;
+  bool  m_bGLLighting;
+  bool  m_bTexturesShaderlistOnly;
+  int   m_nSubdivisions;
+  bool  m_bFloatingZ;
+  bool  m_bLatchedFloatingZ;
+  // Gef: Kyro GL_POINT workaround
+  bool m_bGlPtWorkaround;
+
+  // how many menus in the texture thing before we split?
+  int   m_nTextureMenuSplit;
+
+  // watch the BSP process through network connections
+  // true: trigger the BSP steps one by one and monitor them through the network
+  // false: create a BAT / .sh file and execute it. don't bother monitoring it.
+  bool  m_bWatchBSP;
+  // do we stop the compilation process if we come accross a leak?
+  bool  m_bLeakStop;
+  // timeout when beginning a step (in seconds)
+  // if we don't get a connection quick enough we assume something failed and go back to idling
+  int   m_iTimeout;
+  bool  m_bRunQuake;
+  // store prefs setting for automatic sleep mode activation
+  bool  m_bDoSleep;
+  
+  bool m_bClipCaulk;
+
+  // make the texture increments match the grid changes
+  bool m_bSnapTToGrid;
+
+  // try to fix the target/targetname conflicts when importing a map (default true)
+  bool m_bDoTargetFix;
+
+  // the increment step we use against the wheel mouse
+  int m_nWheelInc;
+
+#ifdef _WIN32
+  // use the file associations to open files instead of builtin Gtk editor
+  bool m_bUseWin32Editor;
+#else
+  // custom shader editor
+  bool m_bUseCustomEditor;
+  Str  m_strEditorCommand;  // this is the command executed
+#endif
+
+#ifdef _WIN32
+  bool m_bNativeGUI;
+  bool m_bStartOnPrimMon;
+#endif
+
+  bool m_bPatchBBoxSelect;
+
+  // RR2DO2: latched data, for settings that require a restart. We don't want to set
+  // these directly in case users set them under preferences and then continue working
+  // with the editor.
+  MainFrame::EViewStyle m_nLatchedView;
+  int m_nMRUCount;
+  Str m_strMRUFiles[4];
+
+  windowPosInfo_t mWindowInfo;
+
+  bool  m_bLatchedDetachableMenus;
+  bool  m_bLatchedPatchToolbar;
+  bool  m_bLatchedWideToolbar;
+  bool  m_bLatchedPluginToolbar;
+  int   m_nLatchedShader;
+  int   m_nLatchedTextureQuality;
+
+  // RIANT
+  // texture compression format
+  int m_nTextureCompressionFormat;
+
+  int m_nLightRadiuses;
+  
+  bool m_bQ3Map2Texturing;
+
+#ifdef ATIHACK_812
+       bool m_bGlATIHack;
+#endif
+
+  void UpdateData (bool retrieve);
+
+  /*! Utility function for swapping notebook pages for tree list selections */
+  void showPrefPage(int prefpage);
+
+protected:
+  /*! Scan for game description files and build a list */
+  void ScanForGames();
+
+  /*! Dialog API */
+  void BuildDialog ();
+  void PostModal (int code);
+};
+
+#endif // _PREFERENCES_H_