1 // Emacs style mode select   -*- C++ -*-
2 //-----------------------------------------------------------------------------
3 //
4 // $Id: agol_settings.cpp 3491 2012-12-08 07:53:29Z hypereye $
5 //
6 // Copyright (C) 2006-2012 by The Odamex Team.
7 //
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License
10 // as published by the Free Software Foundation; either version 2
11 // of the License, or (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // DESCRIPTION:
19 //	Settings Dialog
20 //
21 // AUTHORS:
22 //	 Michael Wood (mwoodj at huntsvegas dot org)
23 //
24 //-----------------------------------------------------------------------------
25 
26 #include <iostream>
27 #include <string>
28 #include <algorithm>
29 
30 #include <agar/core.h>
31 #include <agar/gui.h>
32 
33 #include "agol_settings.h"
34 #include "gui_config.h"
35 
36 using namespace std;
37 
38 namespace agOdalaunch {
39 
AGOL_Settings()40 AGOL_Settings::AGOL_Settings() :
41 	OdamexPathBox(NULL), OdamexPathLabel(NULL), DirSel(NULL),
42 	CloseEventHandler(NULL), DirSelOkHandler(NULL), DirSelCancelHandler(NULL)
43 {
44 	SettingsDialog = AG_WindowNew(AG_WINDOW_MODAL);
45 	AG_WindowSetCaptionS(SettingsDialog, "Configure Settings");
46 	AG_WindowSetPosition(SettingsDialog, AG_WINDOW_MC, 0);
47 
48 	TopOptionsBox = CreateTopOptionsBox(SettingsDialog);
49 	SrvOptionsBox = CreateSrvOptionsBox(TopOptionsBox);
50 	GuiOptionsBox = CreateGuiOptionsBox(TopOptionsBox);
51 #ifndef GCONSOLE
52 	OdamexPathBox = CreateOdamexPathBox(SettingsDialog);
53 	OdamexPathLabel = CreateOdamexPathLabel(OdamexPathBox);
54 #endif
55 	WadDirConfigBox = CreateWadDirConfigBox(SettingsDialog);
56 	WadDirList = CreateWadDirList(WadDirConfigBox);
57 	WadDirButtonBox = CreateWadDirButtonBox(WadDirConfigBox);
58 	ExtraCmdParamsBox = CreateExtraCmdParamsBox(SettingsDialog);
59 	ExtraCmdParamsEntry = CreateExtraCmdParamsEntry(ExtraCmdParamsBox);
60 	MainButtonBox = CreateMainButtonBox(SettingsDialog);
61 
62 	AG_WindowShow(SettingsDialog);
63 }
64 
~AGOL_Settings()65 AGOL_Settings::~AGOL_Settings()
66 {
67 	delete SrvOptionsBox;
68 	delete GuiOptionsBox;
69 }
70 
CreateTopOptionsBox(void * parent)71 AG_Box *AGOL_Settings::CreateTopOptionsBox(void *parent)
72 {
73 	AG_Box *tbox = AG_BoxNewHoriz(parent, AG_BOX_HFILL | AG_BOX_HOMOGENOUS);
74 	AG_BoxSetPadding(tbox, 0);
75 	AG_BoxSetSpacing(tbox, 0);
76 
77 	return tbox;
78 }
79 
CreateSrvOptionsBox(void * parent)80 ODA_SrvOptionsBox *AGOL_Settings::CreateSrvOptionsBox(void *parent)
81 {
82 	ODA_SrvOptionsBox *obox = new ODA_SrvOptionsBox;
83 
84 	obox->optionsBox = AG_BoxNewVert(parent, AG_BOX_FRAME);
85 	AG_LabelNewS(obox->optionsBox, 0, "Masters and Servers");
86 	obox->optionsBox = AG_BoxNewVert(obox->optionsBox, AG_BOX_EXPAND);
87 	AG_BoxSetPadding(obox->optionsBox, 5);
88 	AG_BoxSetSpacing(obox->optionsBox, 5);
89 
90 	obox->masterOnStartCheck = AG_CheckboxNewInt(obox->optionsBox, 0,
91 			"Get Master List on application start", &MasterOnStart);
92 
93 	obox->showBlockedCheck = AG_CheckboxNewInt(obox->optionsBox, 0,
94 			"Show blocked servers", &ShowBlocked);
95 
96 	// Read the options. If they are not set they will be disabled.
97 	GuiConfig::Read("MasterOnStart", MasterOnStart);
98 	GuiConfig::Read("ShowBlockedServers", ShowBlocked);
99 
100 	// Read the timeout options. If they are not set use a default value of 500ms.
101 	if(GuiConfig::Read("MasterTimeout", MasterTimeout) || MasterTimeout == 0)
102 		MasterTimeout = 500;
103 	if(GuiConfig::Read("ServerTimeout", ServerTimeout) || ServerTimeout == 0)
104 		ServerTimeout = 500;
105 
106 	obox->masterTimeoutSpin = AG_NumericalNewUintR(obox->optionsBox, 0, NULL,
107 			"Master Timeout (ms)", &MasterTimeout, 1, 5000);
108 
109 	obox->serverTimeoutSpin = AG_NumericalNewUintR(obox->optionsBox, 0, NULL,
110 			"Server Timeout (ms)", &ServerTimeout, 1, 5000);
111 
112 	return obox;
113 }
114 
CreateGuiOptionsBox(void * parent)115 ODA_GuiOptionsBox *AGOL_Settings::CreateGuiOptionsBox(void *parent)
116 {
117 	char               drvList[128];
118 	AG_Box            *vdbox;
119 	ODA_GuiOptionsBox *gbox = new ODA_GuiOptionsBox;
120 
121 	gbox->optionsBox = AG_BoxNewVert(parent, AG_BOX_FRAME);
122 	AG_LabelNewS(gbox->optionsBox, 0, "Gui Options");
123 	gbox->optionsBox = AG_BoxNewVert(gbox->optionsBox, AG_BOX_EXPAND);
124 	AG_BoxSetPadding(gbox->optionsBox, 5);
125 	AG_BoxSetSpacing(gbox->optionsBox, 5);
126 
127 	// Video Driver Option
128 	vdbox = AG_BoxNewHoriz(gbox->optionsBox, AG_BOX_HFILL);
129 	AG_BoxSetPadding(vdbox, 0);
130 	AG_BoxSetSpacing(vdbox, 0);
131 
132 	gbox->driverLabel = AG_LabelNewS(vdbox, 0, "Video Driver:   ");
133 
134 	gbox->driverCombo = AG_UComboNew(vdbox, AG_UCOMBO_HFILL);
135 	AG_UComboSizeHintPixels(gbox->driverCombo, 150, 3);
136 
137 	AG_ListDriverNames(drvList, 128);
138 
139 	if(strlen(drvList) > 0)
140 	{
141 		size_t oldpos = 0;
142 		size_t pos = 0;
143 
144 		while(pos != string::npos)
145 		{
146 			AG_TlistItem *item;
147 
148 			pos = string(drvList).find(' ', oldpos);
149 			item = AG_TlistAdd(gbox->driverCombo->list, NULL, string(drvList).substr(oldpos, pos - oldpos).c_str());
150 			if(string(item->text) == string(agDriverOps->name))
151 				AG_ButtonTextS(gbox->driverCombo->button, item->text);
152 			oldpos = pos + 1;
153 		}
154 	}
155 	// End - Video Driver Option
156 
157 	return gbox;
158 }
159 
CreateOdamexPathBox(void * parent)160 AG_Box *AGOL_Settings::CreateOdamexPathBox(void *parent)
161 {
162 	AG_Box *opbox;
163 
164 	opbox = AG_BoxNewVert(parent, AG_BOX_HFILL | AG_BOX_FRAME);
165 	AG_LabelNewS(opbox, 0, "Odamex Path");
166 	opbox = AG_BoxNewHoriz(opbox, AG_BOX_HFILL);
167 	AG_BoxSetPadding(opbox, 5);
168 	AG_BoxSetSpacing(opbox, 5);
169 
170 	return opbox;
171 }
172 
CreateOdamexPathLabel(void * parent)173 AG_Label *AGOL_Settings::CreateOdamexPathLabel(void *parent)
174 {
175 	AG_Label *oplabel;
176 	string    oppath;
177 
178 	oplabel = AG_LabelNewS(parent, AG_LABEL_FRAME | AG_LABEL_EXPAND, "");
179 	AG_LabelValign(oplabel, AG_TEXT_MIDDLE);
180 
181 	GuiConfig::Read("OdamexPath", oppath);
182 
183 	if(oppath.size())
184 		AG_LabelTextS(oplabel, oppath.c_str());
185 
186 	AG_ButtonNewFn(parent, 0, "Browse", EventReceiver, "%p",
187 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnBrowseOdamexPath));
188 
189 	return oplabel;
190 }
191 
CreateWadDirConfigBox(void * parent)192 AG_Box *AGOL_Settings::CreateWadDirConfigBox(void *parent)
193 {
194 	AG_Box *wdbox;
195 
196 	wdbox = AG_BoxNewVert(parent, AG_BOX_HFILL | AG_BOX_FRAME);
197 	AG_LabelNewS(wdbox, 0, "Wad Directories");
198 	wdbox = AG_BoxNewHoriz(wdbox, AG_BOX_HFILL);
199 	AG_BoxSetPadding(wdbox, 5);
200 	AG_BoxSetSpacing(wdbox, 5);
201 
202 	return wdbox;
203 }
204 
CreateWadDirList(void * parent)205 AG_Tlist *AGOL_Settings::CreateWadDirList(void *parent)
206 {
207 	AG_Tlist *wdlist;
208 	string    waddirs;
209 	char      cwd[AG_PATHNAME_MAX];
210 
211 	wdlist = AG_TlistNewPolled(parent, AG_TLIST_EXPAND, EventReceiver, "%p",
212 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::UpdateWadDirList));
213 	AG_TlistSetCompareFn(wdlist, AG_TlistCompareStrings);
214 	AG_TlistSizeHintPixels(wdlist, 400, 0);
215 
216 	// Read the WadDirs option from the config file
217 	if(GuiConfig::Read("WadDirs", waddirs))
218 	{
219 		// If there are no waddirs configured insert the current working directory
220 		if(!AG_GetCWD(cwd, AG_PATHNAME_MAX))
221 			WadDirs.push_back(cwd);
222 	}
223 	else
224 	{
225 		size_t oldpos = 0;
226 		size_t pos = waddirs.find(PATH_DELIMITER);
227 
228 		// Parse the waddirs option
229 		while(pos != string::npos)
230 		{
231 			// Put a wad path into the list
232 			WadDirs.push_back(waddirs.substr(oldpos, pos - oldpos));
233 			oldpos = pos + 1;
234 			pos = waddirs.find(PATH_DELIMITER, oldpos);
235 		}
236 	}
237 
238 	return wdlist;
239 }
240 
CreateWadDirButtonBox(void * parent)241 AG_Box *AGOL_Settings::CreateWadDirButtonBox(void *parent)
242 {
243 	AG_Box *bbox;
244 
245 	bbox = AG_BoxNewVert(parent, AG_BOX_VFILL);
246 
247 	AG_ButtonNewFn(bbox, AG_BUTTON_HFILL, "Add", EventReceiver, "%p",
248 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnAddWadDir));
249 	AG_ButtonNewFn(bbox, AG_BUTTON_HFILL, "Replace", EventReceiver, "%p",
250 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnReplaceWadDir));
251 	AG_ButtonNewFn(bbox, AG_BUTTON_HFILL, "Delete", EventReceiver, "%p",
252 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnDeleteWadDir));
253 
254 	AG_SeparatorNewHoriz(bbox);
255 
256 	AG_ButtonNewFn(bbox, AG_BUTTON_HFILL, "Move Up", EventReceiver, "%p",
257 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnMoveWadDirUp));
258 	AG_ButtonNewFn(bbox, AG_BUTTON_HFILL, "Move Down", EventReceiver, "%p",
259 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnMoveWadDirDown));
260 
261 #ifndef GCONSOLE
262 	AG_SeparatorNewHoriz(bbox);
263 
264 	AG_ButtonNew(bbox, AG_BUTTON_HFILL, "Get Environment");
265 #endif
266 
267 	return bbox;
268 }
269 
CreateExtraCmdParamsBox(void * parent)270 AG_Box *AGOL_Settings::CreateExtraCmdParamsBox(void *parent)
271 {
272 	AG_Box *ecpbox;
273 
274 	ecpbox = AG_BoxNewVert(parent, AG_BOX_HFILL | AG_BOX_FRAME);
275 	AG_LabelNewS(ecpbox, 0, "Extra command line arguments");
276 	ecpbox = AG_BoxNewHoriz(ecpbox, AG_BOX_HFILL);
277 	AG_BoxSetPadding(ecpbox, 5);
278 	AG_BoxSetSpacing(ecpbox, 5);
279 
280 	return ecpbox;
281 }
282 
CreateExtraCmdParamsEntry(void * parent)283 AG_Textbox *AGOL_Settings::CreateExtraCmdParamsEntry(void *parent)
284 {
285 	AG_Textbox *ecptextbox;
286 	string      extraParams;
287 
288 	ecptextbox = AG_TextboxNew(parent, AG_TEXTBOX_HFILL, NULL);
289 
290 	// Read the ExtraParams option from the config file
291 	GuiConfig::Read("ExtraParams", extraParams);
292 
293 	// Put the extra params into the textbox
294 	if(extraParams.size())
295 		AG_TextboxSetString(ecptextbox, extraParams.c_str());
296 
297 	return ecptextbox;
298 }
299 
CreateMainButtonBox(void * parent)300 AG_Box *AGOL_Settings::CreateMainButtonBox(void *parent)
301 {
302 	AG_Box *bbox;
303 
304 	bbox = AG_BoxNewHoriz(parent, AG_BOX_HFILL);
305 
306 	// This empty box positions the buttons to the right
307 	AG_BoxNewHoriz(bbox, AG_BOX_HFILL);
308 
309 	AG_ButtonNewFn(bbox, 0, "Cancel", EventReceiver, "%p",
310 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnCancel));
311 	AG_ButtonNewFn(bbox, 0, "  OK  ", EventReceiver, "%p",
312 			RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OnOK));
313 
314 	return bbox;
315 }
316 
IsWadDirDuplicate(const string & waddir)317 bool AGOL_Settings::IsWadDirDuplicate(const string &waddir)
318 {
319 	list<string>::iterator i;
320 
321 	for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
322 	{
323 		if(*i == waddir)
324 			return true;
325 	}
326 
327 	return false;
328 }
329 
330 //*************************//
331 // Event Handler Functions //
332 //*************************//
333 
OnCancel(AG_Event * event)334 void AGOL_Settings::OnCancel(AG_Event *event)
335 {
336 	// Detach and destroy the window + contents
337 	AG_ObjectDetach(SettingsDialog);
338 
339 	// Call the close handler if one was set
340 	if(CloseEventHandler)
341 		CloseEventHandler->Trigger(event);
342 }
343 
OnOK(AG_Event * event)344 void AGOL_Settings::OnOK(AG_Event *event)
345 {
346 	// Call all the save functions
347 	SaveServerOptions();
348 	SaveGuiOptions();
349 #ifndef GCONSOLE
350 	SaveOdamexPath();
351 #endif
352 	SaveWadDirs();
353 	SaveExtraParams();
354 
355 	// Save the ag-odalaunch configuration settings
356 	GuiConfig::Save();
357 
358 	// Detach and destroy the window + contents
359 	AG_ObjectDetach(SettingsDialog);
360 
361 	// Call the close handler if one was set
362 	if(CloseEventHandler)
363 		CloseEventHandler->Trigger(event);
364 }
365 
UpdateWadDirList(AG_Event * event)366 void AGOL_Settings::UpdateWadDirList(AG_Event *event)
367 {
368 	list<string>::iterator i;
369 
370 	// Clear the list and store selection
371 	AG_TlistBegin(WadDirList);
372 
373 	// Traverse the waddir list and add them to the tlist widget
374 	for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
375 		AG_TlistAddS(WadDirList, agIconDirectory.s, (*i).c_str());
376 
377 	// Restore list selection
378 	AG_TlistEnd(WadDirList);
379 }
380 
AddWadDirSelectorOk(AG_Event * event)381 void AGOL_Settings::AddWadDirSelectorOk(AG_Event *event)
382 {
383 	char *waddir = AG_STRING(2);
384 
385 	// If a path came back add it to the list
386 	if(waddir && strlen(waddir) > 0 && !IsWadDirDuplicate(waddir))
387 		WadDirs.push_back(waddir);
388 
389 	DeleteEventHandler(DirSelOkHandler);
390 
391 	delete DirSel;
392 	DirSel = NULL;
393 }
394 
OnAddWadDir(AG_Event * event)395 void AGOL_Settings::OnAddWadDir(AG_Event *event)
396 {
397 	if(DirSel)
398 		return;
399 
400 	// Create and display a new directory selector dialog
401 	DirSel = new AGOL_DirSelector("Select a folder containing WAD files");
402 
403 	// Register and set the OK and Cancel events
404 	DirSelOkHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::AddWadDirSelectorOk);
405 	DirSel->SetOkAction(DirSelOkHandler);
406 	DirSelCancelHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::DirectorySelectorCancel);
407 	DirSel->SetCancelAction(DirSelCancelHandler);
408 }
409 
ReplaceWadDirSelectorOk(AG_Event * event)410 void AGOL_Settings::ReplaceWadDirSelectorOk(AG_Event *event)
411 {
412 	AG_TlistItem *selitem = AG_TlistSelectedItem(WadDirList);
413 	char         *waddir  = AG_STRING(2);
414 
415 	if((selitem && strlen(selitem->text) > 0) &&
416 		(waddir && strlen(waddir) > 0 && !IsWadDirDuplicate(waddir)))
417 	{
418 		list<string>::iterator i;
419 
420 		// Look for the selected directory in the list
421 		for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
422 			if(*i == selitem->text)
423 			{
424 				// Replace the item with the new path
425 				*i = waddir;
426 				break;
427 			}
428 	}
429 
430 	DeleteEventHandler(DirSelOkHandler);
431 
432 	delete DirSel;
433 	DirSel = NULL;
434 }
435 
OnReplaceWadDir(AG_Event * event)436 void AGOL_Settings::OnReplaceWadDir(AG_Event *event)
437 {
438 	if(DirSel)
439 		return;
440 
441 	if(AG_TlistSelectedItem(WadDirList) == NULL)
442 		return;
443 
444 	// Create and display a new directory selector dialog
445 	DirSel = new AGOL_DirSelector("Select a folder containing WAD files");
446 
447 	// Register and set the OK and Cancel events
448 	DirSelOkHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::ReplaceWadDirSelectorOk);
449 	DirSel->SetOkAction(DirSelOkHandler);
450 	DirSelCancelHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::DirectorySelectorCancel);
451 	DirSel->SetCancelAction(DirSelCancelHandler);
452 }
453 
OnDeleteWadDir(AG_Event * event)454 void AGOL_Settings::OnDeleteWadDir(AG_Event *event)
455 {
456 	AG_TlistItem *selitem = AG_TlistSelectedItem(WadDirList);
457 
458 	if(selitem && strlen(selitem->text) > 0)
459 	{
460 		list<string>::iterator i;
461 
462 		// Look for the selected directory in the list
463 		for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
464 			if(*i == selitem->text)
465 			{
466 				// Delete the list item
467 				WadDirs.erase(i);
468 				break;
469 			}
470 	}
471 }
472 
OnMoveWadDirUp(AG_Event * event)473 void AGOL_Settings::OnMoveWadDirUp(AG_Event *event)
474 {
475 	AG_TlistItem *selitem = AG_TlistSelectedItem(WadDirList);
476 
477 	if(selitem && strlen(selitem->text) > 0)
478 	{
479 		list<string>::iterator i;
480 		list<string>::iterator prev;
481 
482 		// Look for the selected directory in the list
483 		for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
484 		{
485 			if(*i == selitem->text)
486 			{
487 				// Swap the item with the one before it
488 				if(i != WadDirs.begin())
489 					iter_swap(i, prev);
490 				break;
491 			}
492 
493 			prev = i;
494 		}
495 	}
496 }
497 
OnMoveWadDirDown(AG_Event * event)498 void AGOL_Settings::OnMoveWadDirDown(AG_Event *event)
499 {
500 	AG_TlistItem *selitem = AG_TlistSelectedItem(WadDirList);
501 
502 	if(selitem && strlen(selitem->text) > 0)
503 	{
504 		list<string>::iterator i = WadDirs.begin();
505 		list<string>::iterator prev = WadDirs.begin();
506 
507 		// Look for the selected directory in the list
508 		for(++i; i != WadDirs.end(); ++i)
509 		{
510 			if(*prev == selitem->text)
511 			{
512 				// Swap the item with the one after it
513 				iter_swap(prev, i);
514 				break;
515 			}
516 
517 			prev = i;
518 		}
519 	}
520 }
521 
OdamexPathSelectorOk(AG_Event * event)522 void AGOL_Settings::OdamexPathSelectorOk(AG_Event *event)
523 {
524 	char *odapath = AG_STRING(2);
525 
526 	// If a path came back set the odamex path label
527 	if(odapath && strlen(odapath) > 0)
528 		AG_LabelTextS(OdamexPathLabel, odapath);
529 
530 	DeleteEventHandler(DirSelOkHandler);
531 
532 	delete DirSel;
533 	DirSel = NULL;
534 }
535 
OnBrowseOdamexPath(AG_Event * event)536 void AGOL_Settings::OnBrowseOdamexPath(AG_Event *event)
537 {
538 	if(DirSel)
539 		return;
540 
541 	// Create and display a new directory selector dialog
542 	DirSel = new AGOL_DirSelector("Select your Odamex folder");
543 
544 	// Register and set the OK and Cancel events
545 	DirSelOkHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::OdamexPathSelectorOk);
546 	DirSel->SetOkAction(DirSelOkHandler);
547 	DirSelCancelHandler = RegisterEventHandler((EVENT_FUNC_PTR)&AGOL_Settings::DirectorySelectorCancel);
548 	DirSel->SetCancelAction(DirSelCancelHandler);
549 }
550 
DirectorySelectorCancel(AG_Event * event)551 void AGOL_Settings::DirectorySelectorCancel(AG_Event *event)
552 {
553 	DeleteEventHandler(DirSelCancelHandler);
554 
555 	delete DirSel;
556 	DirSel = NULL;
557 }
558 
559 //****************//
560 // Save Functions //
561 //****************//
562 
SaveServerOptions()563 void AGOL_Settings::SaveServerOptions()
564 {
565 	GuiConfig::Write("MasterOnStart", MasterOnStart);
566 	GuiConfig::Write("ShowBlockedServers", ShowBlocked);
567 	GuiConfig::Write("MasterTimeout", MasterTimeout);
568 	GuiConfig::Write("ServerTimeout", ServerTimeout);
569 }
570 
SaveGuiOptions()571 void AGOL_Settings::SaveGuiOptions()
572 {
573 	if(GuiOptionsBox && GuiOptionsBox->driverCombo)
574 	{
575 		char *driver;
576 
577 		driver = GuiOptionsBox->driverCombo->button->lbl->text;
578 
579 		if(driver && strlen(driver) > 0)
580 			GuiConfig::Write("VideoDriver", string(driver));
581 
582 		if(string(driver) != string(agDriverOps->name))
583 			AG_TextMsgS(AG_MSG_INFO, "The selected video driver will be\n"
584 			                         "used when the application is restarted.");
585 	}
586 }
587 
SaveOdamexPath()588 void AGOL_Settings::SaveOdamexPath()
589 {
590 	if(OdamexPathLabel->text && strlen(OdamexPathLabel->text) > 0)
591 		GuiConfig::Write("OdamexPath", string(OdamexPathLabel->text));
592 	else
593 		GuiConfig::Unset("OdamexPath");
594 }
595 
SaveWadDirs()596 void AGOL_Settings::SaveWadDirs()
597 {
598 	list<string>::iterator i;
599 	string liststr;
600 
601 	// Construct a single string with a seperator for saving
602 	for(i = WadDirs.begin(); i != WadDirs.end(); ++i)
603 		liststr += *i + PATH_DELIMITER;
604 
605 	GuiConfig::Write("WadDirs", liststr);
606 }
607 
SaveExtraParams()608 void AGOL_Settings::SaveExtraParams()
609 {
610 	char *extraParams = NULL;
611 
612 	extraParams = AG_TextboxDupString(ExtraCmdParamsEntry);
613 
614 	if(extraParams && strlen(extraParams) > 0)
615 		GuiConfig::Write("ExtraParams", string(extraParams));
616 	else
617 		GuiConfig::Unset("ExtraParams");
618 
619 	if(extraParams)
620 		free(extraParams);
621 }
622 
623 //******************//
624 // Public Functions //
625 //******************//
626 
SetWindowCloseEvent(EventHandler * handler)627 void AGOL_Settings::SetWindowCloseEvent(EventHandler *handler)
628 {
629 	if(handler)
630 	{
631 		CloseEventHandler = handler;
632 
633 		AG_AddEvent(SettingsDialog, "window-close", EventReceiver, "%p", handler);
634 	}
635 }
636 
637 } // namespace
638