2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 // Leonardo Zide (leo@lokigames.com)
31 #if defined (__linux__) || defined (__APPLE__)
33 #include <sys/types.h>
47 #define PREF_SECTION "Prefs"
48 #define INTERNAL_SECTION "Internals"
49 #define MOUSE_KEY "MouseButtons"
50 #define WINDOW_KEY "QE4StyleWindows"
51 #define LAYOUT_KEY "WindowLayout"
52 #define RUNQ2_KEY "RunQuake2Run"
53 #define TLOCK_KEY "TextureLock"
54 #define RLOCK_KEY "RotateLock"
55 #define LOADLAST_KEY "LoadLast"
56 #define LOADLASTMAP_KEY "LoadLastMap"
57 #define LASTPROJ_KEY "LastProject"
58 #define LASTPROJVER_KEY "LastProjectKey"
59 #define LASTMAP_KEY "LastMap"
60 #define FACE_KEY "NewFaceGrab"
61 #define BSP_KEY "InternalBSP"
62 #define RCLICK_KEY "NewRightClick"
63 #define VERTEX_KEY "NewVertex"
64 #define AUTOSAVE_KEY "Autosave"
65 #define AUTOSAVETIME_KEY "AutosaveMinutes"
66 #define PAK_KEY "UsePAK"
67 #define NEWAPPLY_KEY "ApplyDismissesSurface"
68 #define HACK_KEY "Gatewayescapehack"
69 #define TEXTURE_KEY "NewTextureWindowStuff"
70 #define TINYBRUSH_KEY "CleanTinyBrushes"
71 #define TINYSIZE_KEY "CleanTinyBrusheSize"
72 #define SNAPSHOT_KEY "Snapshots"
73 #define MOVESPEED_KEY "MoveSpeed"
74 #define ANGLESPEED_KEY "AngleSpeed"
75 #define SETGAME_KEY "UseSetGame"
76 #define CAMXYUPDATE_KEY "CamXYUpdate"
77 #define CAMDRAGMULTISELECT_KEY "CamDragMultiSelect"
78 #define CAMFREELOOK_KEY "CamFreeLook"
79 #define CAMINVERSEMOUSE_KEY "CamInverseMouse"
80 #define CAMDISCRETE_KEY "CamDiscrete"
81 #define LIGHTDRAW_KEY "NewLightStyle"
82 #define WHATGAME_KEY "WhichGame"
83 #define CUBICCLIP_KEY "CubicClipping"
84 #define CUBICSCALE_KEY "CubicScale"
85 #define ALTEDGE_KEY "ALTEdgeDrag"
86 #define FACECOLORS_KEY "FaceColors"
87 #define SNAPT_KEY "SnapT"
88 #define XZVIS_KEY "XZVIS"
89 #define YZVIS_KEY "YZVIS"
90 #define ZVIS_KEY "ZVIS"
91 #define SIZEPAINT_KEY "SizePainting"
92 #define DLLENTITIES_KEY "DLLEntities"
93 #define DETACHABLEMENUS_KEY "DetachableMenus"
94 #define PATCHTOOLBAR_KEY "PatchToolBar"
95 #define WIDETOOLBAR_KEY "WideToolBar"
96 #define PLUGINTOOLBAR_KEY "PluginToolBar"
97 #define NOCLAMP_KEY "NoClamp"
98 #define PREFAB_KEY "PrefabPath"
99 #define USERINI_KEY "UserINIPath"
100 #define ROTATION_KEY "Rotation"
101 #define BUGGYICD_KEY "BuggyICD"
102 #define CHASEMOUSE_KEY "ChaseMouse"
103 #define ENTITYSHOW_KEY "EntityShow"
104 #define TEXTURESCALE_KEY "TextureScale"
105 #define TEXTURESCROLLBAR_KEY "TextureScrollbar"
106 #define DISPLAYLISTS_KEY "UseDisplayLists"
107 #define ANTIALIASEDLINES_KEY "UseAntialiasedPointsAndLines" // Fishman - Add antialiazed points and lines support. 09/03/00
108 #define NORMALIZECOLORS_KEY "NormalizeColors"
109 #define SHADERS_KEY "UseShaders"
110 #define SWITCHCLIP_KEY "SwitchClipKey"
111 #define SELWHOLEENTS_KEY "SelectWholeEntitiesKey"
112 #define TEXTURESUBSET_KEY "UseTextureSubsetLoading"
113 #define TEXTUREQUALITY_KEY "TextureQuality"
114 #define SHOWSHADERS_KEY "ShowShaders"
115 #define SHADERTEST_KEY "ShaderTest"
116 #define GLLIGHTING_KEY "UseGLLighting"
117 #define LOADSHADERS_KEY "LoadShaders"
118 #define NOSTIPPLE_KEY "NoStipple"
119 #define UNDOLEVELS_KEY "UndoLevels"
120 #define VERTEXMODE_KEY "VertexSplit"
121 #define ENGINEPATH_KEY "EnginePath"
122 #define ENGINE_KEY "Engine"
123 #define LOGCONSOLE_KEY "LogConsole"
124 #define SELECTCURVES_KEY "SelectCurves"
125 #define SELECTMODELS_KEY "SelectModels"
126 #define SHADERLISTONLY_KEY "ShowShaderlistOnly"
127 #define WATCHBSP_KEY "WatchBSP"
128 #define LEAKSTOP_KEY "LeakStop"
129 #define DOSLEEP_KEY "SleepMode"
130 #define SUBDIVISIONS_KEY "Subdivisions"
131 #define CLIPCAULK_KEY "ClipCaulk"
132 #define PATCHSHOWBOUNDS_KEY "PatchShowBounds"
133 #define NATIVEGUI_KEY "NativeGUI"
134 #define STARTONPRIMMON_KEY "StartOnPrimMon"
135 #define NOSYSMENUPOPUPS_KEY "NoSysMenuPopups"
136 #define SNAPTTOGRID_KEY "SnapTToGrid"
137 #define FLOATINGZ_KEY "FloatingZ"
138 #define TARGETFIX_KEY "TargetFix"
139 #define GLPOINTWORKAROUND_KEY "GlPointWorkaround" // Gef: Workaround for broken Kyro * gl driver 25-aug-2001
140 #define WHEELINC_KEY "WheelMouseInc"
141 #define PATCHBBOXSEL_KEY "PatchBBoxSel"
142 #define LASTLIGHTINTENSITY_KEY "LastLightIntensity"
143 #define CUSTOMSHADEREDITOR_KEY "UseCustomShaderEditor"
144 #define CUSTOMSHADEREDITORCOMMAND_KEY "CustomShaderEditorCommand"
145 #define TEXTURECOMPRESSIONFORMAT_KEY "TextureCompressionFormat"
146 #define LIGHTRADIUS_KEY "LightRadiuses"
147 #define Q3MAP2TEX_KEY "Q3Map2Tex"
148 #define ATIHACK_KEY "ATIHack"
151 #define ENTITYSPLIT1_KEY "EntitySplit1"
152 #define ENTITYSPLIT2_KEY "EntitySplit2"
153 #define POSITIONX_KEY "PositionX"
154 #define POSITIONY_KEY "PositionY"
155 #define ENTITYWND_KEY "EntityWnd"
156 #define MAPINFOWND_KEY "MapInfoDlg"
157 #define CAMWND_KEY "CamWnd"
158 #define ZWND_KEY "ZWnd"
159 #define XYWND_KEY "XYWnd"
160 #define XZWND_KEY "XZWnd"
161 #define YZWND_KEY "YZWnd"
162 #define PATCHWND_KEY "PatchWnd"
163 #define SURFACEWND_KEY "SurfaceWnd"
164 #define ENTITYINFOWND_KEY "EntityInfoDlg"
165 #define WIDTH_KEY "Width"
166 #define HEIGHT_KEY "Height"
167 #define ZWIDTH_KEY "ZWidth"
168 #define XYHEIGHT_KEY "XYHeight"
169 #define XYWIDTH_KEY "XYWidth"
170 #define CAMWIDTH_KEY "CamWidth"
171 #define CAMHEIGHT_KEY "CamHeight"
172 #define ZFLOATWIDTH_KEY "ZWidthFloating"
173 #define STATE_KEY "State"
176 #define COUNT_KEY "Count"
177 #define FILE_KEY "File"
180 #define SI_TEXMENU_KEY "SI_TexMenu"
181 #define SI_GAMMA_KEY "SI_Gamma"
182 #define SI_COLORS_KEY "SI_Colors"
183 #define SI_EXCLUDE_KEY "SI_Exclude"
184 #define SI_INCLUDE_KEY "SI_Include"
185 #define SI_SURFACE_TEXDEF_KEY "SI_SurfaceTexdef"
186 #define SI_PATCH_TEXDEF_KEY "SI_PatchTexdef"
187 #define SI_AXISCOLORS_KEY "SI_AxisColors"
188 #define SI_SHOWNAMES_KEY "SI_ShowNames"
189 #define SI_SHOWCOORDS_KEY "SI_ShowCoords"
190 #define SI_SHOWANGLES_KEY "SI_ShowAngles"
191 #define SI_SHOWOUTLINES_KEY "SI_ShowOutlines"
192 #define SI_SHOWAXIS_KEY "SI_ShowAxis"
193 #define SI_NOSELOUTLINES_KEY "SI_NoSelectedOutlines"
194 #define SI_OUTLINESTYLE_KEY "SI_OutLineStyle"
197 #define TD_SCALE1_KEY "_Scale1"
198 #define TD_SCALE2_KEY "_Scale2"
199 #define TD_SHIFT1_KEY "_Shift1"
200 #define TD_SHIFT2_KEY "_Shift2"
201 #define TD_ROTATE_KEY "_Rotate"
206 #define WATCHBSP_DEF 1
208 #define LOADLAST_DEF 1
210 #define SUBDIVISIONS_DEF 4
212 void WindowPosition_Parse(window_position_t& m_value, const CString& value)
214 if(sscanf(value.GetBuffer(), "%d %d %d %d", &m_value.x, &m_value.y, &m_value.w, &m_value.h) != 4)
215 m_value.x = m_value.y = m_value.w = m_value.h = -1;
218 void WindowPosition_Write(const window_position_t& m_value, CString& value)
221 sprintf(buffer, "%d %d %d %d", m_value.x, m_value.y, m_value.w, m_value.h);
226 CXMLPropertyBag::CXMLPropertyBag() {
232 // generic preference functions
234 void CXMLPropertyBag::PushAssignment(char *name, PrefTypes_t type, void *pV)
236 list<CPrefAssignment>::iterator iAssign;
237 for(iAssign=mPrefAssignments.begin(); iAssign!=mPrefAssignments.end(); iAssign++)
239 if ((*iAssign).mName == name)
241 // we have it already, check anyway
242 if (pV != (*iAssign).mVal)
244 Sys_FPrintf(SYS_ERR, "PushAssignment, '%s' has different mVal\n", name);
249 // ok, it's not in our list yet
250 mPrefAssignments.push_front(CPrefAssignment(name, type, pV));
253 xmlNodePtr CXMLPropertyBag::EpairForName(const char *name)
255 xmlNodePtr ret = NULL;
257 xmlNodePtr pNode = mpDocNode->children;
258 while (pNode != NULL)
260 if(pNode->type == XML_ELEMENT_NODE)
262 xmlAttrPtr tmp_attr_ptr = xmlHasProp(pNode, (xmlChar *)"name");
263 if (tmp_attr_ptr != NULL && !strcmp(name, (char *)tmp_attr_ptr->children->content))
266 Sys_FPrintf( SYS_WRN, "WARNING: dupe property in CXMLPropertyBag::EpairForName '%s'\n", name );
277 void CXMLPropertyBag::GetPref(char *name, Str *pV, char *V)
279 xmlNodePtr pNode = EpairForName( name );
282 if ( pNode->children && pNode->children->content ) {
283 *pV = pNode->children->content;
285 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=427
286 // means the pref exists, and that the value is ""
292 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)V);
293 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
295 // push the pref assignment if needed
296 PushAssignment(name, PREF_STR, pV);
299 void CXMLPropertyBag::GetPref(char *name, int *pV, int V)
302 if ((pNode = EpairForName(name)) && pNode->children && pNode->children->content)
304 *pV = atoi((char *)pNode->children->content);
310 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)s);
311 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
314 // push the pref assignment if needed
315 PushAssignment(name, PREF_INT, pV);
318 void CXMLPropertyBag::GetPref(char *name, bool *pV, bool V)
321 if ((pNode = EpairForName(name)) && pNode->children && pNode->children->content)
323 if (!strcmp((char *)pNode->children->content, "true"))
335 V ? strcpy(s, "true") : strcpy(s, "false");
336 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)s);
337 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
340 // push the pref assignment
341 PushAssignment(name, PREF_BOOL, pV);
344 void CXMLPropertyBag::GetPref(char *name, float *pV, float V)
347 if ((pNode = EpairForName(name)) && pNode->children && pNode->children->content)
349 *pV = atof((char *)pNode->children->content);
355 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)s);
356 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
359 // push the pref assignment if needed
360 PushAssignment(name, PREF_FLOAT, pV);
363 void CXMLPropertyBag::GetPref(char *name, float* pV, float* V)
366 if ((pNode = EpairForName(name)) && pNode->children && pNode->children->content)
368 sscanf((char *)pNode->children->content, "%f %f %f", &pV[0], &pV[1], &pV[2]);
373 sprintf(s, "%f %f %f", V[0], V[1], V[2]);
374 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)s);
375 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
380 // push the pref assignment if needed
381 PushAssignment(name, PREF_VEC3, pV);
384 void CXMLPropertyBag::GetPref(char *name, window_position_t* pV, window_position_t V)
387 if ((pNode = EpairForName(name)) && pNode->children && pNode->children->content)
389 WindowPosition_Parse(*pV, CString((xmlChar *)pNode->children->content));
394 WindowPosition_Write(V, str);
395 pNode = xmlNewChild(mpDocNode, NULL, (xmlChar *)"epair", (xmlChar *)str.GetBuffer());
396 xmlSetProp(pNode, (xmlChar *)"name", (xmlChar *)name);
399 // push the pref assignment if needed
400 PushAssignment(name, PREF_WNDPOS, pV);
403 void CXMLPropertyBag::UpdatePrefTree()
405 // read the assignments and update the tree
406 list<CPrefAssignment>::iterator iPref;
407 for(iPref = mPrefAssignments.begin(); iPref != mPrefAssignments.end(); iPref++)
409 CPrefAssignment *pPref = &(*iPref);
414 pNode = EpairForName(pPref->mName.GetBuffer());
415 // we never expect that the node could not be found, because this is supposed to happen
416 // after the tree was built with GetPref calls, never on a blank tree
419 Sys_FPrintf(SYS_ERR, "Unexpected EpairForName '%s' not found in UpdatePrefTree\n", pPref->mName.GetBuffer());
422 switch ((*iPref).mType)
425 xmlNodeSetContent(pNode, (const xmlChar *)((Str *)pPref->mVal)->GetBuffer());
428 sprintf(s, "%d", *(int *)pPref->mVal);
429 xmlNodeSetContent(pNode, (xmlChar *)s);
432 sprintf(s, "%f", *(float *)pPref->mVal);
433 xmlNodeSetContent(pNode, (xmlChar *)s);
436 *(bool *)pPref->mVal ? strcpy(s, "true") : strcpy(s, "false");
437 xmlNodeSetContent(pNode, (xmlChar *)s);
441 float* v = (float*)pPref->mVal;
442 sprintf(s, "%f %f %f", v[0], v[1], v[2]);
443 xmlNodeSetContent(pNode, (xmlChar *)s);
449 WindowPosition_Write(*(window_position_t*)pPref->mVal, str);
450 xmlNodeSetContent(pNode, (xmlChar*)str.GetBuffer());
457 void CXMLPropertyBag::Clear()
468 void CXMLPropertyBag::ReadXMLFile(const char* pFilename)
470 mpDoc = xmlParseFile(pFilename);
475 mpDocNode = mpDoc->children;
476 xmlAttrPtr tmp_attr_ptr = xmlHasProp(mpDocNode, (xmlChar *)"version");
477 if (strcmp((char *)mpDocNode->name, "qpref"))
479 Sys_FPrintf(SYS_ERR, "Unrecognized node '%s' in '%s'\n", mpDocNode->name, mpDoc->URL);
483 else if (tmp_attr_ptr != NULL && strcmp((char*)tmp_attr_ptr->children->content, "1"))
485 Sys_FPrintf(SYS_ERR, "Wrong version '%s' in <qpref> node for '%s'\n", (char*)tmp_attr_ptr->children->content, mpDoc->URL);
489 Sys_Printf("Opened XML property file: '%s'\n", pFilename);
495 // no document, create one
496 mpDoc = xmlNewDoc((xmlChar *)"1.0");
497 mpDocNode = xmlNewDocNode(mpDoc, NULL, (xmlChar *)"qpref", NULL);
498 xmlDocSetRootElement(mpDoc, mpDocNode);
499 xmlSetProp(mpDocNode, (xmlChar *)"version", (xmlChar *)"1");
500 Sys_Printf("XML property file '%s' invalid/not found, creating blank properties tree\n", pFilename);
504 qboolean CXMLPropertyBag::WriteXMLFile(const char* pFilename)
506 int res = xmlSaveFormatFile(pFilename, mpDoc, 1);
511 Sys_Printf("Wrote XML property file '%s'\n", pFilename);
515 // =============================================================================
516 // Widget callbacks for PrefsDlg
519 // browse for custom editor executable
520 static void OnBtnBrowseEditor (GtkWidget *widget, gpointer data)
522 PrefsDlg *dlg = (PrefsDlg*)data;
524 const char *filename = file_dialog(g_PrefsDlg.GetWidget(), TRUE, "Executable for Custom Editor");
528 dlg->m_strEditorCommand = filename;
529 dlg->UpdateData(FALSE);
534 static void OnBtnBrowseprefab (GtkWidget *widget, gpointer data)
536 PrefsDlg *dlg = (PrefsDlg*)data;
537 char *path = dlg->m_strPrefabPath;
538 if (strlen (path) == 0)
539 path = g_strGameToolsPath;
540 char *dir = dir_dialog (g_PrefsDlg.GetWidget (), "Set prefab path", path);
541 dlg->UpdateData(TRUE);
548 dlg->m_strPrefabPath = strPath;
549 dlg->UpdateData(FALSE);
554 static void OnBtnBrowseuserini (GtkWidget *widget, gpointer data)
556 PrefsDlg *dlg = (PrefsDlg*)data;
557 char *path = dlg->m_strUserPath;
558 if (strlen (path) == 0)
559 path = g_strGameToolsPath;
561 const char *filename = file_dialog (g_PrefsDlg.GetWidget(), TRUE, "Find INI file", path);
563 if (filename != NULL)
565 dlg->UpdateData(TRUE);
566 dlg->m_strUserPath = filename;
567 dlg->UpdateData(FALSE);
571 static void OnButtonClean (GtkWidget *widget, gpointer data)
573 // make sure this is what the user wants
574 if (gtk_MessageBox (g_PrefsDlg.GetWidget (), "This will close Radiant and clean the corresponding registry entries.\n"
575 "Next time you start Radiant it will be good as new. Do you wish to continue?",
576 "Reset Registry", MB_YESNO) == IDYES)
578 PrefsDlg *dlg = (PrefsDlg*)data;
579 dlg->EndModal (IDCANCEL);
581 g_qeglobals.disable_ini = true;
582 remove (dlg->m_inipath->str);
584 sprintf(buf, "%sSavedInfo.bin", dlg->m_rc_path->str);
586 HandleCommand (NULL, GINT_TO_POINTER (ID_FILE_EXIT));
591 // =============================================================================
594 // IMPORTANT NOTE: the values here don't matter very much
595 // the actual intialization if you start with an empty .ini is done when loading the prefs for the first time
596 // profile_load_int takes an argument to use if the value is not found
597 PrefsDlg::PrefsDlg ()
601 m_nView = MainFrame::eRegular;
603 m_bInternalBSP = FALSE;
604 m_bRightClick = FALSE;
608 m_bLoadLastMap = FALSE;
609 m_bTextureWindow = FALSE;
610 m_bSnapShots = FALSE;
612 m_bCleanTiny = FALSE;
613 m_bCamXYUpdate = TRUE;
614 m_bCamDragMultiSelect = FALSE;
615 m_bCamFreeLook = TRUE;
616 m_bCamFreeLookStrafe = FALSE;
617 m_bCamInverseMouse = FALSE;
618 m_bCamDiscrete = TRUE;
619 m_bNewLightDraw = FALSE;
620 m_strPrefabPath = "";
623 m_bFaceColors = FALSE;
627 m_bSizePaint = FALSE;
628 m_bDLLEntities = FALSE;
630 m_bDetachableMenus = FALSE; // Most win32 users will find detachable menus annoying
632 m_bDetachableMenus = TRUE; // Linux/Apple users are used to them...
634 m_bPatchToolbar = TRUE;
635 m_bWideToolbar = TRUE;
636 m_bPluginToolbar = TRUE;
640 m_bChaseMouse = FALSE;
641 m_bTextureScrollbar = TRUE;
642 m_bDisplayLists = TRUE;
643 m_bAntialiasedPointsAndLines = FALSE; // Fishman - Add antialiazed points and lines support. 09/03/00
644 m_bShowShaders = FALSE;
646 m_bNoStipple = FALSE;
647 m_bVertexSplit = FALSE;
648 m_bSelectCurves = TRUE;
649 m_bSelectModels = TRUE;
650 m_nEntityShowState = ENTITY_SKINNED_BOXED;
652 m_bSwitchClip = FALSE;
653 m_bSelectWholeEntities = TRUE;
654 m_nTextureQuality = 3;
655 m_bShowShaders = TRUE;
656 m_bGLLighting = FALSE;
659 m_bTexturesShaderlistOnly = FALSE;
660 // paths to ini files
670 m_bFloatingZ = FALSE;
671 m_bGlPtWorkaround = FALSE; // Gef: Kyro/GL_POINTS workaround 25-aug-2001
673 m_bNativeGUI = FALSE;
674 m_bStartOnPrimMon = FALSE;
676 m_global_rc_path = NULL;
678 m_bUseWin32Editor = TRUE;
680 // custom shader editor options
681 m_bUseCustomEditor = FALSE;
682 m_strEditorCommand = "";
684 m_nLightRadiuses = 1;
685 m_bQ3Map2Texturing = TRUE;
687 m_bGlATIHack = FALSE;
692 =========================================================
693 Games selection dialog
694 =========================================================
697 CGameDescription::CGameDescription(xmlDocPtr pDoc, const Str &GameFile)
701 // read the user-friendly game name
702 xmlNodePtr pNode = mpDoc->children;
704 while (strcmp((const char*)pNode->name, "game") && pNode != NULL) pNode=pNode->next;
707 ///< \todo add the file name (this node and gametools should all be part of CGameDescription anyway)
708 Error("Didn't find 'game' node in the game description file '%s'\n", pDoc->URL);
710 // on win32, game tools path can now be specified relative to the exe's cwd
711 prop = (char*)xmlGetProp( pNode, (xmlChar*)"gametools" );
712 if ( prop == NULL ) {
713 Error( "Didn't find 'gametools' node in the game description file '%s'\n", pDoc->URL );
718 _fullpath( full, prop, PATH_MAX );
720 strncpy( full, prop, PATH_MAX );
724 for ( p = full; *p != '\0'; p++ ) {
728 mGameToolsPath = full;
729 if ( p != full && *(p-1) != '/' ) {
730 mGameToolsPath += "/";
735 prop = (char*)xmlGetProp(pNode, (xmlChar*)"name");
738 Sys_FPrintf(SYS_WRN, "Warning, 'name' attribute not found in '%s'\n", pDoc->URL);
739 mGameName = pDoc->URL;
747 mGameFile = GameFile;
749 prop = (char*)xmlGetProp(pNode, (xmlChar*)"quake2");
761 prop = (char*)xmlGetProp(pNode, (xmlChar*)"basegame");
765 mBaseGame = "baseq3";
773 // on win32, engine path can now be specified relative to the exe's cwd
774 prop = (char*)xmlGetProp(pNode, (const xmlChar *)"enginepath");
775 if ( prop != NULL ) {
778 _fullpath( full, prop, PATH_MAX );
780 strncpy( full, prop, PATH_MAX );
784 // process seperators
785 for ( p = full; *p != '\0'; p++ ) {
791 if ( p != full && *(p-1) != '/' ) {
797 // if engine path was not specified in the .game, it implies we can guess it from the gametools path
798 // on win32, and for most game package, the gametools are installed with the game
799 char aux_path[PATH_MAX]; // aux
800 strcpy( aux_path, mGameToolsPath.GetBuffer() );
801 if ( ( aux_path[ strlen(aux_path)-1 ] == '/' ) || ( aux_path[ strlen(aux_path)-1 ] == '\\' ) ) {
802 aux_path[strlen(aux_path)-1] = '\0'; // strip ending '/' if any
804 char up_path[PATH_MAX]; // up one level
805 ExtractFilePath( aux_path, up_path );
806 mEnginePath = up_path;
809 prop = (char*)xmlGetProp(pNode, (xmlChar*)"engine");
813 mEngine = "quake3.exe";
817 mEngine = "Quake3.app";
826 #if defined (__linux__) || defined (__APPLE__)
828 prop = (char*)xmlGetProp(pNode, (const xmlChar *)"prefix");
831 mUserPathPrefix = prop;
835 mShaderPath = xmlGetProp(pNode, (const xmlChar *)"shaderpath");
836 if (!mShaderPath.GetLength())
838 mShaderPath = "scripts/";
839 mShaderlist = "scripts/shaderlist.txt";
843 AddSlash(mShaderPath);
844 mShaderlist = mShaderPath;
845 mShaderlist += "shaderlist.txt";
847 xmlChar* default_scale = xmlGetProp(pNode, (const xmlChar *)"default_scale");
850 mTextureDefaultScale = atof((const char *)default_scale);
851 xmlFree(default_scale);
854 mTextureDefaultScale = 0.5f;
855 xmlChar* eclass_singleload = xmlGetProp(pNode, (const xmlChar*)"eclass_singleload");
856 if (eclass_singleload)
858 mEClassSingleLoad = true;
859 xmlFree(eclass_singleload);
862 mEClassSingleLoad = false;
863 xmlChar* no_patch = xmlGetProp(pNode, (const xmlChar *)"no_patch");
871 xmlChar* caulk_shader = xmlGetProp(pNode, (const xmlChar *)"caulk_shader");
874 mCaulkShader = caulk_shader;
875 xmlFree(caulk_shader);
878 mCaulkShader = "textures/common/caulk";
881 void CGameDescription::Dump()
884 if (CGameDialog::GetNetrun())
885 Sys_Printf("Running in network mode, prefs path set to '%s'\n", g_strTempPath.GetBuffer());
887 Sys_Printf("game name : '%s'\n", mGameName.GetBuffer());
888 Sys_Printf("game file : '%s'\n", mGameFile.GetBuffer());
889 Sys_Printf("game path : '%s'\n", mGameToolsPath.GetBuffer());
890 Sys_Printf("base game : '%s'\n", mBaseGame.GetBuffer());
891 Sys_Printf("engine path : '%s'\n", mEnginePath.GetBuffer());
892 Sys_Printf("engine : '%s'\n", mEngine.GetBuffer());
893 Sys_Printf("shaderlist : '%s'\n", mShaderlist.GetBuffer());
894 Sys_Printf("caulk shader: '%s'\n", mCaulkShader.GetBuffer());
895 #if defined (__linux__) || defined (__APPLE__)
896 Sys_Printf("prefix : '%s'\n", mUserPathPrefix.GetBuffer());
898 Sys_Printf("default texture scale: %g\n", mTextureDefaultScale);
899 Sys_Printf("single eclass load : %s\n", mEClassSingleLoad ? "Yes" : "No");
900 Sys_Printf("patches supported : %s\n", mNoPatch ? "No" : "Yes");
903 CPrefAssignment& CPrefAssignment::operator = (const CPrefAssignment& ass)
914 CPrefAssignment::CPrefAssignment(const CPrefAssignment& ass)
919 void CGameDialog::LoadPrefs()
923 // if we already have a document loaded, we will free and reload from file
924 if (mGlobalPrefs.InUse())
926 Sys_Printf("Reloading global prefs from file\n");
927 mGlobalPrefs.Clear();
930 // load global .pref file
931 CString strGlobalPref = g_PrefsDlg.m_global_rc_path->str;
932 strGlobalPref += "global.pref";
934 mGlobalPrefs.ReadXMLFile(strGlobalPref.GetBuffer());
936 mGlobalPrefs.GetPref("gamefile", &m_sGameFile, ""); // NOTE: there's no default, user HAS to select something
937 mGlobalPrefs.GetPref("autoload", &m_bAutoLoadGame, false);
938 mGlobalPrefs.GetPref("log console", &m_bLogConsole, false);
939 // in a very particular post-.pid startup
940 // we may have the console turned on and want to keep it that way
941 // so we use a latching system
942 if (m_bForceLogConsole)
944 m_bLogConsole = true;
945 Sys_Printf("console logging has been latched on, saving prefs\n");
947 m_bForceLogConsole = false;
950 // console logging: call Sys_LogConsole to check console logging status
951 // it is important that we would log console as early as possible to make it useful
954 if (mGlobalPrefs.mbEmpty)
956 Sys_Printf("Saving global.pref with default pref values\n");
961 void CGameDialog::SavePrefs()
963 // update the tree and save it
964 mGlobalPrefs.UpdatePrefTree();
966 CString strGlobalPref = g_PrefsDlg.m_global_rc_path->str;
967 strGlobalPref += "global.pref";
969 if (!mGlobalPrefs.WriteXMLFile(strGlobalPref.GetBuffer()))
970 Sys_FPrintf(SYS_ERR, "Error occured while saving global prefs file '%s'\n", strGlobalPref.GetBuffer());
973 void CGameDialog::DoGameInstall() {
977 void CGameDialog::DoGameDialog() {
978 // allow looping the game selection dialog with calls to the game configure dialog in between
979 while ( m_bDoGameInstall ) {
981 m_bDoGameInstall = false;
985 if ( m_bDoGameInstall ) {
988 // and we will loop to do another DoModal dialog
992 // unhook so we can use in other places
993 // we manually incref'ed it when creating, it won't be freed (destructor)
994 gtk_container_remove( GTK_CONTAINER( mTopBox ), GetGlobalFrame() );
996 // we save the prefs file
1000 GtkWidget* CGameDialog::GetGlobalFrame()
1002 GtkWidget *vbox, *text, *combo, *check;
1004 if ( mFrame != NULL ) {
1008 mFrame = gtk_frame_new( NULL );
1009 gtk_container_set_border_width( GTK_CONTAINER( mFrame ), 5 );
1010 gtk_widget_show( mFrame );
1012 vbox = gtk_vbox_new( FALSE, 6 );
1013 gtk_widget_show( vbox );
1014 gtk_container_add( GTK_CONTAINER( mFrame ), vbox );
1015 gtk_container_set_border_width( GTK_CONTAINER( vbox ), 5 );
1017 text = gtk_label_new( "Select the game:" );
1018 gtk_widget_show( text );
1019 gtk_box_pack_start( GTK_BOX( vbox ), text, FALSE, FALSE, 0 );
1021 combo = gtk_combo_new();
1022 gtk_widget_show( combo );
1023 gtk_box_pack_start( GTK_BOX( vbox ), combo, FALSE, FALSE, 0 );
1025 // fill in with the game descriptions
1026 GList *combo_list = (GList*)NULL;
1027 list<CGameDescription *>::iterator iGame;
1028 for( iGame = mGames.begin(); iGame != mGames.end(); iGame++ ) {
1029 combo_list = g_list_append( combo_list, (void *)(*iGame)->mGameName.GetBuffer() );
1031 gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
1032 g_list_free( combo_list );
1034 AddDialogData( combo, &m_nComboSelect, DLG_COMBO_INT );
1036 check = gtk_check_button_new_with_label( "Auto load selected game on startup" );
1037 gtk_widget_show(check);
1038 gtk_box_pack_start (GTK_BOX(vbox), check, FALSE, FALSE, 0);
1039 AddDialogData (check, &m_bAutoLoadGame, DLG_CHECK_BOOL);
1041 text = gtk_label_new("(this frame is available in the prefs menu if you set auto-select)");
1042 gtk_widget_show(text);
1043 gtk_box_pack_start (GTK_BOX(vbox), text, FALSE, FALSE, 0);
1046 check = gtk_check_button_new_with_label( "Networked install - per-user settings" );
1047 gtk_widget_show( check );
1048 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
1049 AddDialogData( check, &m_bNetRun, DLG_CHECK_BOOL );
1052 check = gtk_check_button_new_with_label( "Log the console to radiant.log" );
1053 gtk_widget_show( check );
1054 gtk_box_pack_start( GTK_BOX( vbox ), check, FALSE, FALSE, 0 );
1055 AddDialogData( check, &m_bLogConsole, DLG_CHECK_BOOL );
1057 // incref it so we can pass it around
1058 gtk_widget_ref( GTK_WIDGET( mFrame ) );
1063 void CGameDialog::UpdateData( bool retrieve ) {
1066 // use m_sGameFile to set m_nComboSelect
1067 list<CGameDescription *>::iterator iGame;
1069 for(iGame=mGames.begin(); iGame!=mGames.end(); iGame++)
1071 if ((*iGame)->mGameFile == m_sGameFile)
1079 UpdateNetrun(false);
1082 Dialog::UpdateData(retrieve);
1085 // use m_nComboSelect to set m_sGameFile
1086 list<CGameDescription *>::iterator iGame = mGames.begin();
1088 for(i=0; i<m_nComboSelect; i++)
1092 m_sGameFile = (*iGame)->mGameFile;
1099 void CGameDialog::SInstallCallback( GtkWidget *widget, gpointer data ) {
1100 CGameDialog *d = static_cast< CGameDialog* >( data );
1101 d->m_bDoGameInstall = true;
1105 void CGameDialog::BuildDialog() {
1106 GtkWidget *dlg, *vbox1, *button, *setup_button;
1109 gtk_window_set_title( GTK_WINDOW( dlg ), "Select Game" );
1111 vbox1 = gtk_vbox_new( FALSE, 0 );
1112 gtk_widget_show( vbox1 );
1113 gtk_container_add( GTK_CONTAINER( dlg ), vbox1 );
1115 gtk_container_add( GTK_CONTAINER( vbox1 ), GetGlobalFrame() );
1118 setup_button = gtk_button_new_with_label( "Configure more games" );
1119 gtk_widget_show( setup_button );
1120 gtk_box_pack_start( GTK_BOX( vbox1 ), setup_button, FALSE, FALSE, 0 );
1121 gtk_signal_connect( GTK_OBJECT( setup_button ), "clicked",
1122 GTK_SIGNAL_FUNC( SInstallCallback ), this );
1124 button = gtk_button_new_with_label( "OK" );
1125 gtk_widget_show( button );
1126 gtk_box_pack_start( GTK_BOX( vbox1 ), button, FALSE, FALSE, 0 );
1127 AddModalButton( button, IDOK );
1129 gtk_widget_set_usize( button, 60, -2 );
1132 void CGameDialog::ScanForGames()
1137 CString strGamesPath = g_strAppPath.GetBuffer();
1138 strGamesPath += "games";
1139 const char *path = strGamesPath.GetBuffer();
1141 if ( !mGames.empty() ) {
1142 Sys_Printf( "Clearing game list\n" );
1143 list<CGameDescription*>::iterator iGame;
1144 for ( iGame = mGames.begin(); iGame != mGames.end(); iGame++ ) {
1150 Sys_Printf( "Scanning for game description files: %s\n", path );
1154 do we put game description files below g_strAppPath, or in ~/.radiant
1155 i.e. read only or read/write?
1156 my guess .. readonly cause it's an install
1157 we will probably want to add ~/.radiant/<version>/games/ scanning on top of that for developers
1158 (if that's really needed)
1161 // FIXME need to catch the 'no game description' situation and exit with a clean error
1163 dir = g_dir_open(path, 0, NULL);
1169 const gchar* name = g_dir_read_name(dir);
1173 dirlist = g_strdup(name);
1177 char *ext = strrchr (dirlist, '.');
1178 if ((ext == NULL) || (strcmp (ext, ".game") != 0))
1180 strPath.Format("%s/%s", path, dirlist);
1181 Sys_Printf("%s\n", strPath.GetBuffer());
1183 xmlDocPtr pDoc = xmlParseFile(strPath.GetBuffer());
1186 mGames.push_front( new CGameDescription( pDoc, dirlist ) );
1190 Sys_FPrintf(SYS_ERR, "XML parser failed on '%s'\n", strPath.GetBuffer());
1199 CGameDescription* CGameDialog::GameDescriptionForComboItem()
1201 list<CGameDescription *>::iterator iGame;
1203 for(iGame=mGames.begin(); iGame!=mGames.end(); iGame++,i++)
1205 if (i == m_nComboSelect)
1210 return NULL; // not found
1213 void CGameDialog::InitGlobalPrefPath()
1215 GString *global_rc_path;
1216 // configure m_global_rc_path
1217 // this is the g_strTempPath, and it has already been mkdir'ed
1218 global_rc_path = g_string_new(g_strTempPath.GetBuffer());
1219 g_PrefsDlg.m_global_rc_path = global_rc_path;
1222 void CGameDialog::Reset()
1224 if (!g_PrefsDlg.m_global_rc_path)
1225 InitGlobalPrefPath();
1226 CString strGlobalPref = g_PrefsDlg.m_global_rc_path->str;
1227 strGlobalPref += "global.pref";
1228 remove(strGlobalPref.GetBuffer());
1231 void CGameDialog::Init()
1233 InitGlobalPrefPath();
1235 if ( mGames.empty() ) {
1238 if ( mGames.empty() ) {
1239 Error( "No games setup, aborting\n" );
1243 if ( m_bAutoLoadGame ) {
1244 // search by .game name
1245 list<CGameDescription *>::iterator iGame;
1246 for(iGame=mGames.begin(); iGame!=mGames.end(); iGame++)
1248 if ((*iGame)->mGameFile == m_sGameFile)
1250 m_pCurrentGameDescription = (*iGame);
1255 if ( !m_bAutoLoadGame || !m_pCurrentGameDescription ) {
1257 // use m_nComboSelect to identify the game to run as and set the globals
1258 m_pCurrentGameDescription = GameDescriptionForComboItem();
1259 if ( !m_pCurrentGameDescription ) {
1260 Error("Lookup of game description object failed, can't continue\n");
1263 g_pGameDescription = m_pCurrentGameDescription;
1265 g_strGameToolsPath = g_pGameDescription->mGameToolsPath;
1267 // NOTE TTimo: this is moved from QE_LoadProject in 1.2
1268 // (probably broken)
1269 // NOTE Hydra: was broken for win32, we don't use m_strHomeGame or m_strFSBasePath
1270 #if defined (__linux__) || defined (__APPLE__)
1271 g_qeglobals.m_strHomeGame = g_get_home_dir();
1272 g_qeglobals.m_strHomeGame += "/";
1273 g_qeglobals.m_strHomeGame += m_pCurrentGameDescription->mUserPathPrefix.GetBuffer();
1274 g_qeglobals.m_strHomeGame += "/";
1276 g_qeglobals.m_strHomeGame = g_pGameDescription->mEnginePath.GetBuffer();
1279 g_pGameDescription->Dump();
1282 CGameDialog::~CGameDialog()
1286 // NOTE I'm not too sure how reliable this is
1287 gtk_widget_unref(GTK_WIDGET(mFrame));
1289 // free all the game descriptions
1290 list<CGameDescription *>::iterator iGame;
1291 for(iGame=mGames.begin(); iGame!=mGames.end(); iGame++)
1298 void CGameDialog::AddPacksURL(Str &URL)
1300 // add the URLs for the list of game packs installed
1301 // FIXME: this is kinda hardcoded for now..
1302 list<CGameDescription *>::iterator iGame;
1303 for(iGame=mGames.begin(); iGame!=mGames.end(); iGame++)
1305 if ((*iGame)->mGameFile == "q3.game")
1306 URL += "&Games_dlup%5B%5D=1";
1307 else if ((*iGame)->mGameFile == "wolf.game")
1308 URL += "&Games_dlup%5B%5D=2";
1309 else if ((*iGame)->mGameFile == "wolf.game")
1310 URL += "&Games_dlup%5B%5D=3";
1311 else if ((*iGame)->mGameFile == "jk2.game")
1312 URL += "&Games_dlup%5B%5D=4";
1313 else if ((*iGame)->mGameFile == "stvef.game")
1314 URL += "&Games_dlup%5B%5D=5";
1315 else if ((*iGame)->mGameFile == "sof2.game")
1316 URL += "&Games_dlup%5B%5D=6";
1317 else if ((*iGame)->mGameFile == "ja.game")
1318 URL += "&Games_dlup%5B%5D=7";
1324 #define NETRUN_FILENAME "netrun.conf"
1326 bool CGameDialog::m_bNetRun;
1328 void CGameDialog::UpdateNetrun(bool retrieve)
1332 strNetrun = g_strAppPath; strNetrun += NETRUN_FILENAME;
1335 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=639
1336 // now check if we are running from a network installation
1337 // use a dummy file as the flag
1338 f_netrun = fopen(strNetrun.GetBuffer(), "r");
1351 f_netrun = fopen(strNetrun.GetBuffer(), "w");
1354 Sys_FPrintf(SYS_ERR, "ERROR: Failed to create netrun file '%s'\n", strNetrun.GetBuffer());
1360 Sys_Printf("Created/Checked '%s'\n", strNetrun.GetBuffer());
1365 if (remove(strNetrun.GetBuffer()) == -1)
1367 if (errno != ENOENT)
1368 Sys_FPrintf(SYS_ERR, "Failed to remove netrun file '%s'\n", strNetrun.GetBuffer());
1373 Sys_Printf("Netrun mode is disabled\n");
1379 bool CGameDialog::GetNetrun()
1388 very first prefs init deals with selecting the game and the game tools path
1389 then we can load .ini stuff
1391 using prefs / ini settings:
1395 look in g_strGameToolsPath for .ini
1398 look in ~/.radiant/<version>/gamename
1402 #define PREFS_LOCAL_FILENAME "local.pref"
1404 void PrefsDlg::Init()
1406 mGamesDialog.Init();
1408 // m_global_rc_path has been set above, do m_rc_path with game specific stuff now
1409 // the win32 and linux versions have been unified for network mode
1411 if (!CGameDialog::GetNetrun())
1413 // legacy prefs settings, this goes where the game pack is installed
1414 m_rc_path = g_string_new (g_strGameToolsPath.GetBuffer() );
1415 m_inipath = g_string_new (m_rc_path->str);
1416 g_string_append (m_inipath, PREFS_LOCAL_FILENAME);
1420 // this is common to win32 and Linux init now
1421 m_rc_path = g_string_new (m_global_rc_path->str);
1424 g_string_append (m_rc_path, g_pGameDescription->mGameFile.GetBuffer());
1425 g_string_append (m_rc_path, "/");
1426 Q_mkdir (m_rc_path->str, 0775);
1428 // then the ini file
1429 m_inipath = g_string_new (m_rc_path->str);
1430 g_string_append (m_inipath, PREFS_LOCAL_FILENAME);
1434 void PrefsDlg::UpdateData (bool retrieve)
1436 // leo: the "changed" signal confuses the update function
1437 if (m_pWidget == NULL)
1439 mGamesDialog.UpdateData (retrieve);
1440 Dialog::UpdateData (retrieve);
1444 #define PREFSHSPACE 5
1446 #define PREFSHSPACE 0
1449 static void UpdateSensitivity( GtkWidget *widget, gpointer data )
1451 PrefsDlg *dlg = (PrefsDlg*)data;
1452 dlg->DoSensitivity();
1455 static void UpdateEditorSensitivity(GtkWidget *widget, gpointer data)
1457 PrefsDlg *dlg = (PrefsDlg*)data;
1458 dlg->DoEditorSensitivity();
1461 // start new prefs dialog
1463 /*! Utility function for swapping notebook pages for tree list selections */
1464 void PrefsDlg::showPrefPage(int prefpage)
1466 if(gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook)) != prefpage)
1467 gtk_notebook_set_page(GTK_NOTEBOOK(notebook), prefpage);
1472 static void treeSelection(GtkTreeSelection* selection, gpointer data)
1474 PrefsDlg *dlg = (PrefsDlg*)data;
1476 GtkTreeModel* model;
1477 GtkTreeIter selected;
1478 if(gtk_tree_selection_get_selected(selection, &model, &selected))
1481 gtk_tree_model_get(model, &selected, 1, (gpointer*)&prefpage, -1);
1482 dlg->showPrefPage(prefpage);
1486 void PrefsDlg::BuildDialog ()
1488 // Main Preferences dialog
1489 GtkWidget *dialog, *mainvbox, *hbox, *sc_win, *preflabel;
1491 // Widgets on notebook pages
1492 GtkWidget *check, *label, *scale, *hbox2, *combo,
1493 *table, *spin, *entry, *pixmap,
1494 *radio, *button, *pageframe, *vbox;
1496 GList *combo_list = (GList*)NULL;
1501 gtk_window_set_title(GTK_WINDOW(dialog), "GtkRadiant Preferences");
1502 gtk_widget_realize(dialog);
1504 mainvbox = gtk_vbox_new(FALSE, 5);
1505 gtk_container_add(GTK_CONTAINER(dialog), mainvbox);
1506 gtk_container_set_border_width(GTK_CONTAINER(mainvbox), 5);
1507 gtk_widget_show(mainvbox);
1509 hbox = gtk_hbox_new(FALSE, 5);
1510 gtk_widget_show(hbox);
1511 gtk_box_pack_end(GTK_BOX(mainvbox), hbox, FALSE, TRUE, 0);
1513 button = gtk_button_new_with_label("OK");
1514 gtk_widget_show(button);
1515 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1516 gtk_widget_set_usize(button, 60, -2);
1517 AddModalButton(button, IDOK);
1519 button = gtk_button_new_with_label("Cancel");
1520 gtk_widget_show(button);
1521 gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1522 gtk_widget_set_usize(button, 60, -2);
1523 AddModalButton(button, IDCANCEL);
1525 button = gtk_button_new_with_label ("Clean");
1526 gtk_widget_show(button);
1527 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(OnButtonClean), this);
1528 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
1529 gtk_widget_set_usize (button, 60, -2);
1531 hbox = gtk_hbox_new(FALSE, 5);
1532 gtk_box_pack_start(GTK_BOX(mainvbox), hbox, TRUE, TRUE, 0);
1533 gtk_widget_show(hbox);
1535 sc_win = gtk_scrolled_window_new(NULL, NULL);
1536 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sc_win), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1537 gtk_box_pack_start(GTK_BOX(hbox), sc_win, FALSE, FALSE, 0);
1538 gtk_widget_show(sc_win);
1540 // prefs pages notebook
1541 notebook = gtk_notebook_new();
1542 // hide the notebook tabs since its not supposed to look like a notebook
1543 gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
1544 gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 0);
1545 gtk_widget_show(notebook);
1547 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sc_win), GTK_SHADOW_IN);
1550 GtkTreeStore* store = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_POINTER);
1552 GtkWidget* view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
1553 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
1556 GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
1557 GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Preferences", renderer, "text", 0, NULL);
1558 gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);
1562 GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
1563 g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(treeSelection), this);
1566 gtk_widget_show(view);
1568 gtk_container_add(GTK_CONTAINER (sc_win), view);
1571 /********************************************************************/
1572 /* Add preference tree options */
1573 /********************************************************************/
1576 gtk_tree_store_append(store, &group, NULL);
1577 gtk_tree_store_set(store, &group, 0, "Globals", 1, PTAB_FRONT, -1);
1580 gtk_tree_store_append(store, &tab, &group);
1581 gtk_tree_store_set(store, &tab, 0, "Game settings", 1, (gpointer)PTAB_GAME_SETTINGS, -1);
1587 gtk_tree_store_append(store, &group, NULL);
1588 gtk_tree_store_set(store, &group, 0, "Display", 1, PTAB_FRONT, -1);
1591 gtk_tree_store_append(store, &tab, &group);
1592 gtk_tree_store_set(store, &tab, 0, "2D Display/Rendering", 1, (gpointer)PTAB_2D, -1);
1596 gtk_tree_store_append(store, &tab, &group);
1597 gtk_tree_store_set(store, &tab, 0, "3D View", 1, (gpointer)PTAB_CAMERA, -1);
1601 gtk_tree_store_append(store, &tab, &group);
1602 gtk_tree_store_set(store, &tab, 0, "Texture Settings", 1, (gpointer)PTAB_TEXTURE, -1);
1608 gtk_tree_store_append(store, &group, NULL);
1609 gtk_tree_store_set(store, &group, 0, "Interface", 1, PTAB_FRONT, -1);
1612 gtk_tree_store_append(store, &tab, &group);
1613 gtk_tree_store_set(store, &tab, 0, "Layout", 1, (gpointer)PTAB_LAYOUT, -1);
1617 gtk_tree_store_append(store, &tab, &group);
1618 gtk_tree_store_set(store, &tab, 0, "Mouse", 1, (gpointer)PTAB_MOUSE, -1);
1622 gtk_tree_store_append(store, &tab, &group);
1623 gtk_tree_store_set(store, &tab, 0, "Editing", 1, (gpointer)PTAB_EDITING, -1);
1629 gtk_tree_store_append(store, &group, NULL);
1630 gtk_tree_store_set(store, &group, 0, "Other", 1, PTAB_FRONT, -1);
1633 gtk_tree_store_append(store, &tab, &group);
1634 gtk_tree_store_set(store, &tab, 0, "Startup/Auto save", 1, (gpointer)PTAB_STARTUP, -1);
1638 gtk_tree_store_append(store, &tab, &group);
1639 gtk_tree_store_set(store, &tab, 0, "Paths", 1, (gpointer)PTAB_PATHS, -1);
1643 gtk_tree_store_append(store, &tab, &group);
1644 gtk_tree_store_set(store, &tab, 0, "Misc", 1, (gpointer)PTAB_MISC, -1);
1646 if (!g_qeglobals.bBSPFrontendPlugin)
1649 gtk_tree_store_append(store, &tab, &group);
1650 gtk_tree_store_set(store, &tab, 0, "BSP Monitoring", 1, (gpointer)PTAB_BSPMONITOR, -1);
1655 gtk_tree_view_expand_all(GTK_TREE_VIEW(view));
1657 g_object_unref(G_OBJECT(store));
1660 /**********************************************************************/
1661 /* build the prefs pages */
1662 /**********************************************************************/
1665 // todo : add something interesting here
1666 // NOTE TTimo: tip of the day? or a logo?
1667 preflabel = gtk_label_new("Front Page");
1668 gtk_widget_show(preflabel);
1669 pageframe = gtk_frame_new(NULL);
1670 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
1671 gtk_widget_show(pageframe);
1672 vbox = gtk_vbox_new(FALSE, 5);
1673 gtk_widget_show(vbox);
1674 gtk_widget_set_usize(GTK_WIDGET(vbox), 350, -2);
1675 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
1676 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
1678 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
1680 /******** global preferences group ****************************/
1681 preflabel = gtk_label_new("Globals");
1682 gtk_widget_show(preflabel);
1684 pageframe = mGamesDialog.GetGlobalFrame();
1685 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
1687 /******** 2D prefs group (xy views/rendering options) *********/
1688 preflabel = gtk_label_new("2D Display");
1689 gtk_widget_show(preflabel);
1690 pageframe = gtk_frame_new("2D Display");
1691 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
1692 gtk_widget_show(pageframe);
1693 vbox = gtk_vbox_new(FALSE, 5);
1694 gtk_widget_show(vbox);
1695 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
1696 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
1698 // OpenGL Display Lists
1699 check = gtk_check_button_new_with_label("OpenGL Display Lists");
1700 gtk_widget_show(check);
1701 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
1702 AddDialogData(check, &m_bDisplayLists, DLG_CHECK_BOOL);
1704 // Antialiased points & lines
1705 // Fishman - Add antialiazed points and lines support. 09/03/00
1706 check = gtk_check_button_new_with_label ("OpenGL antialiased points and lines");
1707 gtk_widget_show (check);
1708 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1709 AddDialogData (check, &m_bAntialiasedPointsAndLines, DLG_CHECK_BOOL);
1711 // Solid selection boxes
1712 check = gtk_check_button_new_with_label ("Solid selection boxes");
1713 gtk_widget_show (check);
1714 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1715 AddDialogData (check, &m_bNoStipple, DLG_CHECK_BOOL);
1717 // Display size info
1718 check = gtk_check_button_new_with_label ("Display size info");
1719 gtk_widget_show (check);
1720 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
1721 AddDialogData (check, &m_bSizePaint, DLG_CHECK_BOOL);
1723 // Alternate vertex/edge handles
1724 // Gef: Kyro GL_POINT work around 25-aug-2001
1725 check = gtk_check_button_new_with_label ("Alternate vertex/edge handles");
1726 gtk_widget_show(check);
1727 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
1728 AddDialogData(check, &m_bGlPtWorkaround, DLG_CHECK_BOOL);
1730 g_list_free (combo_list);
1734 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=812
1735 check = gtk_check_button_new_with_label ("ATI cards with broken drivers - bug #802");
1736 gtk_widget_show(check);
1737 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
1738 AddDialogData(check, &m_bGlATIHack, DLG_CHECK_BOOL);
1741 // Add the page to the notebook
1742 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
1744 /******** 3D Camera view group *********/
1745 preflabel = gtk_label_new("3D View");
1746 gtk_widget_show(preflabel);
1747 pageframe = gtk_frame_new("3D View");
1748 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
1749 gtk_widget_show(pageframe);
1750 vbox = gtk_vbox_new(FALSE, 5);
1751 gtk_widget_show(vbox);
1752 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
1753 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
1755 // Directional velocity (Movement Velocity)
1757 hbox2 = gtk_hbox_new (FALSE, 0);
1758 gtk_widget_show (hbox2);
1759 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
1762 label = gtk_label_new("Movement Velocity");
1763 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1764 gtk_widget_show(label);
1765 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
1768 adj = gtk_adjustment_new(100, 50, 300, 1, 10, 10);
1769 AddDialogData(adj, &m_nMoveSpeed, DLG_ADJ_INT);
1772 scale = gtk_hscale_new(GTK_ADJUSTMENT(adj));
1773 gtk_widget_show(scale);
1774 gtk_box_pack_start(GTK_BOX (vbox), scale, FALSE, TRUE, 2);
1776 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
1778 // Angular velocity (Rotational Velocity)
1780 hbox2 = gtk_hbox_new (FALSE, 0);
1781 gtk_widget_show (hbox2);
1782 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
1785 label = gtk_label_new ("Rotational Velocity");
1786 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1787 gtk_widget_show (label);
1788 gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
1791 adj = gtk_adjustment_new (3, 1, 180, 1, 10, 10); // value, low, high, step, page_step, page_size
1792 AddDialogData (adj, &m_nAngleSpeed, DLG_ADJ_INT);
1795 scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1796 gtk_widget_show (scale);
1797 gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, TRUE, 2);
1798 gtk_scale_set_draw_value (GTK_SCALE (scale), TRUE);
1800 // Text under the velocity sliders
1802 hbox2 = gtk_hbox_new (FALSE, 0);
1803 gtk_widget_show (hbox2);
1804 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
1807 label = gtk_label_new ("slow");
1808 gtk_widget_show (label);
1809 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
1812 label = gtk_label_new ("fast");
1813 gtk_widget_show (label);
1814 gtk_box_pack_end (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
1816 // Allow drag to select multiple faces/brushes
1818 table = gtk_table_new(2, 1, FALSE);
1819 gtk_widget_show(table);
1820 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1821 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1822 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1824 label = gtk_label_new ("Use paint-select in camera view:");
1825 gtk_widget_show (label);
1826 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1827 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
1828 (GtkAttachOptions) (0),
1829 (GtkAttachOptions) (0), 0, 0);
1832 combo_list = g_list_append (combo_list, (void *)"No");
1833 combo_list = g_list_append (combo_list, (void *)"Yes");
1834 combo_list = g_list_append (combo_list, (void *)"Yes (Classic Key Setup)");
1836 combo = gtk_combo_new ();
1837 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
1838 gtk_widget_show (combo);
1839 gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 0, 1,
1840 (GtkAttachOptions) (GTK_FILL),
1841 (GtkAttachOptions) (0), 0, 0);
1842 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
1843 AddDialogData (combo, &m_nCamDragMultiSelect, DLG_COMBO_INT);
1845 // Freelook in Camera view
1846 check = gtk_check_button_new_with_label ("Freelook in Camera view");
1847 gtk_widget_show (check);
1848 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1849 gtk_label_set_justify (GTK_LABEL (GTK_BIN (check)->child), GTK_JUSTIFY_LEFT);
1850 AddDialogData (check, &m_bCamFreeLook, DLG_CHECK_BOOL);
1852 // Freelook in Camera view w/ forward & back strafing instead of up and down looking
1853 check = gtk_check_button_new_with_label ("Freelook strafes Forward and Back");
1854 gtk_widget_show (check);
1855 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1856 gtk_label_set_justify (GTK_LABEL (GTK_BIN (check)->child), GTK_JUSTIFY_LEFT);
1857 AddDialogData (check, &m_bCamFreeLookStrafe, DLG_CHECK_BOOL);
1859 // Invert mouse in freelook
1860 check = gtk_check_button_new_with_label ("Invert mouse in freelook");
1861 gtk_widget_show (check);
1862 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1863 gtk_label_set_justify (GTK_LABEL (GTK_BIN (check)->child), GTK_JUSTIFY_LEFT);
1864 AddDialogData (check, &m_bCamInverseMouse, DLG_CHECK_BOOL);
1866 // Discrete movement
1867 check = gtk_check_button_new_with_label ("Discrete movement");
1868 gtk_widget_show (check);
1869 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1870 gtk_label_set_justify (GTK_LABEL (GTK_BIN (check)->child), GTK_JUSTIFY_LEFT);
1871 AddDialogData (check, &m_bCamDiscrete, DLG_CHECK_BOOL);
1873 // Update XY views on camera move
1874 check = gtk_check_button_new_with_label ("Update XY views on camera move");
1875 gtk_widget_show (check);
1876 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1877 gtk_label_set_justify (GTK_LABEL (GTK_BIN (check)->child), GTK_JUSTIFY_LEFT);
1878 AddDialogData (check, &m_bCamXYUpdate, DLG_CHECK_BOOL);
1880 // Add the page to the notebook
1881 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
1883 /******** Texture group *********/
1884 preflabel = gtk_label_new("Textures");
1885 gtk_widget_show(preflabel);
1886 pageframe = gtk_frame_new("Textures");
1887 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
1888 gtk_widget_show(pageframe);
1889 vbox = gtk_vbox_new(FALSE, 6);
1890 gtk_widget_show(vbox);
1891 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
1892 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
1894 // Texture quality slider
1896 label = gtk_label_new ("Texture quality");
1897 gtk_widget_show (label);
1898 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1899 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1900 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1903 adj = gtk_adjustment_new (0, 0, 4, 1, 1, 1);
1904 AddDialogData (adj, &m_nLatchedTextureQuality, DLG_ADJ_INT);
1907 scale = gtk_hscale_new (GTK_ADJUSTMENT (adj));
1908 gtk_widget_show (scale);
1909 gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
1910 gtk_scale_set_draw_value (GTK_SCALE (scale), FALSE);
1912 // text under the texture slider
1913 hbox2 = gtk_hbox_new (FALSE, 0);
1914 gtk_widget_show (hbox2);
1915 gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
1916 label = gtk_label_new ("low");
1917 gtk_widget_show (label);
1918 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
1919 label = gtk_label_new ("high");
1920 gtk_widget_show (label);
1921 gtk_box_pack_end (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
1924 check = gtk_check_button_new_with_label ("Texture subsets");
1925 gtk_widget_show (check);
1926 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1927 AddDialogData (check, &m_bTextureWindow, DLG_CHECK_BOOL);
1929 // texture scrollbar
1930 check = gtk_check_button_new_with_label ("Texture scrollbar");
1931 gtk_widget_show (check);
1932 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
1933 AddDialogData (check, &m_bTextureScrollbar, DLG_CHECK_BOOL);
1935 // texture increment matches grid
1936 check = gtk_check_button_new_with_label ("Tex increment matches grid");
1937 gtk_widget_show (check);
1938 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
1939 AddDialogData (check, &m_bSnapTToGrid, DLG_CHECK_BOOL);
1942 // Texture compression choice label
1944 table = gtk_table_new(2, 1, FALSE);
1945 gtk_widget_show(table);
1946 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1947 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1948 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1950 label = gtk_label_new ("Texture Compression (if available):");
1951 gtk_widget_show (label);
1952 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1953 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
1954 (GtkAttachOptions) (0),
1955 (GtkAttachOptions) (0), 0, 0);
1956 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
1958 // Texture compression choice label
1960 // NONE will always be in pos 0
1961 combo_list = g_list_append (combo_list, (void *)"None");
1963 // if OpenGL compression is enabled it will always be
1965 if (g_qeglobals.m_bOpenGLCompressionSupported)
1967 combo_list = g_list_append (combo_list, (void *)"OpenGL ARB");
1970 // If S3 is enabled offer all 3 valid compression schemes in RGBA
1971 if (g_qeglobals.m_bS3CompressionSupported)
1973 combo_list = g_list_append (combo_list, (void *)"S3TC DXT1");
1974 combo_list = g_list_append (combo_list, (void *)"S3TC DXT3");
1975 combo_list = g_list_append (combo_list, (void *)"S3TC DXT5");
1978 combo = gtk_combo_new ();
1979 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
1980 gtk_widget_show (combo);
1981 gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 0, 1,
1982 (GtkAttachOptions) (GTK_FILL),
1983 (GtkAttachOptions) (0), 0, 0);
1984 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
1985 AddDialogData (combo, &m_nTextureCompressionFormat, DLG_COMBO_INT);
1986 g_list_free (combo_list);
1989 table = gtk_table_new(2, 1, FALSE);
1990 gtk_widget_show(table);
1991 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
1992 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
1993 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
1997 label = gtk_label_new ("Startup Shaders:");
1998 gtk_widget_show (label);
1999 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
2000 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
2001 (GtkAttachOptions) (0),
2002 (GtkAttachOptions) (0), 0, 0);
2003 gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
2007 combo_list = g_list_append (combo_list, (void *)"None");
2008 if (g_pGameDescription->mGameFile == "jk2.game" || g_pGameDescription->mGameFile == "ja.game")
2009 combo_list = g_list_append (combo_list, (void *)"System");
2010 else if (g_pGameDescription->mGameFile == "sof2.game")
2011 combo_list = g_list_append (combo_list, (void *)"Tools");
2013 combo_list = g_list_append (combo_list, (void *)"Common");
2014 combo_list = g_list_append (combo_list, (void *)"All");
2015 combo = gtk_combo_new ();
2016 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
2017 gtk_widget_show (combo);
2018 gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 0, 1,
2019 (GtkAttachOptions) (GTK_FILL),
2020 (GtkAttachOptions) (0), 0, 0);
2021 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
2022 AddDialogData (combo, &m_nLatchedShader, DLG_COMBO_INT);
2023 g_list_free (combo_list);
2025 // Add the page to the notebook
2026 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2028 /******** Layout group *********/
2029 preflabel = gtk_label_new("Layout");
2030 gtk_widget_show(preflabel);
2031 pageframe = gtk_frame_new("Layout");
2032 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2033 gtk_widget_show(pageframe);
2034 vbox = gtk_vbox_new(FALSE, 5);
2035 gtk_widget_show(vbox);
2036 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2037 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2041 table = gtk_table_new (2, 4, FALSE);
2042 gtk_widget_show (table);
2043 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2044 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2045 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2048 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "window1.bmp");
2049 gtk_widget_show (pixmap);
2050 gtk_table_attach (GTK_TABLE (table), pixmap, 0, 1, 0, 1,
2051 (GtkAttachOptions) (0),
2052 (GtkAttachOptions) (0), 0, 0);
2055 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "window2.bmp");
2056 gtk_widget_show (pixmap);
2057 gtk_table_attach (GTK_TABLE (table), pixmap, 1, 2, 0, 1,
2058 (GtkAttachOptions) (0),
2059 (GtkAttachOptions) (0), 0, 0);
2062 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "window3.bmp");
2063 gtk_widget_show (pixmap);
2064 gtk_table_attach (GTK_TABLE (table), pixmap, 2, 3, 0, 1,
2065 (GtkAttachOptions) (0),
2066 (GtkAttachOptions) (0), 0, 0);
2069 pixmap = new_pixmap (g_pParentWnd->m_pWidget, "window4.bmp");
2070 gtk_widget_show (pixmap);
2071 gtk_table_attach (GTK_TABLE (table), pixmap, 3, 4, 0, 1,
2072 (GtkAttachOptions) (0),
2073 (GtkAttachOptions) (0), 0, 0);
2075 // view type 1 selector
2076 radio = gtk_radio_button_new (NULL);
2077 gtk_widget_show (radio);
2078 gtk_table_attach (GTK_TABLE (table), radio, 0, 1, 1, 2,
2079 (GtkAttachOptions) (0),
2080 (GtkAttachOptions) (0), 0, 0);
2082 // view type 2 selector
2083 radio = gtk_radio_button_new_from_widget (GTK_RADIO_BUTTON (radio));
2084 gtk_widget_show (radio);
2085 gtk_table_attach (GTK_TABLE (table), radio, 1, 2, 1, 2,
2086 (GtkAttachOptions) (0),
2087 (GtkAttachOptions) (0), 0, 0);
2089 // view type 3 selector
2090 radio = gtk_radio_button_new_from_widget (GTK_RADIO_BUTTON (radio));
2091 gtk_widget_show (radio);
2092 gtk_table_attach (GTK_TABLE (table), radio, 2, 3, 1, 2,
2093 (GtkAttachOptions) (0),
2094 (GtkAttachOptions) (0), 0, 0);
2096 // view type 4 selector
2097 radio = gtk_radio_button_new_from_widget (GTK_RADIO_BUTTON (radio));
2098 gtk_widget_show (radio);
2099 gtk_table_attach (GTK_TABLE (table), radio, 3, 4, 1, 2,
2100 (GtkAttachOptions) (0),
2101 (GtkAttachOptions) (0), 0, 0);
2102 AddDialogData (radio, &m_nLatchedView, DLG_RADIO_INT);
2104 // Floating Z window
2105 check = gtk_check_button_new_with_label ("Floating Z Window");
2106 gtk_widget_show (check);
2107 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2108 AddDialogData (check, &m_bLatchedFloatingZ, DLG_CHECK_BOOL);
2110 // show menu tear-off seperators
2111 check = gtk_check_button_new_with_label ("Detachable Menus");
2112 gtk_widget_show (check);
2113 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2114 AddDialogData (check, &m_bLatchedDetachableMenus, DLG_CHECK_BOOL);
2116 if (!g_pGameDescription->mNoPatch)
2118 // show patch toolbar
2119 check = gtk_check_button_new_with_label ("Patch Toolbar");
2120 gtk_widget_show (check);
2121 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2122 g_object_set_data (G_OBJECT (dialog), "check_patchtoolbar", check); // Allow to be disabled for Q1/Q2
2123 AddDialogData (check, &m_bLatchedPatchToolbar, DLG_CHECK_BOOL);
2127 check = gtk_check_button_new_with_label ("Wide Toolbar");
2128 gtk_widget_show (check);
2129 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2130 AddDialogData (check, &m_bLatchedWideToolbar, DLG_CHECK_BOOL);
2132 // use plugin toolbar
2133 check = gtk_check_button_new_with_label ("Plugin Toolbar");
2134 gtk_widget_show (check);
2135 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2136 AddDialogData (check, &m_bLatchedPluginToolbar, DLG_CHECK_BOOL);
2139 // win32 file dialog
2140 check = gtk_check_button_new_with_label ("Use win32 file load dialog");
2141 gtk_widget_show (check);
2142 // gtk_container_add (GTK_CONTAINER (vbox), check);
2143 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2144 AddDialogData (check, &m_bNativeGUI, DLG_CHECK_BOOL);
2146 // position on primary monitor
2147 check = gtk_check_button_new_with_label ("Start on Primary Monitor");
2148 gtk_widget_show (check);
2149 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2150 g_object_set_data (G_OBJECT (dialog), "check_startonprimary", check);
2151 gtk_signal_connect( GTK_OBJECT (check), "clicked", GTK_SIGNAL_FUNC(UpdateSensitivity), this );
2152 AddDialogData (check, &m_bStartOnPrimMon, DLG_CHECK_BOOL);
2155 // Add the page to the notebook
2156 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2158 /******** Mouse group *********/
2159 preflabel = gtk_label_new("Mouse");
2160 gtk_widget_show(preflabel);
2161 pageframe = gtk_frame_new("Mouse");
2162 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2163 gtk_widget_show(pageframe);
2164 vbox = gtk_vbox_new(FALSE, 5);
2165 gtk_widget_show(vbox);
2166 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2167 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2171 hbox2 = gtk_hbox_new (FALSE, 5);
2172 gtk_widget_show (hbox2);
2173 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
2176 radio = gtk_radio_button_new_with_label (NULL, "2 button");
2177 gtk_widget_show (radio);
2178 gtk_box_pack_start (GTK_BOX (hbox2), radio, FALSE, FALSE, 0);
2181 radio = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (radio), "3 button");
2182 gtk_widget_show (radio);
2183 gtk_box_pack_start (GTK_BOX (hbox2), radio, FALSE, FALSE, 0);
2184 AddDialogData (radio, &m_nMouse, DLG_RADIO_INT);
2186 // right click to drop entity
2187 check = gtk_check_button_new_with_label ("Right click to drop entities");
2188 gtk_widget_show (check);
2189 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2190 AddDialogData (check, &m_bRightClick, DLG_CHECK_BOOL);
2192 // Mouse chaser (and this does what?)
2193 check = gtk_check_button_new_with_label ("Mouse chaser");
2194 gtk_widget_show (check);
2195 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2196 AddDialogData (check, &m_bChaseMouse, DLG_CHECK_BOOL);
2199 check = gtk_check_button_new_with_label ("ALT + multi-drag");
2200 gtk_widget_show (check);
2201 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2202 AddDialogData (check, &m_bALTEdge, DLG_CHECK_BOOL);
2204 // Mouse wheel increments
2206 hbox2 = gtk_hbox_new (FALSE, 5);
2207 gtk_widget_show (hbox2);
2208 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
2211 label = gtk_label_new ("Wheel Mouse inc:");
2212 gtk_widget_show (label);
2213 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
2216 entry = gtk_entry_new ();
2217 gtk_widget_show (entry);
2218 gtk_widget_set_usize (entry, 40, -2);
2219 gtk_box_pack_start (GTK_BOX (hbox2), entry, FALSE, FALSE, 0);
2220 AddDialogData (entry, &m_nWheelInc, DLG_ENTRY_INT);
2222 // Add the page to the notebook
2223 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2225 /******** Editing group *********/
2226 preflabel = gtk_label_new("Editing");
2227 gtk_widget_show(preflabel);
2228 pageframe = gtk_frame_new("Editing");
2229 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2230 gtk_widget_show(pageframe);
2231 vbox = gtk_vbox_new(FALSE, 5);
2232 gtk_widget_show(vbox);
2233 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2234 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2236 // Vertex editing splits faces
2237 check = gtk_check_button_new_with_label ("Vertex editing splits face");
2238 gtk_widget_show (check);
2239 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2240 AddDialogData (check, &m_bVertexSplit, DLG_CHECK_BOOL);
2242 // Fix target/targetname collisions
2243 check = gtk_check_button_new_with_label ("Fix target/targetname collisions");
2244 gtk_widget_show (check);
2245 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2246 AddDialogData (check, &m_bDoTargetFix, DLG_CHECK_BOOL);
2248 // Clipper tool uses caulk
2249 check = gtk_check_button_new_with_label ("Clipper tool uses caulk");
2250 gtk_widget_show (check);
2251 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2252 AddDialogData (check, &m_bClipCaulk, DLG_CHECK_BOOL);
2254 // Don't clamp plane points
2255 check = gtk_check_button_new_with_label ("Don't clamp plane points");
2256 gtk_widget_show (check);
2257 gtk_box_pack_start(GTK_BOX(vbox), check, FALSE, FALSE, 0);
2258 AddDialogData (check, &m_bNoClamp, DLG_CHECK_BOOL);
2260 // Select patch by bounding box
2261 check = gtk_check_button_new_with_label ("Select patches by bounding box");
2262 gtk_widget_show (check);
2263 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2264 AddDialogData (check, &m_bPatchBBoxSelect, DLG_CHECK_BOOL);
2266 // Rotation increment
2268 table = gtk_table_new (2, 3, FALSE);
2269 gtk_widget_show (table);
2270 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2271 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2272 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2275 label = gtk_label_new ("Rotation increment:");
2276 gtk_widget_show (label);
2277 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2278 (GtkAttachOptions) (0),
2279 (GtkAttachOptions) (0), 0, 0);
2282 entry = gtk_entry_new ();
2283 gtk_widget_show (entry);
2284 gtk_widget_set_usize (entry, 60, -2);
2285 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2286 (GtkAttachOptions) (GTK_FILL),
2287 (GtkAttachOptions) (0), 0, 0);
2288 AddDialogData (entry, &m_nRotation, DLG_ENTRY_INT);
2292 label = gtk_label_new ("Undo Levels:");
2293 gtk_widget_show (label);
2294 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2295 (GtkAttachOptions) (0),
2296 (GtkAttachOptions) (0), 0, 0);
2298 // spinner (allows undo levels to be set to zero)
2299 spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (1, 0, 64, 1, 10, 10)), 1, 0);
2300 gtk_widget_show (spin);
2301 gtk_table_attach (GTK_TABLE (table), spin, 1, 2, 1, 2,
2302 (GtkAttachOptions) (GTK_FILL),
2303 (GtkAttachOptions) (0), 0, 0);
2304 gtk_widget_set_usize (spin, 60, -2);
2305 AddDialogData (spin, &m_nUndoLevels, DLG_SPIN_INT);
2307 // Patch subdivisions
2309 label = gtk_label_new ("Patch subdivisions:");
2310 gtk_widget_show (label);
2311 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
2312 (GtkAttachOptions) (0),
2313 (GtkAttachOptions) (0), 0, 0);
2315 // entry (spinner perhaps? [2-16])
2316 entry = gtk_entry_new ();
2317 gtk_widget_show (entry);
2318 gtk_widget_set_usize (entry, 60, -2);
2319 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3,
2320 (GtkAttachOptions) (GTK_FILL),
2321 (GtkAttachOptions) (0), 0, 0);
2322 AddDialogData (entry, &m_nSubdivisions, DLG_ENTRY_INT);
2324 // Add the page to the notebook
2325 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2327 /******** Save/Load group *********/
2328 preflabel = gtk_label_new("Startup/Auto save");
2329 gtk_widget_show(preflabel);
2330 pageframe = gtk_frame_new("Startup/Auto save");
2331 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2332 gtk_widget_show(pageframe);
2333 vbox = gtk_vbox_new(FALSE, 5);
2334 gtk_widget_show(vbox);
2335 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2336 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2339 check = gtk_check_button_new_with_label ("Snapshots");
2340 gtk_widget_show (check);
2341 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2342 AddDialogData (check, &m_bSnapShots, DLG_CHECK_BOOL);
2344 // load last project on open
2345 check = gtk_check_button_new_with_label ("Load last project on open");
2346 gtk_widget_show (check);
2347 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2348 AddDialogData (check, &m_bLoadLast, DLG_CHECK_BOOL);
2350 // load last map on open
2351 check = gtk_check_button_new_with_label ("Load last map on open");
2352 gtk_widget_show (check);
2353 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2354 AddDialogData (check, &m_bLoadLastMap, DLG_CHECK_BOOL);
2358 hbox2 = gtk_hbox_new (FALSE, 5);
2359 gtk_widget_show (hbox2);
2360 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
2361 gtk_container_set_border_width (GTK_CONTAINER (hbox2), 0);
2364 check = gtk_check_button_new_with_label ("Auto save every");
2365 gtk_widget_show (check);
2366 gtk_box_pack_start (GTK_BOX (hbox2), check, FALSE, FALSE, 0);
2367 AddDialogData (check, &m_bAutoSave, DLG_CHECK_BOOL);
2370 spin = gtk_spin_button_new (GTK_ADJUSTMENT (gtk_adjustment_new (1, 1, 60, 1, 10, 10)), 1, 0);
2371 gtk_widget_show (spin);
2372 gtk_box_pack_start (GTK_BOX (hbox2), spin, FALSE, FALSE, 0);
2373 gtk_widget_set_usize (spin, 60, -2);
2374 AddDialogData (spin, &m_nAutoSave, DLG_SPIN_INT);
2377 label = gtk_label_new ("minutes");
2378 gtk_widget_show (label);
2379 gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, FALSE, 0);
2381 // Add the page to the notebook
2382 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2384 /******** Paths group *********/
2385 preflabel = gtk_label_new("Paths");
2386 gtk_widget_show(preflabel);
2387 pageframe = gtk_frame_new("Paths");
2388 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2389 gtk_widget_show(pageframe);
2390 vbox = gtk_vbox_new(FALSE, 5);
2391 gtk_widget_show(vbox);
2392 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2393 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2397 table = gtk_table_new (3, 3, FALSE);
2398 gtk_widget_show (table);
2399 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2400 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2401 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2404 label = gtk_label_new ("Prefab path:");
2405 gtk_widget_show (label);
2406 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2407 (GtkAttachOptions) (0),
2408 (GtkAttachOptions) (0), 0, 0);
2409 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2412 entry = gtk_entry_new ();
2413 gtk_widget_show (entry);
2414 gtk_widget_set_usize(GTK_WIDGET(entry), 240, -2);
2415 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2416 (GtkAttachOptions) (GTK_FILL),
2417 (GtkAttachOptions) (0), 1, 0);
2418 AddDialogData (entry, &m_strPrefabPath, DLG_ENTRY_TEXT);
2420 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=805
2423 button = gtk_button_new_with_label ("...");
2424 gtk_widget_show (button);
2425 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnBtnBrowseprefab), this);
2426 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2427 (GtkAttachOptions) (0),
2428 (GtkAttachOptions) (0), 0, 0);
2433 label = gtk_label_new ("User INI path:");
2434 gtk_widget_show (label);
2435 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
2436 (GtkAttachOptions) (0),
2437 (GtkAttachOptions) (0), 0, 0);
2438 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2440 // user ini path entry
2441 entry = gtk_entry_new ();
2442 gtk_widget_show (entry);
2443 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 1, 2,
2444 (GtkAttachOptions) (GTK_FILL),
2445 (GtkAttachOptions) (0), 1, 0);
2446 AddDialogData (entry, &m_strUserPath, DLG_ENTRY_TEXT);
2448 // user ini browse button
2449 button = gtk_button_new_with_label ("...");
2450 gtk_widget_show (button);
2451 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnBtnBrowseuserini), this);
2452 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
2453 (GtkAttachOptions) (0),
2454 (GtkAttachOptions) (0), 0, 0);
2456 // Add the page to the notebook
2457 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2459 /******** Misc group *********/
2460 preflabel = gtk_label_new("Misc");
2461 gtk_widget_show(preflabel);
2462 pageframe = gtk_frame_new("Misc");
2463 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2464 gtk_widget_show(pageframe);
2465 vbox = gtk_vbox_new(FALSE, 5);
2466 gtk_widget_show(vbox);
2467 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2468 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2471 check = gtk_check_button_new_with_label ("Light drawing");
2472 gtk_widget_show (check);
2473 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2474 AddDialogData (check, &m_bNewLightDraw, DLG_CHECK_BOOL);
2478 table = gtk_table_new(2, 1, FALSE);
2479 gtk_widget_show(table);
2480 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2481 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2482 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2484 label = gtk_label_new ("Light radiuses:");
2485 gtk_widget_show (label);
2486 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2487 gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
2488 (GtkAttachOptions) (0),
2489 (GtkAttachOptions) (0), 0, 0);
2492 combo_list = g_list_append (combo_list, (void *)"Disabled");
2493 combo_list = g_list_append (combo_list, (void *)"True Q3Map2 Style");
2494 combo_list = g_list_append (combo_list, (void *)"Classic Style");
2496 combo = gtk_combo_new ();
2497 gtk_combo_set_popdown_strings (GTK_COMBO (combo), combo_list);
2498 gtk_widget_show (combo);
2499 gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 0, 1,
2500 (GtkAttachOptions) (GTK_FILL),
2501 (GtkAttachOptions) (0), 0, 0);
2502 gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
2503 AddDialogData (combo, &m_nLightRadiuses, DLG_COMBO_INT);
2506 check = gtk_check_button_new_with_label ("Use win32 file associations to open text files instead of builtin editor");
2507 gtk_widget_show(check);
2508 gtk_box_pack_start(GTK_BOX (vbox), check, FALSE, FALSE, 0);
2509 AddDialogData (check, &g_PrefsDlg.m_bUseWin32Editor, DLG_CHECK_BOOL);
2511 // use custom shader editor
2512 check = gtk_check_button_new_with_label ("Use Custom Shader Editor");
2513 gtk_widget_show(check);
2514 gtk_box_pack_start(GTK_BOX (vbox), check, FALSE, FALSE, 0);
2515 gtk_signal_connect( GTK_OBJECT (check), "clicked", GTK_SIGNAL_FUNC(UpdateEditorSensitivity), this);
2516 g_object_set_data (G_OBJECT(dialog), "check_customeditor", check);
2517 AddDialogData (check, &g_PrefsDlg.m_bUseCustomEditor, DLG_CHECK_BOOL);
2519 // custom shader editor executable
2521 table = gtk_table_new (3, 1, FALSE);
2522 gtk_widget_show (table);
2523 gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, TRUE, 0);
2524 gtk_table_set_row_spacings (GTK_TABLE (table), 5);
2525 gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2528 label = gtk_label_new("Custom Editor Command");
2529 gtk_widget_show(label);
2530 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
2531 (GtkAttachOptions) (0),
2532 (GtkAttachOptions) (0), 0, 0);
2533 gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
2534 g_object_set_data (G_OBJECT(dialog), "label_customeditor", label);
2535 gtk_widget_set_sensitive (label, g_PrefsDlg.m_bUseCustomEditor);
2537 // custom editor command entry
2538 entry = gtk_entry_new ();
2539 gtk_widget_show (entry);
2540 gtk_widget_set_usize(GTK_WIDGET(entry), 240, -2);
2541 gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1,
2542 (GtkAttachOptions) (GTK_FILL),
2543 (GtkAttachOptions) (0), 1, 0);
2544 AddDialogData (entry, &m_strEditorCommand, DLG_ENTRY_TEXT);
2545 gtk_widget_set_sensitive (entry, g_PrefsDlg.m_bUseCustomEditor);
2546 g_object_set_data (G_OBJECT(dialog), "entry_customeditor", entry);
2549 button = gtk_button_new_with_label ("...");
2550 gtk_widget_show (button);
2551 gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (OnBtnBrowseEditor), this);
2552 gtk_table_attach (GTK_TABLE (table), button, 2, 3, 0, 1,
2553 (GtkAttachOptions) (0),
2554 (GtkAttachOptions) (0), 0, 0);
2555 g_object_set_data (G_OBJECT(dialog), "button_customeditor", button);
2556 gtk_widget_set_sensitive (button, g_PrefsDlg.m_bUseCustomEditor);
2559 // Add the page to the notebook
2560 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2562 /******** BSP Monitoring group *********/
2563 // this is never displayed if the plugin isn't available
2564 preflabel = gtk_label_new("BSP Monitoring");
2565 gtk_widget_show(preflabel);
2566 pageframe = gtk_frame_new("BSP Monitoring");
2567 gtk_container_set_border_width(GTK_CONTAINER(pageframe), 5);
2568 gtk_widget_show(pageframe);
2569 vbox = gtk_vbox_new(FALSE, 5);
2570 gtk_widget_show(vbox);
2571 gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
2572 gtk_container_add(GTK_CONTAINER(pageframe), vbox);
2574 // Enable BSP process monitoring
2575 check = gtk_check_button_new_with_label ("Enable BSP process monitoring");
2576 gtk_widget_show (check);
2577 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2578 g_object_set_data (G_OBJECT (dialog), "check_monitorbsp", check);
2579 gtk_signal_connect( GTK_OBJECT (check), "clicked", GTK_SIGNAL_FUNC(UpdateSensitivity), this );
2580 AddDialogData (check, &g_PrefsDlg.m_bWatchBSP, DLG_CHECK_BOOL);
2583 check = gtk_check_button_new_with_label ("Stop compilation on leak");
2584 gtk_widget_show (check);
2585 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2586 g_object_set_data (G_OBJECT (dialog), "check_leakstop", check);
2587 AddDialogData (check, &g_PrefsDlg.m_bLeakStop, DLG_CHECK_BOOL);
2589 // engine after compile
2590 check = gtk_check_button_new_with_label ("Run engine after compile");
2591 gtk_widget_show (check);
2592 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2593 g_object_set_data (G_OBJECT (dialog), "check_runengine", check);
2594 gtk_signal_connect( GTK_OBJECT (check), "clicked", GTK_SIGNAL_FUNC(UpdateSensitivity), this );
2595 AddDialogData( check, &g_PrefsDlg.m_bRunQuake, DLG_CHECK_BOOL );
2597 // sleep mode when running engine
2598 check = gtk_check_button_new_with_label ("Activate sleep mode when running the engine");
2599 gtk_widget_show (check);
2600 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2601 g_object_set_data (G_OBJECT (dialog), "check_sleep", check);
2602 AddDialogData( check, &g_PrefsDlg.m_bDoSleep, DLG_CHECK_BOOL );
2604 // use q3map2's texture projection
2605 check = gtk_check_button_new_with_label ("Texturing compatible with q3map2");
2606 gtk_widget_show (check);
2607 gtk_box_pack_start (GTK_BOX (vbox), check, FALSE, FALSE, 0);
2608 g_object_set_data (G_OBJECT (dialog), "check_q3map2", check);
2609 AddDialogData( check, &g_PrefsDlg.m_bQ3Map2Texturing, DLG_CHECK_BOOL );
2611 // Add the page to the notebook
2612 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), pageframe, preflabel);
2614 gtk_notebook_set_page(GTK_NOTEBOOK(notebook), PTAB_FRONT);
2619 // end new prefs dialog
2621 void PrefsDlg::LoadTexdefPref(texdef_t* pTexdef, char* pName)
2625 memset(pTexdef, 0, sizeof(texdef_t));
2627 sprintf(buffer, "%s%s", pName, TD_SCALE1_KEY);
2628 mLocalPrefs.GetPref(buffer, &pTexdef->scale[0], 0.5f);
2630 sprintf(buffer, "%s%s", pName, TD_SCALE2_KEY);
2631 mLocalPrefs.GetPref(buffer, &pTexdef->scale[1], 0.5f);
2633 sprintf(buffer, "%s%s", pName, TD_SHIFT1_KEY);
2634 mLocalPrefs.GetPref(buffer, &pTexdef->shift[0], 8.f);
2636 sprintf(buffer, "%s%s", pName, TD_SHIFT2_KEY);
2637 mLocalPrefs.GetPref(buffer, &pTexdef->shift[1], 8.f);
2639 sprintf(buffer, "%s%s", pName, TD_ROTATE_KEY);
2640 mLocalPrefs.GetPref(buffer, &pTexdef->rotate, 45);
2643 void PrefsDlg::UpdateTextureCompression()
2645 // if OpenGL is not ready yet, don't do anything
2646 if (!g_qeglobals.m_bOpenGLReady) {
2647 Sys_Printf("OpenGL not ready - postpone texture compression capability check\n");
2651 if (g_qeglobals.bTextureCompressionSupported)
2653 if (m_nTextureCompressionFormat >= 2 && !g_qeglobals.m_bS3CompressionSupported)
2655 Sys_Printf("Inconsistant pref setting for texture compression (%d), rolling back\n", m_nTextureCompressionFormat);
2656 m_nTextureCompressionFormat = 1; // if this is not supported either, see below
2658 if (m_nTextureCompressionFormat == 1 && !g_qeglobals.m_bOpenGLCompressionSupported)
2660 Sys_Printf("Inconsistant pref setting for texture compression (GL_COMPRESSED_RGBA), rolling back\n");
2661 m_nTextureCompressionFormat = 0;
2663 switch (m_nTextureCompressionFormat)
2667 g_qeglobals.texture_components = GL_RGBA;
2668 Sys_Printf("texture compression disabled by preferences settings\n");
2673 g_qeglobals.texture_components = GL_COMPRESSED_RGBA;
2674 Sys_Printf("OpenGL texture compression enabled\n");
2679 g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
2680 Sys_Printf("S3TC DXT1 texture compression enabled\n");
2685 g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
2686 Sys_Printf("S3TC DXT3 texture compression enabled\n");
2691 g_qeglobals.texture_components = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
2692 Sys_Printf("S3TC DXT5 texture compression enabled\n");
2699 Sys_Printf("texture compression is not supported by your current graphic card/drivers\n");
2700 g_qeglobals.texture_components = GL_RGBA;
2701 m_nTextureCompressionFormat = 0;
2706 void PrefsDlg::UpdateATIHack() {
2707 // if OpenGL is not ready yet, don't do anything
2708 if (!g_qeglobals.m_bOpenGLReady) {
2709 Sys_Printf("OpenGL not ready - postpone ATI bug workaround setup\n");
2714 qglCullFace = &qglCullFace_ATIHack;
2715 qglDisable = &qglDisable_ATIHack;
2716 qglEnable = &qglEnable_ATIHack;
2717 qglPolygonMode = &qglPolygonMode_ATIHack;
2718 Sys_Printf("ATI bug workaround enabled\n");
2720 qglCullFace = qglCullFace_real;
2721 qglDisable = qglDisable_real;
2722 qglEnable = qglEnable_real;
2723 qglPolygonMode = qglPolygonMode_real;
2724 Sys_Printf("ATI bug workaround disabled\n");
2729 // TTimo: m_strEnginePath has a special status, if not found in registry we need to
2730 // initiliaze it for sure. It is not totally failsafe but we can use the same
2731 // code than in q3map, expecting to find some "quake" above us. If not, we prompt
2732 // for the engine executable path
2733 void PrefsDlg::LoadPrefs ()
2737 // first things first, load prefs from global prefs
2738 mGamesDialog.LoadPrefs();
2740 // if we already have a document loaded, we will free and reload from file
2741 if (mLocalPrefs.InUse()) {
2742 mLocalPrefs.Clear();
2745 // load local.pref file
2746 mLocalPrefs.ReadXMLFile(m_inipath->str);
2748 mLocalPrefs.GetPref(PATCHSHOWBOUNDS_KEY, &g_bPatchShowBounds, FALSE);
2749 mLocalPrefs.GetPref(MOUSE_KEY, &m_nMouse, MOUSE_DEF);
2750 m_nMouseButtons = m_nMouse ? 3 : 2;
2753 // if it's not found here, mainframe.cpp will take care of finding one
2754 mLocalPrefs.GetPref(LASTPROJ_KEY, &m_strLastProject, "");
2755 mLocalPrefs.GetPref(LASTPROJVER_KEY, &m_nLastProjectVer, -1);
2758 // NOTE TTimo: I'm not sure why this is in prefs
2759 // should probably be a project setting
2760 // and I'm not sure that we really have a way to set this reliably either
2762 strPrefab = g_qeglobals.m_strHomeGame.GetBuffer();
2763 strPrefab += g_pGameDescription->mBaseGame.GetBuffer();
2764 strPrefab += "/prefabs/";
2765 mLocalPrefs.GetPref(PREFAB_KEY, &m_strPrefabPath, strPrefab);
2767 mLocalPrefs.GetPref(LASTLIGHTINTENSITY_KEY, &m_iLastLightIntensity, 300);
2768 mLocalPrefs.GetPref(TLOCK_KEY, &m_bTextureLock, TLOCK_DEF);
2769 mLocalPrefs.GetPref(RLOCK_KEY, &m_bRotateLock, TLOCK_DEF);
2770 mLocalPrefs.GetPref(LASTMAP_KEY, &m_strLastMap, "");
2771 mLocalPrefs.GetPref(LOADLAST_KEY, &m_bLoadLast, LOADLAST_DEF);
2772 mLocalPrefs.GetPref(BSP_KEY, &m_bInternalBSP, FALSE);
2773 mLocalPrefs.GetPref(RCLICK_KEY, &m_bRightClick, TRUE);
2774 mLocalPrefs.GetPref(AUTOSAVE_KEY, &m_bAutoSave, TRUE);
2775 mLocalPrefs.GetPref(LOADLASTMAP_KEY, &m_bLoadLastMap, FALSE);
2776 mLocalPrefs.GetPref(TINYBRUSH_KEY, &m_bCleanTiny, FALSE);
2777 mLocalPrefs.GetPref(TINYSIZE_KEY, &m_fTinySize, 0.5f);
2778 mLocalPrefs.GetPref(AUTOSAVETIME_KEY, &m_nAutoSave, 5);
2779 mLocalPrefs.GetPref(SNAPSHOT_KEY, &m_bSnapShots, FALSE);
2780 mLocalPrefs.GetPref(MOVESPEED_KEY, &m_nMoveSpeed, 100);
2781 mLocalPrefs.GetPref(ANGLESPEED_KEY, &m_nAngleSpeed, 3);
2782 mLocalPrefs.GetPref(SETGAME_KEY, &m_bSetGame, FALSE);
2783 mLocalPrefs.GetPref(CAMXYUPDATE_KEY, &m_bCamXYUpdate, TRUE);
2784 mLocalPrefs.GetPref(CAMDRAGMULTISELECT_KEY, &m_nCamDragMultiSelect, TRUE);
2785 mLocalPrefs.GetPref(CAMFREELOOK_KEY, &m_bCamFreeLook, TRUE);
2786 mLocalPrefs.GetPref(CAMINVERSEMOUSE_KEY, &m_bCamInverseMouse, FALSE);
2787 mLocalPrefs.GetPref(CAMDISCRETE_KEY, &m_bCamDiscrete, TRUE);
2788 mLocalPrefs.GetPref(LIGHTDRAW_KEY, &m_bNewLightDraw, TRUE);
2789 mLocalPrefs.GetPref(CUBICCLIP_KEY, &m_bCubicClipping, TRUE);
2790 mLocalPrefs.GetPref(CUBICSCALE_KEY, &m_nCubicScale, 13);
2791 mLocalPrefs.GetPref(ALTEDGE_KEY, &m_bALTEdge, FALSE);
2792 mLocalPrefs.GetPref(FACECOLORS_KEY, &m_bFaceColors, FALSE);
2793 mLocalPrefs.GetPref(XZVIS_KEY, &m_bXZVis, FALSE);
2794 mLocalPrefs.GetPref(YZVIS_KEY, &m_bYZVis, FALSE);
2795 mLocalPrefs.GetPref(ZVIS_KEY, &m_bZVis, FALSE);
2796 mLocalPrefs.GetPref(SIZEPAINT_KEY, &m_bSizePaint, FALSE);
2797 mLocalPrefs.GetPref(DLLENTITIES_KEY, &m_bDLLEntities, FALSE);
2799 mLocalPrefs.GetPref(DETACHABLEMENUS_KEY, &m_bLatchedDetachableMenus, TRUE);
2800 m_bDetachableMenus = m_bLatchedDetachableMenus;
2802 if (g_pGameDescription->mNoPatch)
2804 m_bPatchToolbar = false;
2808 mLocalPrefs.GetPref(PATCHTOOLBAR_KEY, &m_bLatchedPatchToolbar, TRUE);
2809 m_bPatchToolbar = m_bLatchedPatchToolbar;
2812 mLocalPrefs.GetPref(WIDETOOLBAR_KEY, &m_bLatchedWideToolbar, TRUE);
2813 m_bWideToolbar = m_bLatchedWideToolbar;
2815 mLocalPrefs.GetPref(PLUGINTOOLBAR_KEY, &m_bLatchedPluginToolbar, TRUE);
2816 m_bPluginToolbar = m_bLatchedPluginToolbar;
2818 mLocalPrefs.GetPref(WINDOW_KEY, (int*)&m_nLatchedView, WINDOW_DEF);
2819 m_nView = m_nLatchedView;
2821 mLocalPrefs.GetPref(FLOATINGZ_KEY, &m_bLatchedFloatingZ, FALSE);
2822 m_bFloatingZ = m_bLatchedFloatingZ;
2824 mLocalPrefs.GetPref(TEXTUREQUALITY_KEY, &m_nLatchedTextureQuality, 3);
2825 m_nTextureQuality = m_nLatchedTextureQuality;
2827 mLocalPrefs.GetPref(LOADSHADERS_KEY, &m_nLatchedShader, 0);
2828 m_nShader = m_nLatchedShader;
2830 mLocalPrefs.GetPref(NOCLAMP_KEY, &m_bNoClamp, FALSE);
2831 mLocalPrefs.GetPref(USERINI_KEY, &m_strUserPath, "");
2832 mLocalPrefs.GetPref(ROTATION_KEY, &m_nRotation, 45);
2833 mLocalPrefs.GetPref(CHASEMOUSE_KEY, &m_bChaseMouse, TRUE);
2834 mLocalPrefs.GetPref(ENTITYSHOW_KEY, &m_nEntityShowState, ENTITY_SKINNED_BOXED);
2836 // this will probably need to be 75 or 100 for Q1.
2837 mLocalPrefs.GetPref(TEXTURESCALE_KEY, &m_nTextureScale, 50);
2839 // FIXME: Hydra - actually, this stuff is Q1,Q2 and HL specific.
2840 if ( (g_pGameDescription->mGameFile == "hl.game") )
2842 // No BSP monitoring in the default compiler tools for Half-life (yet)
2843 mLocalPrefs.GetPref(WATCHBSP_KEY, &m_bWatchBSP, FALSE);
2845 // Texture subset on by default (HL specific really, because of halflife.wad's size)
2846 mLocalPrefs.GetPref(TEXTURE_KEY, &m_bTextureWindow, TRUE);
2848 else if ( ( g_pGameDescription->mGameFile == "q2.game" ) || ( g_pGameDescription->mGameFile == "heretic2.game" ) )
2850 // BSP monitoring is implemented in Quake2 and Heretic2 tools
2851 mLocalPrefs.GetPref(WATCHBSP_KEY, &m_bWatchBSP, TRUE);
2853 // Texture subset on by default (HL specific really, because of halflife.wad's size)
2854 mLocalPrefs.GetPref(TEXTURE_KEY, &m_bTextureWindow, TRUE);
2858 mLocalPrefs.GetPref(WATCHBSP_KEY, &m_bWatchBSP, WATCHBSP_DEF);
2859 mLocalPrefs.GetPref(TEXTURE_KEY, &m_bTextureWindow, FALSE);
2863 mLocalPrefs.GetPref(TEXTURESCROLLBAR_KEY, &m_bTextureScrollbar, TRUE);
2864 mLocalPrefs.GetPref(DISPLAYLISTS_KEY, &m_bDisplayLists, TRUE);
2865 mLocalPrefs.GetPref(ANTIALIASEDLINES_KEY, &m_bAntialiasedPointsAndLines, FALSE);
2866 mLocalPrefs.GetPref(SWITCHCLIP_KEY, &m_bSwitchClip, TRUE);
2867 mLocalPrefs.GetPref(SELWHOLEENTS_KEY, &m_bSelectWholeEntities, TRUE);
2868 mLocalPrefs.GetPref(SHOWSHADERS_KEY, &m_bShowShaders, TRUE);
2869 mLocalPrefs.GetPref(GLLIGHTING_KEY, &m_bGLLighting, FALSE);
2870 mLocalPrefs.GetPref(NOSTIPPLE_KEY, &m_bNoStipple, FALSE);
2871 mLocalPrefs.GetPref(UNDOLEVELS_KEY, &m_nUndoLevels, 30);
2872 mLocalPrefs.GetPref(VERTEXMODE_KEY, &m_bVertexSplit, TRUE);
2873 mLocalPrefs.GetPref(RUNQ2_KEY, &m_bRunQuake, RUNQ2_DEF);
2874 mLocalPrefs.GetPref(LEAKSTOP_KEY, &m_bLeakStop, TRUE);
2875 mLocalPrefs.GetPref(DOSLEEP_KEY, &m_bDoSleep, FALSE);
2876 mLocalPrefs.GetPref(SELECTCURVES_KEY, &m_bSelectCurves, TRUE);
2877 mLocalPrefs.GetPref(SELECTMODELS_KEY, &m_bSelectModels, TRUE);
2878 mLocalPrefs.GetPref(SHADERLISTONLY_KEY, &m_bTexturesShaderlistOnly, FALSE);
2879 mLocalPrefs.GetPref(SUBDIVISIONS_KEY, &m_nSubdivisions, SUBDIVISIONS_DEF);
2880 mLocalPrefs.GetPref(CLIPCAULK_KEY, &m_bClipCaulk, FALSE);
2881 mLocalPrefs.GetPref(SNAPTTOGRID_KEY, &m_bSnapTToGrid, FALSE);
2882 mLocalPrefs.GetPref(TARGETFIX_KEY, &m_bDoTargetFix, TRUE);
2883 mLocalPrefs.GetPref(WHEELINC_KEY, &m_nWheelInc, 64);
2884 mLocalPrefs.GetPref(PATCHBBOXSEL_KEY, &m_bPatchBBoxSelect, FALSE);
2886 // Gef: Kyro GL_POINT workaround
2887 mLocalPrefs.GetPref(GLPOINTWORKAROUND_KEY, &m_bGlPtWorkaround, FALSE);
2889 // window positioning
2890 mLocalPrefs.GetPref(ENTITYSPLIT1_KEY, &mWindowInfo.nEntitySplit1, -1);
2891 mLocalPrefs.GetPref(ENTITYSPLIT2_KEY, &mWindowInfo.nEntitySplit2, -1);
2893 mLocalPrefs.GetPref(POSITIONX_KEY, &mWindowInfo.position.x, -1);
2894 mLocalPrefs.GetPref(POSITIONY_KEY, &mWindowInfo.position.y, -1);
2895 mLocalPrefs.GetPref(WIDTH_KEY, &mWindowInfo.position.w, -1);
2896 mLocalPrefs.GetPref(HEIGHT_KEY, &mWindowInfo.position.h, 450);
2898 const window_position_t default_window_pos = { 0, 0, 200, 200, };
2900 mLocalPrefs.GetPref(ENTITYWND_KEY, &mWindowInfo.posEntityWnd, default_window_pos);
2901 mLocalPrefs.GetPref(MAPINFOWND_KEY, &mWindowInfo.posMapInfoWnd, default_window_pos);
2902 mLocalPrefs.GetPref(CAMWND_KEY, &mWindowInfo.posCamWnd, default_window_pos);
2903 mLocalPrefs.GetPref(ZWND_KEY, &mWindowInfo.posZWnd, default_window_pos);
2904 mLocalPrefs.GetPref(XYWND_KEY, &mWindowInfo.posXYWnd, default_window_pos);
2905 mLocalPrefs.GetPref(YZWND_KEY, &mWindowInfo.posYZWnd, default_window_pos);
2906 mLocalPrefs.GetPref(XZWND_KEY, &mWindowInfo.posXZWnd, default_window_pos);
2907 mLocalPrefs.GetPref(PATCHWND_KEY, &mWindowInfo.posPatchWnd, default_window_pos);
2908 mLocalPrefs.GetPref(SURFACEWND_KEY, &mWindowInfo.posSurfaceWnd, default_window_pos);
2909 mLocalPrefs.GetPref(ENTITYINFOWND_KEY, &mWindowInfo.posEntityInfoWnd, default_window_pos);
2911 mLocalPrefs.GetPref(ZWIDTH_KEY, &mWindowInfo.nZWidth, 30);
2912 mLocalPrefs.GetPref(XYHEIGHT_KEY, &mWindowInfo.nXYHeight, 300);
2913 mLocalPrefs.GetPref(XYWIDTH_KEY, &mWindowInfo.nXYWidth, 300);
2914 mLocalPrefs.GetPref(CAMWIDTH_KEY, &mWindowInfo.nCamWidth, 200);
2915 mLocalPrefs.GetPref(CAMHEIGHT_KEY, &mWindowInfo.nCamHeight, 200);
2916 mLocalPrefs.GetPref(ZFLOATWIDTH_KEY, &mWindowInfo.nZFloatWidth, 300);
2918 mLocalPrefs.GetPref(STATE_KEY, &mWindowInfo.nState, SW_SHOW);
2922 mLocalPrefs.GetPref(COUNT_KEY, &m_nMRUCount, 0);
2923 for(i = 0; i < 4; i++)
2926 sprintf (buf, "%s%d", FILE_KEY, i);
2927 mLocalPrefs.GetPref(buf, &m_strMRUFiles[i], "");
2930 // some platform specific prefs
2932 mLocalPrefs.GetPref(NATIVEGUI_KEY, &m_bNativeGUI, TRUE);
2933 mLocalPrefs.GetPref(STARTONPRIMMON_KEY, &m_bStartOnPrimMon, FALSE);
2936 mLocalPrefs.GetPref(SI_TEXMENU_KEY, &g_qeglobals.d_savedinfo.iTexMenu, ID_VIEW_BILINEARMIPMAP);
2937 mLocalPrefs.GetPref(SI_GAMMA_KEY, &g_qeglobals.d_savedinfo.fGamma, 1.0f);
2938 mLocalPrefs.GetPref(SI_EXCLUDE_KEY, &g_qeglobals.d_savedinfo.exclude, 0); // nothing filtered by default
2939 mLocalPrefs.GetPref(SI_INCLUDE_KEY, &g_qeglobals.d_savedinfo.include, INCLUDE_NAMES | INCLUDE_COORDS | INCLUDE_ANGLES | INCLUDE_CAMERATINT);
2940 mLocalPrefs.GetPref(SI_SHOWNAMES_KEY, &g_qeglobals.d_savedinfo.show_names, FALSE);
2941 mLocalPrefs.GetPref(SI_SHOWCOORDS_KEY, &g_qeglobals.d_savedinfo.show_coordinates, TRUE);
2942 mLocalPrefs.GetPref(SI_SHOWANGLES_KEY, &g_qeglobals.d_savedinfo.show_angles, TRUE);
2943 mLocalPrefs.GetPref(SI_SHOWOUTLINES_KEY, &g_qeglobals.d_savedinfo.show_outline, FALSE);
2944 mLocalPrefs.GetPref(SI_SHOWAXIS_KEY, &g_qeglobals.d_savedinfo.show_axis, TRUE);
2945 mLocalPrefs.GetPref(SI_NOSELOUTLINES_KEY, &g_qeglobals.d_savedinfo.bNoSelectedOutlines, FALSE);
2947 mLocalPrefs.GetPref(SI_OUTLINESTYLE_KEY, &g_qeglobals.d_savedinfo.iSelectedOutlinesStyle, OUTLINE_ZBUF|OUTLINE_BSEL);
2949 LoadTexdefPref(&g_qeglobals.d_savedinfo.m_SIIncrement, SI_SURFACE_TEXDEF_KEY);
2950 LoadTexdefPref(&g_qeglobals.d_savedinfo.m_PIIncrement, SI_PATCH_TEXDEF_KEY);
2952 // text editor binding
2954 mLocalPrefs.GetPref(CUSTOMSHADEREDITOR_KEY, &m_bUseWin32Editor, TRUE);
2956 mLocalPrefs.GetPref(CUSTOMSHADEREDITOR_KEY, &m_bUseCustomEditor, FALSE);
2957 mLocalPrefs.GetPref(CUSTOMSHADEREDITORCOMMAND_KEY, &m_strEditorCommand, "");
2961 vec3_t vDefaultAxisColours[3] = {
2967 for(i = 0; i < 3; i++) {
2969 sprintf(buf, "%s%d", SI_AXISCOLORS_KEY, i);
2970 mLocalPrefs.GetPref(buf, g_qeglobals.d_savedinfo.AxisColors[i], vDefaultAxisColours[i]);
2973 vec3_t vDefaultColours[COLOR_LAST] = {
2974 {0.25f, 0.25f, 0.25f},
2976 {0.75f, 0.75f, 0.75f},
2978 {0.25f, 0.25f, 0.25f},
2991 for(i = 0; i < COLOR_LAST; i++) {
2993 sprintf(buf, "%s%d", SI_COLORS_KEY, i);
2994 mLocalPrefs.GetPref(buf, g_qeglobals.d_savedinfo.colors[i], vDefaultColours[i]);
2997 mLocalPrefs.GetPref(TEXTURECOMPRESSIONFORMAT_KEY, &m_nTextureCompressionFormat, 1);
2999 mLocalPrefs.GetPref(LIGHTRADIUS_KEY, &m_nLightRadiuses, TRUE);
3001 mLocalPrefs.GetPref(Q3MAP2TEX_KEY, &m_bQ3Map2Texturing, TRUE);
3004 mLocalPrefs.GetPref(ATIHACK_KEY, &m_bGlATIHack, FALSE);
3007 Undo_SetMaxSize(m_nUndoLevels); // set it internally as well / FIXME: why not just have one global value?
3009 UpdateTextureCompression();
3015 if (mLocalPrefs.mbEmpty)
3017 mLocalPrefs.mbEmpty = false;
3018 Sys_Printf("Saving local.pref with default pref values\n");
3023 void PrefsDlg::SavePrefs ()
3025 if (g_qeglobals.disable_ini)
3029 Sys_Printf("PrefsDlg::SavePrefs\n");
3032 // this will take care of copying back from the dialog to the variables
3033 // NOTE: it may be overkill to call systematically before a SavePrefs, but it's safer
3034 // this will also cause an UpdateData for the mGamesDialog
3037 mGamesDialog.SavePrefs();
3039 // update the tree and save it
3040 mLocalPrefs.UpdatePrefTree();
3041 if (!mLocalPrefs.WriteXMLFile(m_inipath->str))
3042 Sys_FPrintf(SYS_ERR, "Error occured while saving local prefs file '%s'\n", m_inipath->str);
3044 if ( m_nMouse == 0 ) {
3045 m_nMouseButtons = 2;
3047 m_nMouseButtons = 3;
3052 void PrefsDlg::PostModal (int code)
3057 // make sure the logfile is ok
3063 g_pParentWnd->SetGridStatus();
3064 Sys_UpdateWindows(W_ALL);
3065 if (m_nUndoLevels != 0)
3066 Undo_SetMaxSize(m_nUndoLevels);
3070 void PrefsDlg::DoEditorSensitivity()
3072 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data (G_OBJECT(m_pWidget), "check_customeditor"))))
3074 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "label_customeditor")), TRUE);
3075 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "entry_customeditor")), TRUE);
3076 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "button_customeditor")), TRUE);
3080 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "label_customeditor")), FALSE);
3081 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "entry_customeditor")), FALSE);
3082 gtk_widget_set_sensitive(GTK_WIDGET(g_object_get_data (G_OBJECT(m_pWidget), "button_customeditor")), FALSE);
3086 void PrefsDlg::DoSensitivity()
3089 // first, look at the project file version ... will monitoring work?
3090 // project files now XML, guaranteed to be at least version 2
3091 if (0)//IntForKey( g_qeglobals.d_project_entity, "version" ) < 2)
3096 Msg = "The current project file (";
3097 Msg += g_PrefsDlg.m_strLastProject;
3098 Msg += ") is not at least version 2.\nI need version 2 or above to setup BSP monitoring correctly.";
3099 gtk_MessageBox(m_pWidget, Msg.GetBuffer(), MB_OK );
3104 // go ahead, disable everybuddy
3105 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_leakstop" )), FALSE );
3106 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_monitorbsp" )), FALSE );
3107 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_runengine" )), FALSE );
3108 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_sleep" )), FALSE );
3115 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_leakstop" )), TRUE );
3116 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_monitorbsp" )), TRUE );
3117 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_runengine" )), TRUE );
3118 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_sleep" )), TRUE );
3120 if ( ! gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT(m_pWidget), "check_monitorbsp" ) ) ) )
3122 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_leakstop" )), FALSE );
3123 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_runengine" )), FALSE );
3124 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_sleep" )), FALSE );
3125 } else if (! gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT(m_pWidget), "check_runengine" ) ) ) )
3127 gtk_widget_set_sensitive( GTK_WIDGET(g_object_get_data( G_OBJECT(m_pWidget), "check_sleep" )), FALSE );
3132 ============================================================
3134 ============================================================
3137 CGameInstall::CGameInstall() {
3138 memset( m_availGames, 0, sizeof( m_availGames ) );
3141 void CGameInstall::BuildDialog() {
3142 GtkWidget *dlg, *vbox1, *button, *text, *combo, *entry;
3145 gtk_window_set_title( GTK_WINDOW( dlg ), "Configure games" );
3147 vbox1 = gtk_vbox_new( FALSE, 0 );
3148 gtk_widget_show( vbox1 );
3149 gtk_container_add( GTK_CONTAINER( dlg ), vbox1 );
3151 text = gtk_label_new( "Select the game to configure" );
3152 gtk_widget_show( text );
3153 gtk_box_pack_start( GTK_BOX( vbox1 ), text, FALSE, FALSE, 0 );
3155 combo = gtk_combo_new();
3156 gtk_widget_show( combo );
3157 gtk_box_pack_start( GTK_BOX( vbox1 ), combo, FALSE, FALSE, 0 );
3159 GList *combo_list = NULL;
3161 while ( m_availGames[ iGame ] != GAME_NONE ) {
3162 switch ( m_availGames[ iGame ] ) {
3164 combo_list = g_list_append( combo_list, "Quake III Arena (including mods)" );
3167 combo_list = g_list_append( combo_list, "Urban Terror (standalone)" );
3170 combo_list = g_list_append( combo_list, "UFO: Alien Invasion" );
3173 combo_list = g_list_append( combo_list, "Warsow" );
3178 gtk_combo_set_popdown_strings( GTK_COMBO( combo ), combo_list );
3179 g_list_free( combo_list );
3180 AddDialogData( combo, &m_nComboSelect, DLG_COMBO_INT );
3182 text = gtk_label_new( "Name:" );
3183 gtk_widget_show( text );
3184 gtk_box_pack_start( GTK_BOX( vbox1 ), text, FALSE, FALSE, 0 );
3186 entry = gtk_entry_new();
3187 gtk_widget_show( entry );
3188 gtk_box_pack_start( GTK_BOX( vbox1 ), entry, FALSE, FALSE, 0 );
3189 AddDialogData( entry, &m_strName, DLG_ENTRY_TEXT );
3191 text = gtk_label_new( "Engine directory:" );
3192 gtk_widget_show( text );
3193 gtk_box_pack_start( GTK_BOX( vbox1 ), text, FALSE, FALSE, 0 );
3195 entry = gtk_entry_new();
3196 gtk_widget_show( entry );
3197 gtk_box_pack_start( GTK_BOX( vbox1 ), entry, FALSE, FALSE, 0 );
3198 AddDialogData( entry, &m_strEngine, DLG_ENTRY_TEXT );
3200 // this gets done in the project stuff atm
3202 text = gtk_label_new( "Mod subdirectory:" );
3203 gtk_widget_show( text );
3204 gtk_box_pack_start( GTK_BOX( vbox1 ), text, FALSE, FALSE, 0 );
3206 entry = gtk_entry_new();
3207 gtk_widget_show( entry );
3208 gtk_box_pack_start( GTK_BOX( vbox1 ), entry, FALSE, FALSE, 0 );
3209 AddDialogData( entry, &m_strMod, DLG_ENTRY_TEXT );
3212 button = gtk_button_new_with_label( "OK" );
3213 gtk_widget_show( button );
3214 gtk_box_pack_start( GTK_BOX( vbox1 ), button, FALSE, FALSE, 0 );
3215 AddModalButton( button, IDOK );
3217 gtk_widget_set_usize( button, 60, -2 );
3220 void CGameInstall::Run() {
3223 Sys_Printf( "combo: %d name: %s engine: %s mod: %s\n", m_nComboSelect, m_strName.GetBuffer(), m_strEngine.GetBuffer(), m_strMod.GetBuffer() );
3225 // write out the game file
3226 Str gameFilePath = g_strAppPath.GetBuffer();
3227 gameFilePath += "games/";
3228 gameFilePath += m_strName.GetBuffer();
3229 gameFilePath += ".game";
3230 Sys_Printf( "game file: %s\n", gameFilePath.GetBuffer() );
3232 FILE *fg = fopen( gameFilePath.GetBuffer(), "w" );
3234 Error( "Failed to open %s for writing\n", gameFilePath.GetBuffer() );
3236 fprintf( fg, "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>\n<game\n" );
3237 fprintf( fg, " name=\"%s\"\n", m_strName.GetBuffer() );
3238 fprintf( fg, " gametools=\"%sgames\"\n", g_strAppPath.GetBuffer() );
3239 fprintf( fg, " enginepath=\"%s\"\n", m_strEngine.GetBuffer() );
3240 fprintf( fg, " prefix=\".q3a\"\n" );
3241 switch ( m_availGames[ m_nComboSelect ] ) {
3243 Str source = g_strAppPath.GetBuffer();
3244 source += "installs/";
3246 Str dest = m_strEngine.GetBuffer();
3247 CopyTree( source.GetBuffer(), dest.GetBuffer() );
3248 fprintf( fg, " basegame=\"baseq3\"\n" );
3252 Str source = g_strAppPath.GetBuffer();
3253 source += "installs/";
3255 Str dest = m_strEngine.GetBuffer();
3256 CopyTree( source.GetBuffer(), dest.GetBuffer() );
3257 fprintf( fg, " basegame=\"q3ut4\"\n" );
3261 Str source = g_strAppPath.GetBuffer();
3262 source += "installs/";
3263 source += UFOAI_PACK;
3264 Str dest = m_strEngine.GetBuffer();
3265 CopyTree( source.GetBuffer(), dest.GetBuffer() );
3266 fprintf( fg, " basegame=\"base\"\n" );
3270 fprintf( fg, " basegame=\"basewsw\"\n" );
3273 fprintf( fg, "/>\n" );
3279 CGameInstall::ScanGames
3280 scan for active games that can be installed, based on the presence
3283 void CGameInstall::ScanGames() {
3284 Str pakPaths = g_strAppPath.GetBuffer();
3286 struct dirent *dirlist;
3289 pakPaths += "installs/";
3290 dir = opendir( pakPaths.GetBuffer() );
3291 if ( dir != NULL ) {
3292 while ( ( dirlist = readdir( dir ) ) != NULL ) {
3293 if ( stricmp( dirlist->d_name, Q3_PACK ) == 0 ) {
3294 m_availGames[ iGame++ ] = GAME_Q3;
3296 if ( stricmp( dirlist->d_name, URT_PACK ) == 0 ) {
3297 m_availGames[ iGame++ ] = GAME_URT;
3299 if ( stricmp( dirlist->d_name, UFOAI_PACK ) == 0 ) {
3300 m_availGames[ iGame++ ] = GAME_UFOAI;