#include "lib/copy_to_drive_job.h"
#include "lib/job_manager.h"
#include "lib/disk_writer_messages.h"
+#include "lib/version.h"
+#include "lib/warnings.h"
#include <wx/wx.h>
+DCPOMATIC_DISABLE_WARNINGS
#include <boost/process.hpp>
+DCPOMATIC_ENABLE_WARNINGS
#ifdef DCPOMATIC_WINDOWS
#include <boost/process/windows.hpp>
#endif
#ifdef DCPOMATIC_OSX
-#include <ApplicationServices/ApplicationServices.h>
+#include <notify.h>
#endif
using std::string;
*/
dcpomatic_log.reset(new FileLog(config_path() / "disk.log"));
dcpomatic_log->set_types (dcpomatic_log->types() | LogEntry::TYPE_DISK);
- LOG_DISK_NC("dcpomatic_disk started");
+ LOG_DISK("dcpomatic_disk %1 started", dcpomatic_git_commit);
drive_refresh ();
- Bind (wxEVT_SIZE, boost::bind (&DOMFrame::sized, this, _1));
+ Bind (wxEVT_SIZE, boost::bind(&DOMFrame::sized, this, _1));
+ Bind (wxEVT_CLOSE_WINDOW, boost::bind(&DOMFrame::close, this, _1));
JobManager::instance()->ActiveJobsChanged.connect(boost::bind(&DOMFrame::setup_sensitivity, this));
#endif
#ifdef DCPOMATIC_LINUX
- LOG_DISK("Starting writer process %1", disk_writer_path().string());
- _writer = new boost::process::child (disk_writer_path());
+ if (getenv("DCPOMATIC_NO_START_WRITER")) {
+ LOG_DISK_NC("Not starting writer process as DCPOMATIC_NO_START_WRITER is set");
+ } else {
+ LOG_DISK("Starting writer process %1", disk_writer_path().string());
+ _writer = new boost::process::child (disk_writer_path());
+ }
#endif
- /* _writer is always running on macOS at the moment */
+#ifdef DCPOMATIC_OSX
+ LOG_DISK_NC("Sending notification to writer daemon");
+ notify_post ("com.dcpomatic.disk.writer.start");
+#endif
}
~DOMFrame ()
ev.Skip ();
}
+
+ bool should_close ()
+ {
+ if (!JobManager::instance()->work_to_do()) {
+ return true;
+ }
+
+ wxMessageDialog* d = new wxMessageDialog (
+ 0,
+ _("There are unfinished jobs; are you sure you want to quit?"),
+ _("Unfinished jobs"),
+ wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
+ );
+
+ bool const r = d->ShowModal() == wxID_YES;
+ d->Destroy ();
+ return r;
+ }
+
+
+ void close (wxCloseEvent& ev)
+ {
+ if (!should_close()) {
+ ev.Veto ();
+ return;
+ }
+
+ ev.Skip ();
+ }
+
+
void open ()
{
wxDirDialog* d = new wxDirDialog (this, _("Choose a DCP folder"), wxT(""), wxDD_DIR_MUST_EXIST);
DCPOMATIC_ASSERT (_drive->GetSelection() != wxNOT_FOUND);
DCPOMATIC_ASSERT (static_cast<bool>(_dcp_path));
+ bool have_writer = true;
+ if (!_nanomsg.send(DISK_WRITER_PING "\n", 2000)) {
+ have_writer = false;
+ } else {
+ optional<string> reply = _nanomsg.receive (2000);
+ if (!reply || *reply != DISK_WRITER_PONG) {
+ have_writer = false;
+ }
+ }
+
+ if (!have_writer) {
+#ifdef DCPOMATIC_WINDOWS
+ MessageDialog* m = new MessageDialog (
+ this,
+ _("DCP-o-matic Disk Writer"),
+ _("Do you see a 'User Account Control' dialogue asking about dcpomatic2_disk_writer.exe? If so, click 'Yes', then try again.")
+ );
+ m->ShowModal ();
+ m->Destroy ();
+ return;
+#else
+ throw CommunicationFailedError ();
+#endif
+ }
+
Drive const& drive = _drives[_drive->GetSelection()];
if (drive.mounted()) {
TryUnmountDialog* d = new TryUnmountDialog(this, drive.description());
unsetenv ("UBUNTU_MENUPROXY");
#endif
-#ifdef __WXOSX__
- ProcessSerialNumber serial;
- GetCurrentProcess (&serial);
- TransformProcessType (&serial, kProcessTransformToForegroundApplication);
+#ifdef DCPOMATIC_OSX
+ make_foreground_application ();
#endif
dcpomatic_setup_path_encoding ();
if (!warning->confirmed()) {
return false;
}
+ warning->Destroy ();
_frame = new DOMFrame (_("DCP-o-matic Disk Writer"));
SetTopWindow (_frame);