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