+ void view_cpl (wxCommandEvent& ev)
+ {
+ auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
+ DCPOMATIC_ASSERT (dcp);
+ auto cpls = dcp::find_and_resolve_cpls (dcp->directories(), true);
+ int id = ev.GetId() - ID_view_cpl;
+ DCPOMATIC_ASSERT (id >= 0);
+ DCPOMATIC_ASSERT (id < int(cpls.size()));
+ auto i = cpls.begin();
+ while (id > 0) {
+ ++i;
+ --id;
+ }
+
+ _viewer.set_coalesce_player_changes(true);
+ dcp->set_cpl ((*i)->id());
+ examine_content ();
+ _viewer.set_coalesce_player_changes(false);
+
+ _info->triggered_update ();
+ }
+
+ void view_full_screen ()
+ {
+ if (_mode == Config::PLAYER_MODE_FULL) {
+ _mode = Config::PLAYER_MODE_WINDOW;
+ } else {
+ _mode = Config::PLAYER_MODE_FULL;
+ }
+ setup_screen ();
+ setup_menu ();
+ }
+
+ void view_dual_screen ()
+ {
+ if (_mode == Config::PLAYER_MODE_DUAL) {
+ _mode = Config::PLAYER_MODE_WINDOW;
+ } else {
+ _mode = Config::PLAYER_MODE_DUAL;
+ }
+ setup_screen ();
+ setup_menu ();
+ }
+
+ void setup_menu ()
+ {
+ if (_view_full_screen) {
+ _view_full_screen->Check (_mode == Config::PLAYER_MODE_FULL);
+ }
+ if (_view_dual_screen) {
+ _view_dual_screen->Check (_mode == Config::PLAYER_MODE_DUAL);
+ }
+ }
+
+ void setup_screen ()
+ {
+ _controls->Show (_mode != Config::PLAYER_MODE_FULL);
+ _info->Show (_mode != Config::PLAYER_MODE_FULL);
+ _overall_panel->SetBackgroundColour (_mode == Config::PLAYER_MODE_FULL ? wxColour(0, 0, 0) : wxNullColour);
+ ShowFullScreen (_mode == Config::PLAYER_MODE_FULL);
+ _viewer.set_pad_black(_mode != Config::PLAYER_MODE_WINDOW);
+
+ if (_mode == Config::PLAYER_MODE_DUAL) {
+ std::cout << "Set up dual screen mode: " << wxDisplay::GetCount() << " displays.\n";
+ _dual_screen = new wxFrame (this, wxID_ANY, wxT(""));
+ _dual_screen->SetBackgroundColour (wxColour(0, 0, 0));
+ _dual_screen->ShowFullScreen (true);
+ _viewer.panel()->Reparent(_dual_screen);
+ _viewer.panel()->SetFocus();
+ _dual_screen->Show ();
+ for (auto index = 0U; index < wxDisplay::GetCount(); ++index) {
+ auto client = wxDisplay(index).GetClientArea();
+ auto mode = wxDisplay(index).GetCurrentMode();
+ auto geometry = wxDisplay(index).GetGeometry();
+ std::cout << "Display " << index << "\n";
+ std::cout << " ClientArea (" << client.GetX() << ", " << client.GetY() << ") (" << client.GetWidth() << ", " << client.GetHeight() << ")\n";
+ std::cout << " Geometry (" << geometry.GetX() << ", " << geometry.GetY() << ") (" << geometry.GetWidth() << ", " << geometry.GetHeight() << ")\n";
+ std::cout << " Mode (" << mode.GetWidth() << ", " << mode.GetHeight() << ")\n";
+ std::cout << " Primary? " << wxDisplay(index).IsPrimary() << "\n";
+ }
+ if (wxDisplay::GetCount() > 1) {
+ wxRect geometry[2] = {
+ wxDisplay(0U).GetGeometry(),
+ wxDisplay(1U).GetGeometry()
+ };
+ auto const image_display = Config::instance()->image_display();
+ _dual_screen->Move(geometry[image_display].GetX(), geometry[image_display].GetY());
+ _viewer.panel()->SetSize(geometry[image_display].GetWidth(), geometry[image_display].GetHeight());
+ Move(geometry[1 - image_display].GetX(), geometry[1 - image_display].GetY());
+ }
+ _dual_screen->Bind(wxEVT_CHAR_HOOK, boost::bind(&DOMFrame::dual_screen_key_press, this, _1));
+ } else {
+ if (_dual_screen) {
+ _viewer.panel()->Reparent(_overall_panel);
+ _dual_screen->Destroy ();
+ _dual_screen = 0;
+ }
+ }
+
+ setup_main_sizer (_mode);
+ }
+
+ void dual_screen_key_press(wxKeyEvent& ev)
+ {
+ if (ev.GetKeyCode() == WXK_F11) {
+ if (ev.ShiftDown()) {
+ view_dual_screen();
+ } else if (!ev.HasAnyModifiers()) {
+ view_full_screen();
+ }
+ }
+ }
+
+ void view_closed_captions ()
+ {
+ _viewer.show_closed_captions();
+ }
+
+ void tools_verify ()
+ {
+ auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
+ DCPOMATIC_ASSERT (dcp);
+
+ auto job = make_shared<VerifyDCPJob>(dcp->directories(), _kdms);
+ VerifyDCPProgressDialog progress(this, _("DCP-o-matic Player"));
+ bool const completed = progress.run(job);
+ progress.Close();
+
+ if (completed) {
+ VerifyDCPDialog dialog(this, job);
+ dialog.ShowModal();
+ }
+ }
+