Fixed build with Ubuntu Disco
[amule.git] / src / GuiEvents.cpp
blob5191aa8d47ce8d710ebc7e79ab8c514f9ce417a5
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2004-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 //
6 // Any parts of this program derived from the xMule, lMule or eMule project,
7 // or contributed by third-party developers are copyrighted by their
8 // respective authors.
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "GuiEvents.h"
26 #include "amule.h"
27 #include "PartFile.h"
28 #include "DownloadQueue.h"
29 #include "ServerList.h"
30 #include "Preferences.h"
31 #include "ExternalConn.h"
32 #include "SearchFile.h"
33 #include "SearchList.h"
34 #include "IPFilter.h"
35 #include "Friend.h"
36 #include "Logger.h"
38 #ifndef AMULE_DAEMON
39 # include "ChatWnd.h"
40 # include "amuleDlg.h"
41 # include "ServerWnd.h"
42 # include "SearchDlg.h"
43 # include "TransferWnd.h"
44 # include "SharedFilesWnd.h"
45 # include "ServerListCtrl.h"
46 # include "SourceListCtrl.h"
47 # include "SharedFilesCtrl.h"
48 # include "DownloadListCtrl.h"
49 # include "muuli_wdr.h"
50 # include "SharedFilePeersListCtrl.h"
51 # ifndef CLIENT_GUI
52 # include "PartFileConvertDlg.h"
53 # include "PartFileConvert.h"
54 # endif
55 #endif
57 #ifndef CLIENT_GUI
58 # include "UploadQueue.h"
59 # include "EMSocket.h"
60 # include "ListenSocket.h"
61 # include "MuleUDPSocket.h"
62 #endif
64 #include <common/MacrosProgramSpecific.h>
66 DEFINE_LOCAL_EVENT_TYPE(MULE_EVT_NOTIFY)
69 namespace MuleNotify
72 void HandleNotification(const CMuleNotiferBase& ntf)
74 if (wxThread::IsMain()) {
75 #ifdef AMULE_DAEMON
76 ntf.Notify();
77 #else
78 if (theApp->amuledlg) {
79 ntf.Notify();
81 #endif
82 } else {
83 CMuleGUIEvent evt(ntf.Clone());
84 wxPostEvent(wxTheApp, evt);
89 void HandleNotificationAlways(const CMuleNotiferBase& ntf)
91 CMuleGUIEvent evt(ntf.Clone());
92 wxPostEvent(wxTheApp, evt);
96 void Search_Add_Download(CSearchFile* file, uint8 category)
98 theApp->downloadqueue->AddSearchToDownload(file, category);
102 void ShowUserCount(wxString NOT_ON_DAEMON(str))
104 #ifndef AMULE_DAEMON
105 theApp->amuledlg->ShowUserCount(str);
106 #endif
110 void Search_Update_Progress(uint32 NOT_ON_DAEMON(val))
112 #ifndef AMULE_DAEMON
113 if (theApp->amuledlg->m_searchwnd) {
114 if (val == 0xffff) {
115 // Global search ended
116 theApp->amuledlg->m_searchwnd->ResetControls();
117 } else if (val == 0xfffe) {
118 // Kad search ended
119 theApp->amuledlg->m_searchwnd->KadSearchEnd(0);
120 } else {
121 theApp->amuledlg->m_searchwnd->UpdateProgress(val);
124 #endif
128 void DownloadCtrlUpdateItem(const void* item)
130 #ifndef CLIENT_GUI
131 theApp->ECServerHandler->m_ec_notifier->DownloadFile_SetDirty(static_cast<const CPartFile*>(item));
132 #endif
133 #ifndef AMULE_DAEMON
134 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) {
135 theApp->amuledlg->m_transferwnd->downloadlistctrl->UpdateItem(item);
137 #endif
141 void DownloadCtrlDoItemSelectionChanged()
143 #ifndef AMULE_DAEMON
144 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) {
145 theApp->amuledlg->m_transferwnd->downloadlistctrl->DoItemSelectionChanged();
147 #endif
151 void NodesURLChanged(wxString NOT_ON_DAEMON(url))
153 #ifndef AMULE_DAEMON
154 CastByID(IDC_NODESLISTURL, NULL, wxTextCtrl)->SetValue(url);
155 #endif
158 void ServersURLChanged(wxString NOT_ON_DAEMON(url))
160 #ifndef AMULE_DAEMON
161 CastByID(IDC_SERVERLISTURL, NULL, wxTextCtrl)->SetValue(url);
162 #endif
165 void ShowGUI()
167 #ifndef AMULE_DAEMON
168 theApp->amuledlg->Iconize(false);
169 #endif
172 void SourceCtrlUpdateSource(uint32 NOT_ON_DAEMON(source), SourceItemType NOT_ON_DAEMON(type))
174 #ifndef AMULE_DAEMON
175 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) {
176 theApp->amuledlg->m_transferwnd->clientlistctrl->UpdateItem(source, type);
178 #endif
181 void SourceCtrlAddSource(CPartFile* NOT_ON_DAEMON(owner), CClientRef NOT_ON_DAEMON(source), SourceItemType NOT_ON_DAEMON(type))
183 #ifndef AMULE_DAEMON
184 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) {
185 theApp->amuledlg->m_transferwnd->clientlistctrl->AddSource(owner, source, type);
187 #endif
190 void SourceCtrlRemoveSource(uint32 NOT_ON_DAEMON(source), const CPartFile* NOT_ON_DAEMON(owner))
192 #ifndef AMULE_DAEMON
193 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->clientlistctrl) {
194 theApp->amuledlg->m_transferwnd->clientlistctrl->RemoveSource(source, owner);
196 #endif
199 void SharedCtrlAddClient(CKnownFile* NOT_ON_DAEMON(owner), CClientRef NOT_ON_DAEMON(source), SourceItemType NOT_ON_DAEMON(type))
201 #ifndef AMULE_DAEMON
202 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->peerslistctrl) {
203 theApp->amuledlg->m_sharedfileswnd->peerslistctrl->AddSource(owner, source, type);
205 #endif
208 void SharedCtrlRefreshClient(uint32 NOT_ON_DAEMON(client), SourceItemType NOT_ON_DAEMON(type))
210 #ifndef AMULE_DAEMON
211 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->peerslistctrl) {
212 theApp->amuledlg->m_sharedfileswnd->peerslistctrl->UpdateItem(client, type);
214 #endif
217 void SharedCtrlRemoveClient(uint32 NOT_ON_DAEMON(source), const CKnownFile* NOT_ON_DAEMON(owner))
219 #ifndef AMULE_DAEMON
220 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->peerslistctrl) {
221 theApp->amuledlg->m_sharedfileswnd->peerslistctrl->RemoveSource(source, owner);
223 #endif
226 void ServerRefresh(CServer* NOT_ON_DAEMON(server))
228 #ifndef AMULE_DAEMON
229 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
230 theApp->amuledlg->m_serverwnd->serverlistctrl->RefreshServer(server);
232 #endif
235 void ChatUpdateFriend(CFriend * NOT_ON_DAEMON(toupdate))
237 #ifndef AMULE_DAEMON
238 if (theApp->amuledlg->m_chatwnd) {
239 theApp->amuledlg->m_chatwnd->UpdateFriend(toupdate);
241 #endif
244 void ChatRemoveFriend(CFriend * toremove)
246 #ifndef AMULE_DAEMON
247 if (theApp->amuledlg->m_chatwnd) {
248 theApp->amuledlg->m_chatwnd->RemoveFriend(toremove);
250 #endif
251 delete toremove;
254 #ifdef CLIENT_GUI
256 void PartFile_Swap_A4AF(CPartFile* file)
258 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_THIS);
261 void PartFile_Swap_A4AF_Auto(CPartFile* file)
263 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO);
266 void PartFile_Swap_A4AF_Others(CPartFile* file)
268 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_SWAP_A4AF_OTHERS);
271 void PartFile_Pause(CPartFile* file)
273 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_PAUSE);
276 void PartFile_Resume(CPartFile* file)
278 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_RESUME);
281 void PartFile_Stop(CPartFile* file)
283 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_STOP);
286 void PartFile_PrioAuto(CPartFile* file, bool val)
288 theApp->downloadqueue->AutoPrio(file, val);
291 void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool)
293 theApp->downloadqueue->Prio(file, newDownPriority);
296 void PartFile_Delete(CPartFile* file)
298 theApp->downloadqueue->SendFileCommand(file, EC_OP_PARTFILE_DELETE);
301 void PartFile_SetCat(CPartFile* file, uint32 val)
303 theApp->downloadqueue->Category(file, val);
306 void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val)
308 theApp->sharedfiles->SetFilePrio(file, val);
311 void KnownFile_Up_Prio_Auto(CKnownFile* file)
313 theApp->sharedfiles->SetFilePrio(file, PR_AUTO);
316 void KnownFile_Comment_Set(CKnownFile* file, wxString comment, int8 rating)
318 theApp->sharedfiles->SetFileCommentRating(file, comment, rating);
321 void Download_Set_Cat_Prio(uint8, uint8)
325 void Download_Set_Cat_Status(uint8, int)
329 void Upload_Resort_Queue()
333 #else
335 void SharedFilesShowFile(CKnownFile* NOT_ON_DAEMON(file))
337 #ifndef AMULE_DAEMON
338 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) {
339 theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->ShowFile(file);
341 #endif
344 void SharedFilesRemoveFile(CKnownFile* NOT_ON_DAEMON(file))
346 #ifndef AMULE_DAEMON
347 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) {
348 theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->RemoveFile(file);
350 #endif
353 void SharedFilesRemoveAllFiles()
355 #ifndef AMULE_DAEMON
356 if (theApp->amuledlg->m_sharedfileswnd) {
357 theApp->amuledlg->m_sharedfileswnd->RemoveAllSharedFiles();
359 #endif
363 void SharedFilesShowFileList()
365 #ifndef AMULE_DAEMON
366 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) {
367 theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->ShowFileList();
369 #endif
373 void SharedFilesUpdateItem(CKnownFile* NOT_ON_DAEMON(file))
375 #ifndef AMULE_DAEMON
376 if (theApp->amuledlg->m_sharedfileswnd && theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl) {
377 theApp->amuledlg->m_sharedfileswnd->sharedfilesctrl->UpdateItem(file);
379 #endif
383 void DownloadCtrlAddFile(CPartFile* file)
385 theApp->ECServerHandler->m_ec_notifier->DownloadFile_AddFile(file);
386 #ifndef AMULE_DAEMON
387 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl ) {
388 theApp->amuledlg->m_transferwnd->downloadlistctrl->AddFile(file);
390 #endif
393 void DownloadCtrlRemoveFile(CPartFile* file)
395 theApp->ECServerHandler->m_ec_notifier->DownloadFile_RemoveFile(file);
396 #ifndef AMULE_DAEMON
397 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) {
398 theApp->amuledlg->m_transferwnd->downloadlistctrl->RemoveFile(file);
400 #endif
403 void DownloadCtrlSort()
405 #ifndef AMULE_DAEMON
406 if (theApp->amuledlg->m_transferwnd && theApp->amuledlg->m_transferwnd->downloadlistctrl) {
407 theApp->amuledlg->m_transferwnd->downloadlistctrl->SortList();
409 #endif
412 void ServerAdd(CServer* NOT_ON_DAEMON(server))
414 #ifndef AMULE_DAEMON
415 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
416 theApp->amuledlg->m_serverwnd->serverlistctrl->AddServer(server);
418 #endif
421 void ServerRemove(CServer* NOT_ON_DAEMON(server))
423 #ifndef AMULE_DAEMON
424 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
425 theApp->amuledlg->m_serverwnd->serverlistctrl->RemoveServer(server);
427 #endif
430 void ServerRemoveDead()
432 if (theApp->serverlist) {
433 theApp->serverlist->RemoveDeadServers();
437 void ServerRemoveAll()
439 #ifndef AMULE_DAEMON
440 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
441 theApp->amuledlg->m_serverwnd->serverlistctrl->DeleteAllItems();
443 #endif
446 void ServerHighlight(CServer* NOT_ON_DAEMON(server), bool NOT_ON_DAEMON(highlight))
448 #ifndef AMULE_DAEMON
449 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
450 theApp->amuledlg->m_serverwnd->serverlistctrl->HighlightServer(server, highlight);
452 #endif
455 void ServerFreeze()
457 #ifndef AMULE_DAEMON
458 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
459 theApp->amuledlg->m_serverwnd->serverlistctrl->Freeze();
461 #endif
464 void ServerThaw()
466 #ifndef AMULE_DAEMON
467 if (theApp->amuledlg->m_serverwnd && theApp->amuledlg->m_serverwnd->serverlistctrl) {
468 theApp->amuledlg->m_serverwnd->serverlistctrl->Thaw();
470 #endif
473 void ServerUpdateED2KInfo()
475 #ifndef AMULE_DAEMON
476 if (theApp->amuledlg->m_serverwnd) {
477 theApp->amuledlg->m_serverwnd->UpdateED2KInfo();
479 #endif
482 void ServerUpdateKadKInfo()
484 #ifndef AMULE_DAEMON
485 if (theApp->amuledlg->m_serverwnd) {
486 theApp->amuledlg->m_serverwnd->UpdateKadInfo();
488 #endif
492 void SearchCancel()
494 #ifndef AMULE_DAEMON
495 if (theApp->amuledlg->m_searchwnd) {
496 theApp->amuledlg->m_searchwnd->ResetControls();
498 #endif
501 void SearchLocalEnd()
503 #ifndef AMULE_DAEMON
504 if (theApp->amuledlg->m_searchwnd) {
505 theApp->amuledlg->m_searchwnd->LocalSearchEnd();
507 #endif
510 void KadSearchEnd(uint32 NOT_ON_DAEMON(id))
512 #ifndef AMULE_DAEMON
513 if (theApp->amuledlg->m_searchwnd) {
514 theApp->amuledlg->m_searchwnd->KadSearchEnd(id);
516 #endif
517 theApp->searchlist->SetKadSearchFinished();
520 void Search_Update_Sources(CSearchFile* result)
522 result->SetDownloadStatus();
523 #ifndef AMULE_DAEMON
524 if (theApp->amuledlg && theApp->amuledlg->m_searchwnd) {
525 theApp->amuledlg->m_searchwnd->UpdateResult(result);
527 #endif
530 void Search_Add_Result(CSearchFile* NOT_ON_DAEMON(result))
532 #ifndef AMULE_DAEMON
533 if (theApp->amuledlg && theApp->amuledlg->m_searchwnd) {
534 theApp->amuledlg->m_searchwnd->AddResult(result);
536 #endif
540 void ChatConnResult(bool NOT_ON_DAEMON(success), uint64 NOT_ON_DAEMON(id), wxString NOT_ON_DAEMON(message))
542 #ifndef AMULE_DAEMON
543 if (theApp->amuledlg->m_chatwnd) {
544 theApp->amuledlg->m_chatwnd->ConnectionResult(success, message, id);
546 #endif
549 void ChatProcessMsg(uint64 NOT_ON_DAEMON(sender), wxString NOT_ON_DAEMON(message))
551 #ifndef AMULE_DAEMON
552 if (theApp->amuledlg->m_chatwnd) {
553 theApp->amuledlg->m_chatwnd->ProcessMessage(sender, message);
555 #endif
559 void ChatSendCaptcha(wxString NOT_ON_DAEMON(captcha), uint64 NOT_ON_DAEMON(to_id))
561 #ifndef AMULE_DAEMON
562 if (theApp->amuledlg->m_chatwnd) {
563 theApp->amuledlg->m_chatwnd->SendMessage(captcha, wxEmptyString, to_id);
565 #endif
569 void ShowConnState(long NOT_ON_DAEMON(forceUpdate))
571 #ifndef AMULE_DAEMON
572 theApp->amuledlg->ShowConnectionState(forceUpdate != 0);
573 #endif
576 void ShowUpdateCatTabTitles()
578 #ifndef AMULE_DAEMON
579 if (theApp->amuledlg->m_transferwnd) {
580 theApp->amuledlg->m_transferwnd->UpdateCatTabTitles();
582 #endif
585 void CategoryAdded()
587 #ifndef AMULE_DAEMON
588 if (theApp->amuledlg->m_transferwnd) {
589 theApp->amuledlg->m_transferwnd->
590 AddCategory(theApp->glob_prefs->GetCategory(
591 theApp->glob_prefs->GetCatCount()-1));
593 #endif
596 void CategoryUpdate(uint32 NOT_ON_DAEMON(cat))
598 #ifndef AMULE_DAEMON
599 if (theApp->amuledlg->m_transferwnd) {
600 theApp->amuledlg->m_transferwnd->UpdateCategory(cat);
601 theApp->amuledlg->m_transferwnd->downloadlistctrl->Refresh();
602 theApp->amuledlg->m_searchwnd->UpdateCatChoice();
604 #endif
607 void CategoryDelete(uint32 cat)
609 #ifdef AMULE_DAEMON
610 if (cat > 0) {
611 theApp->downloadqueue->ResetCatParts(cat);
612 theApp->glob_prefs->RemoveCat(cat);
613 if ( theApp->glob_prefs->GetCatCount() == 1 ) {
614 thePrefs::SetAllcatFilter( acfAll );
616 theApp->glob_prefs->SaveCats();
618 #else
619 if (theApp->amuledlg->m_transferwnd) {
620 theApp->amuledlg->m_transferwnd->RemoveCategory(cat);
622 #endif
626 void PartFile_Swap_A4AF(CPartFile* file)
628 if ((file->GetStatus(false) == PS_READY || file->GetStatus(false) == PS_EMPTY)) {
629 CPartFile::SourceSet::const_iterator it = file->GetA4AFList().begin();
630 for ( ; it != file->GetA4AFList().end(); ) {
631 it++->SwapToAnotherFile(true, false, false, file);
636 void PartFile_Swap_A4AF_Auto(CPartFile* file)
638 file->SetA4AFAuto(!file->IsA4AFAuto());
641 void PartFile_Swap_A4AF_Others(CPartFile* file)
643 if ((file->GetStatus(false) == PS_READY) || (file->GetStatus(false) == PS_EMPTY)) {
644 CPartFile::SourceSet::const_iterator it = file->GetSourceList().begin();
645 for( ; it != file->GetSourceList().end(); ) {
646 it++->SwapToAnotherFile(false, false, false, NULL);
651 void PartFile_Pause(CPartFile* file)
653 file->PauseFile();
654 file->SavePartFile();
657 void PartFile_Resume(CPartFile* file)
659 file->ResumeFile();
660 file->SavePartFile();
663 void PartFile_Stop(CPartFile* file)
665 file->StopFile();
666 file->SavePartFile();
669 void PartFile_PrioAuto(CPartFile* file, bool val)
671 file->SetAutoDownPriority(val);
674 void PartFile_PrioSet(CPartFile* file, uint8 newDownPriority, bool bSave)
676 file->SetDownPriority(newDownPriority, bSave);
679 void PartFile_Delete(CPartFile* file)
681 file->Delete();
684 void PartFile_SetCat(CPartFile* file, uint32 val)
686 file->SetCategory(val);
690 void KnownFile_Up_Prio_Set(CKnownFile* file, uint8 val)
692 file->SetAutoUpPriority(false);
693 file->SetUpPriority(val);
696 void KnownFile_Up_Prio_Auto(CKnownFile* file)
698 file->SetAutoUpPriority(true);
699 file->UpdateAutoUpPriority();
702 void KnownFile_Comment_Set(CKnownFile* file, wxString comment, int8 rating)
704 file->SetFileCommentRating(comment, rating);
705 SharedFilesUpdateItem(file);
709 void Download_Set_Cat_Prio(uint8 cat, uint8 newprio)
711 theApp->downloadqueue->SetCatPrio(cat, newprio);
714 void Download_Set_Cat_Status(uint8 cat, int newstatus)
716 theApp->downloadqueue->SetCatStatus(cat, newstatus);
719 void Upload_Resort_Queue()
721 theApp->uploadqueue->ResortQueue();
724 void IPFilter_Reload()
726 theApp->ipfilter->Reload();
729 void IPFilter_Update(wxString url)
731 theApp->ipfilter->Update(url);
734 void Client_Delete(CClientRef client)
736 client.Safe_Delete();
739 #ifndef AMULE_DAEMON
740 void ConvertUpdateProgress(float percent, wxString text, wxString header)
742 CPartFileConvertDlg::UpdateProgress(percent, text, header);
745 void ConvertUpdateJobInfo(ConvertInfo info)
747 CPartFileConvertDlg::UpdateJobInfo(info);
750 void ConvertRemoveJobInfo(unsigned id)
752 CPartFileConvertDlg::RemoveJobInfo(id);
755 void ConvertClearInfos()
757 CPartFileConvertDlg::ClearInfo();
760 void ConvertRemoveJob(unsigned id)
762 CPartFileConvert::RemoveJob(id);
765 void ConvertRetryJob(unsigned id)
767 CPartFileConvert::RetryJob(id);
770 void ConvertReaddAllJobs()
772 CPartFileConvert::ReaddAllJobs();
774 #endif // #ifndef AMULE_DAEMON
776 #endif // #ifndef CLIENT_GUI
779 // File_checked_for_headers