From: <tm...@us...> - 2009-04-26 09:40:38
|
Revision: 3802 http://hugin.svn.sourceforge.net/hugin/?rev=3802&view=rev Author: tmodes Date: 2009-04-26 09:40:36 +0000 (Sun, 26 Apr 2009) Log Message: ----------- Allow only one PTBatcherGUI instance, command line parameters of second start are transfered to first instance (using DDE on windows and TCP over port 4242 on linux) Modified Paths: -------------- hugin/trunk/CMakeLists.txt hugin/trunk/src/hugin1/ptbatcher/BatchFrame.cpp hugin/trunk/src/hugin1/ptbatcher/BatchFrame.h hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.cpp hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.h Modified: hugin/trunk/CMakeLists.txt =================================================================== --- hugin/trunk/CMakeLists.txt 2009-04-26 07:26:03 UTC (rev 3801) +++ hugin/trunk/CMakeLists.txt 2009-04-26 09:40:36 UTC (rev 3802) @@ -105,7 +105,7 @@ # This must come before FINDs for tiff, jpeg, png, zlib to enable # finding the wxWidgets distributions of those packages (Win32 only). -SET(wxWidgets_USE_LIBS base core xrc html xml adv gl) +SET(wxWidgets_USE_LIBS base core xrc html xml adv gl net) FIND_PACKAGE(wxWidgets REQUIRED) IF(NOT wxWidgets_FOUND) MESSAGE("wxWidgets was not found, GUI programs (hugin, nona_gui) disabled") Modified: hugin/trunk/src/hugin1/ptbatcher/BatchFrame.cpp =================================================================== --- hugin/trunk/src/hugin1/ptbatcher/BatchFrame.cpp 2009-04-26 07:26:03 UTC (rev 3801) +++ hugin/trunk/src/hugin1/ptbatcher/BatchFrame.cpp 2009-04-26 09:40:36 UTC (rev 3802) @@ -769,21 +769,48 @@ }*/ } +void BatchFrame::SetCheckboxes() +{ + wxConfigBase *config=wxConfigBase::Get(); + int i; + i=config->Read(wxT("/BatchFrame/DeleteCheck"), 0l); + if(i==0) + XRCCTRL(*this,"cb_delete",wxCheckBox)->SetValue(false); + else + XRCCTRL(*this,"cb_delete",wxCheckBox)->SetValue(true); + i=config->Read(wxT("/BatchFrame/ParallelCheck"), 0l); + if(i==0) + XRCCTRL(*this,"cb_parallel",wxCheckBox)->SetValue(false); + else + XRCCTRL(*this,"cb_parallel",wxCheckBox)->SetValue(true); + i=config->Read(wxT("/BatchFrame/ShutdownCheck"), 0l); + if(i==0) + XRCCTRL(*this,"cb_shutdown",wxCheckBox)->SetValue(false); + else + XRCCTRL(*this,"cb_shutdown",wxCheckBox)->SetValue(true); + i=config->Read(wxT("/BatchFrame/OverwriteCheck"), 0l); + if(i==0) + XRCCTRL(*this,"cb_overwrite",wxCheckBox)->SetValue(false); + else + XRCCTRL(*this,"cb_overwrite",wxCheckBox)->SetValue(true); + i=config->Read(wxT("/BatchFrame/VerboseCheck"), 0l); + if(i==0) + XRCCTRL(*this,"cb_verbose",wxCheckBox)->SetValue(false); + else + XRCCTRL(*this,"cb_verbose",wxCheckBox)->SetValue(true); +}; - - - void BatchFrame::OnCheckDelete(wxCommandEvent &event) { if(event.IsChecked()) { m_batch->deleteFiles = true; - wxConfigBase::Get()->Write(wxT("/BatchFrame/DeleteCheck"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/DeleteCheck"), 1l); } else { m_batch->deleteFiles = false; - wxConfigBase::Get()->Write(wxT("/BatchFrame/DeleteCheck"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/DeleteCheck"), 0l); } } @@ -793,12 +820,12 @@ if(event.IsChecked()) { m_batch->overwrite = true; - wxConfigBase::Get()->Write(wxT("/BatchFrame/OverwriteCheck"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/OverwriteCheck"), 1l); } else { m_batch->overwrite = false; - wxConfigBase::Get()->Write(wxT("/BatchFrame/OverwriteCheck"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/OverwriteCheck"), 0l); } } void BatchFrame::OnCheckParallel(wxCommandEvent &event) @@ -806,12 +833,12 @@ if(event.IsChecked()) { m_batch->parallel = true; - wxConfigBase::Get()->Write(wxT("/BatchFrame/ParallelCheck"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/ParallelCheck"), 1l); } else { m_batch->parallel = false; - wxConfigBase::Get()->Write(wxT("/BatchFrame/ParallelCheck"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/ParallelCheck"), 0l); } } @@ -820,12 +847,12 @@ if(event.IsChecked()) { m_batch->shutdown = true; - wxConfigBase::Get()->Write(wxT("/BatchFrame/ShutdownCheck"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/ShutdownCheck"), 1l); } else { m_batch->shutdown = false; - wxConfigBase::Get()->Write(wxT("/BatchFrame/ShutdownCheck"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/ShutdownCheck"), 0l); } } @@ -834,12 +861,12 @@ if(event.IsChecked()) { m_batch->verbose = true; - wxConfigBase::Get()->Write(wxT("/BatchFrame/VerboseCheck"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/VerboseCheck"), 1l); } else { m_batch->verbose = false; - wxConfigBase::Get()->Write(wxT("/BatchFrame/VerboseCheck"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/VerboseCheck"), 0l); } } @@ -848,10 +875,10 @@ //wxMessageBox(_T("Closing...")); //save windows position if(this->IsMaximized()) - wxConfigBase::Get()->Write(wxT("/BatchFrame/Max"), 1); + wxConfigBase::Get()->Write(wxT("/BatchFrame/Max"), 1l); else { - wxConfigBase::Get()->Write(wxT("/BatchFrame/Max"), 0); + wxConfigBase::Get()->Write(wxT("/BatchFrame/Max"), 0l); wxConfigBase::Get()->Write(wxT("/BatchFrame/Width"), this->GetSize().GetWidth()); wxConfigBase::Get()->Write(wxT("/BatchFrame/Height"), this->GetSize().GetHeight()); } @@ -991,9 +1018,9 @@ void BatchFrame::RestoreSize() { //get saved size - int width = wxConfigBase::Get()->Read(wxT("/BatchFrame/Width"), -1); - int height = wxConfigBase::Get()->Read(wxT("/BatchFrame/Height"), -1); - int max = wxConfigBase::Get()->Read(wxT("/BatchFrame/Max"), -1);; + int width = wxConfigBase::Get()->Read(wxT("/BatchFrame/Width"), -1l); + int height = wxConfigBase::Get()->Read(wxT("/BatchFrame/Height"), -1l); + int max = wxConfigBase::Get()->Read(wxT("/BatchFrame/Max"), -1l);; if((width != -1) && (height != -1)) this->SetSize(width,height); else Modified: hugin/trunk/src/hugin1/ptbatcher/BatchFrame.h =================================================================== --- hugin/trunk/src/hugin1/ptbatcher/BatchFrame.h 2009-04-26 07:26:03 UTC (rev 3801) +++ hugin/trunk/src/hugin1/ptbatcher/BatchFrame.h 2009-04-26 09:40:36 UTC (rev 3802) @@ -85,6 +85,8 @@ void OnClose(wxCloseEvent &event); //Resets all checkboxes based on m_batch object properties void PropagateDefaults(); + //Sets all checkboxes corresponding the setting in config + void SetCheckboxes(); //Starts batch execution void RunBatch(); //Sets locale and XRC prefix pointers from main app Modified: hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.cpp =================================================================== --- hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.cpp 2009-04-26 07:26:03 UTC (rev 3801) +++ hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.cpp 2009-04-26 09:40:36 UTC (rev 3802) @@ -86,21 +86,28 @@ // set the name of locale recource to look for m_locale.AddCatalog(wxT("hugin")); - if ( ! wxFile::Exists(m_xrcPrefix + wxT("/batch_frame.xrc")) ) { - wxMessageBox(_("xrc directory not found, hugin needs to be properly installed\nTried Path:" + m_xrcPrefix ), _("Fatal Error")); - return false; - } - // initialize image handlers - wxInitAllImageHandlers(); + const wxString name = wxString::Format(_T(".PTBatcherGUI-%s"), wxGetUserId().c_str()); + m_checker = new wxSingleInstanceChecker(name); + bool IsFirstInstance=(!m_checker->IsAnotherRunning()); - // Initialize all the XRC handlers. - wxXmlResource::Get()->InitAllHandlers(); - wxXmlResource::Get()->AddHandler(new ProjectListBoxXmlHandler()); - // load XRC files - wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_frame.xrc")); - wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_toolbar.xrc")); - wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_menu.xrc")); + if(IsFirstInstance) + { + if ( ! wxFile::Exists(m_xrcPrefix + wxT("/batch_frame.xrc")) ) { + wxMessageBox(_("xrc directory not found, hugin needs to be properly installed\nTried Path:") + m_xrcPrefix , _("Fatal Error")); + return false; + } + // initialize image handlers + wxInitAllImageHandlers(); + // Initialize all the XRC handlers. + wxXmlResource::Get()->InitAllHandlers(); + wxXmlResource::Get()->AddHandler(new ProjectListBoxXmlHandler()); + // load XRC files + wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_frame.xrc")); + wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_toolbar.xrc")); + wxXmlResource::Get()->Load(m_xrcPrefix + wxT("batch_menu.xrc")); + }; + // parse arguments static const wxCmdLineEntryDesc cmdLineDesc[] = { @@ -151,10 +158,33 @@ } */ #endif - m_frame = new BatchFrame(&m_locale,m_xrcPrefix); - m_frame->RestoreSize(); - SetTopWindow(m_frame); - m_frame->Show(true); + wxClient client; + wxConnectionBase *conn; + wxString servername; +#ifdef __WINDOWS__ + servername=name; +#else + servername=wxT("4242"); +#endif + if(IsFirstInstance) + { + m_frame = new BatchFrame(&m_locale,m_xrcPrefix); + m_frame->RestoreSize(); + SetTopWindow(m_frame); + m_frame->Show(true); + m_server = new BatchIPCServer(); + if (!m_server->Create(servername)) + { + delete m_server; + m_server = NULL; + }; + } + else + { + conn=client.MakeConnection(wxT("localhost"), servername, IPC_START); + if(!conn) + return false; + }; //m_frame->SetLocaleAndXRC(&m_locale,m_xrcPrefix); //projectsRunning=0; unsigned int count = 0; @@ -167,20 +197,23 @@ if(!projectSpecified) //next parameter must be new script file { wxFileName name(param); - Project *proj = new Project(param,name.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + name.GetName()); - projList.Add(proj); - m_frame->SetStatusText(_("Added project ")+param); - - m_frame->projListBox->AppendProject(proj); + name.MakeAbsolute(); + if(IsFirstInstance) + m_frame->AddToList(name.GetFullPath()); + else + conn->Request(wxT("A ")+name.GetFullPath()); projectSpecified = true; } else //parameter could be previous project's output prefix { wxFileName fn(param); + fn.MakeAbsolute(); if(!fn.HasExt()) //if there is no extension we have a prefix { - projList.Last().prefix = param; - m_frame->projListBox->ReloadProject(m_frame->projListBox->GetItemCount()-1,((Project*)&projList.Last())); + if(IsFirstInstance) + m_frame->ChangePrefix(-1,fn.GetFullPath()); + else + conn->Request(wxT("P ")+fn.GetFullPath()); projectSpecified = false; } else @@ -193,8 +226,10 @@ ext.CmpNoCase(wxT("pnm")) == 0 || ext.CmpNoCase(wxT("hdr")) == 0) { //extension will be removed before stitch, so there is no need to do it now - projList.Last().prefix = param; - m_frame->projListBox->ReloadProject(m_frame->projListBox->GetItemCount()-1,((Project*)&projList.Last())); + if(IsFirstInstance) + m_frame->ChangePrefix(-1,fn.GetFullPath()); + else + conn->Request(wxT("P ")+fn.GetFullPath()); projectSpecified = false; } else //if parameter has a different extension we presume it is a new script file @@ -223,72 +258,39 @@ m_frame->projListBox->Deselect(m_frame->projListBox->GetItemCount()-1);*/ //we add the new project - wxFileName name(param); - Project *proj = new Project(param,name.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + name.GetName()); - projList.Add(proj); - m_frame->SetStatusText(_("Added project ")+param); - m_frame->projListBox->AppendProject(proj); + if(IsFirstInstance) + m_frame->AddToList(fn.GetFullPath()); + else + conn->Request(wxT("A ")+fn.GetFullPath()); projectSpecified = true; } } //else of if(!fn.HasExt()) } } - if (parser.Found(wxT("d")) ) { - XRCCTRL(*m_frame,"cb_delete",wxCheckBox)->SetValue(true); - wxConfigBase::Get()->Write(wxT("/BatchFrame/DeleteCheck"), 1); - } - else{ - int del = wxConfigBase::Get()->Read(wxT("/BatchFrame/DeleteCheck"), (long)0); - if(del==0) - XRCCTRL(*m_frame,"cb_delete",wxCheckBox)->SetValue(false); - else - XRCCTRL(*m_frame,"cb_delete",wxCheckBox)->SetValue(true); - } - if (parser.Found(wxT("p")) ) { - XRCCTRL(*m_frame,"cb_parallel",wxCheckBox)->SetValue(true); - wxConfigBase::Get()->Write(wxT("/BatchFrame/ParallelCheck"), 1); - } - else{ - int par = wxConfigBase::Get()->Read(wxT("/BatchFrame/ParallelCheck"), (long)0); - if(par==0) - XRCCTRL(*m_frame,"cb_parallel",wxCheckBox)->SetValue(false); - else - XRCCTRL(*m_frame,"cb_parallel",wxCheckBox)->SetValue(true); - } - if (parser.Found(wxT("s")) ) { - XRCCTRL(*m_frame,"cb_shutdown",wxCheckBox)->SetValue(true); - wxConfigBase::Get()->Write(wxT("/BatchFrame/ShutdownCheck"), 1); - } - else{ - int shtdwn = wxConfigBase::Get()->Read(wxT("/BatchFrame/ShutdownCheck"), (long)0); - if(shtdwn==0) - XRCCTRL(*m_frame,"cb_shutdown",wxCheckBox)->SetValue(false); - else - XRCCTRL(*m_frame,"cb_shutdown",wxCheckBox)->SetValue(true); - } - if (parser.Found(wxT("o")) ) { - XRCCTRL(*m_frame,"cb_overwrite",wxCheckBox)->SetValue(true); - wxConfigBase::Get()->Write(wxT("/BatchFrame/OverwriteCheck"), 1); - } - else{ - int overwrite = wxConfigBase::Get()->Read(wxT("/BatchFrame/OverwriteCheck"), (long)0); - if(overwrite==0) - XRCCTRL(*m_frame,"cb_overwrite",wxCheckBox)->SetValue(false); - else - XRCCTRL(*m_frame,"cb_overwrite",wxCheckBox)->SetValue(true); - } - if (parser.Found(wxT("v")) ) { - XRCCTRL(*m_frame,"cb_verbose",wxCheckBox)->SetValue(true); - wxConfigBase::Get()->Write(wxT("/BatchFrame/VerboseCheck"), 1); - } - else{ - int overwrite = wxConfigBase::Get()->Read(wxT("/BatchFrame/VerboseCheck"), (long)0); - if(overwrite==0) - XRCCTRL(*m_frame,"cb_verbose",wxCheckBox)->SetValue(false); - else - XRCCTRL(*m_frame,"cb_verbose",wxCheckBox)->SetValue(true); - } + wxConfigBase *config=wxConfigBase::Get(); + if (parser.Found(wxT("d"))) + config->Write(wxT("/BatchFrame/DeleteCheck"), 1l); + if (parser.Found(wxT("p"))) + config->Write(wxT("/BatchFrame/ParallelCheck"), 1l); + if (parser.Found(wxT("s"))) + config->Write(wxT("/BatchFrame/ShutdownCheck"), 1l); + if (parser.Found(wxT("o"))) + config->Write(wxT("/BatchFrame/OverwriteCheck"), 1l); + if (parser.Found(wxT("v"))) + config->Write(wxT("/BatchFrame/VerboseCheck"), 1l); + config->Flush(); + if(!IsFirstInstance) + { + conn->Request(wxT("BringWindowToTop")); + if(parser.Found(wxT("b"))) + conn->Request(wxT("RunBatch")); + conn->Disconnect(); + delete conn; + delete m_checker; + return false; + }; + m_frame->SetCheckboxes(); m_frame->PropagateDefaults(); if (parser.Found(wxT("b")) ) { m_frame->RunBatch(); @@ -296,6 +298,13 @@ return true; } +int PTBatcherGUI::OnExit() +{ + delete m_checker; + delete m_server; + return 0; +} + void PTBatcherGUI::OnItemActivated(wxListEvent &event) { wxCommandEvent dummy; @@ -327,9 +336,34 @@ } #ifdef __WXMAC__ -// wx calls this method when the app gets "Open file" AppleEvent +// wx calls this method when the app gets "Open file" AppleEvent void PTBatcherGUI::MacOpenFile(const wxString &fileName) { m_macFileNameToOpenOnStart = fileName; } #endif + +wxChar* BatchIPCConnection::OnRequest(const wxString& topic, const wxString& item, int *size, wxIPCFormat format) +{ + BatchFrame *MyBatchFrame=wxGetApp().GetFrame(); + if(item.Left(1)==wxT("A")) + MyBatchFrame->AddToList(item.Mid(2)); + if(item.Left(1)==wxT("P")) + MyBatchFrame->ChangePrefix(-1,item.Mid(2)); + MyBatchFrame->SetCheckboxes(); + if(item==wxT("BringWindowToTop")) + MyBatchFrame->RequestUserAttention(); + if(item==wxT("RunBatch")) + { + wxCommandEvent myEvent(wxEVT_COMMAND_TOOL_CLICKED ,XRCID("tool_start")); + MyBatchFrame->AddPendingEvent(myEvent); + }; + return wxT(""); +}; + +wxConnectionBase* BatchIPCServer::OnAcceptConnection (const wxString& topic) +{ + if(topic==IPC_START) + return new BatchIPCConnection; + return NULL; +}; Modified: hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.h =================================================================== --- hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.h 2009-04-26 07:26:03 UTC (rev 3801) +++ hugin/trunk/src/hugin1/ptbatcher/PTBatcherGUI.h 2009-04-26 09:40:36 UTC (rev 3802) @@ -33,6 +33,8 @@ #include <wx/dir.h> #include <wx/wfstream.h> #include <wx/filefn.h> +#include <wx/snglinst.h> +#include <wx/ipc.h> #include <hugin_config.h> #include <wx/cmdline.h> @@ -46,6 +48,29 @@ #define PTBATCHERGUI_H // ********************************************************************** +/** class for communication between different PTBatcherGUI instances + * + * this class is used to transfer the commandline parameters of the second instance of PTBatcherGUI + * to the first and only running instance of PTBatcherGUI +*/ +class BatchIPCConnection : public wxConnection +{ +public: + /** request handler for transfer */ + virtual wxChar *OnRequest(const wxString& topic, const wxString& item, int *size = NULL, wxIPCFormat format = wxIPC_TEXT); +}; + +/** server for server which implements the communication between different PTBatcherGUI instances (see BatchIPCConnection) */ +class BatchIPCServer : public wxServer +{ +public: + /**accept connection handler (establish the connection) */ + virtual wxConnectionBase *OnAcceptConnection (const wxString& topic); +}; + +/** topic name for BatchIPCConnection and BatchIPCServer */ +const wxString IPC_START(wxT("BatchStart")); + /** The application class for hugin_stitch_project * * it contains the main frame. @@ -56,7 +81,8 @@ /** pseudo constructor. with the ability to fail gracefully. */ virtual bool OnInit(); - + virtual int OnExit(); + //Handles some input keys for the frame void OnItemActivated(wxListEvent &event); void OnKeyDown(wxKeyEvent &event); @@ -77,6 +103,9 @@ wxLocale m_locale; wxString m_xrcPrefix; PTPrograms progs; + wxSingleInstanceChecker *m_checker; + BatchIPCServer *m_server; + #ifdef __WXMAC__ wxString m_macFileNameToOpenOnStart; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |