*/
#include "wx/about_dialog.h"
+#include "wx/file_dialog.h"
#include "wx/film_viewer.h"
+#include "wx/id.h"
#include "wx/nag_dialog.h"
#include "wx/player_config_dialog.h"
#include "wx/player_information.h"
#include "lib/player.h"
#include "lib/player_video.h"
#include "lib/ratio.h"
-#include "lib/scope_guard.h"
#include "lib/scoped_temporary.h"
#include "lib/server.h"
#include "lib/text_content.h"
#include <dcp/exceptions.h>
#include <dcp/filesystem.h>
#include <dcp/raw_convert.h>
+#include <dcp/scope_guard.h>
#include <dcp/search.h>
#include <dcp/warnings.h>
LIBDCP_DISABLE_WARNINGS
enum {
- ID_file_open = 1,
+ ID_file_open = DCPOMATIC_MAIN_MENU,
ID_file_add_ov,
ID_file_add_kdm,
ID_file_save_frame,
ID_file_history,
/* Allow spare IDs after _history for the recent files list */
- ID_file_close = 100,
+ ID_file_close = DCPOMATIC_MAIN_MENU + 100,
ID_view_cpl,
/* Allow spare IDs for CPLs */
- ID_view_full_screen = 200,
+ ID_view_full_screen = DCPOMATIC_MAIN_MENU + 200,
ID_view_dual_screen,
ID_view_closed_captions,
ID_view_scale_appropriate,
#endif
#ifdef __WXOSX__
- auto prefs = _file_menu->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P"));
+ auto prefs = _file_menu->Append(wxID_PREFERENCES, _("&Preferences...\tCtrl-,"));
#else
auto edit = new wxMenu;
auto prefs = edit->Append (wxID_PREFERENCES, _("&Preferences...\tCtrl-P"));
void file_add_kdm ()
{
- auto d = make_wx<wxFileDialog>(this, _("Select KDM"));
+ FileDialog dialog(this, _("Select KDM"), wxT("XML files|*.xml|All files|*.*"), wxFD_MULTIPLE, "AddKDMPath");
- if (d->ShowModal() == wxID_OK) {
+ if (dialog.show()) {
DCPOMATIC_ASSERT (_film);
auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
DCPOMATIC_ASSERT (dcp);
try {
if (dcp) {
+ dcp::ScopeGuard sg([this]() {
+ _viewer.set_coalesce_player_changes(false);
+ });
_viewer.set_coalesce_player_changes(true);
- dcp->add_kdm (dcp::EncryptedKDM(dcp::file_to_string(wx_to_std(d->GetPath()), MAX_KDM_SIZE)));
+ for (auto path: dialog.paths()) {
+ dcp->add_kdm(dcp::EncryptedKDM(dcp::file_to_string(path)));
+ _kdms.push_back(path);
+ }
examine_content();
- _viewer.set_coalesce_player_changes(false);
}
} catch (exception& e) {
error_dialog (this, wxString::Format (_("Could not load KDM.")), std_to_wx(e.what()));
_viewer.panel()->Reparent(_dual_screen);
_viewer.panel()->SetFocus();
_dual_screen->Show ();
+ LOG_DEBUG_PLAYER("Setting up dual screen mode with %1 displays", wxDisplay::GetCount());
+ for (auto index = 0U; index < wxDisplay::GetCount(); ++index) {
+ wxDisplay display(index);
+ auto client = display.GetClientArea();
+ auto mode = display.GetCurrentMode();
+ auto geometry = display.GetGeometry();
+ LOG_DEBUG_PLAYER("Display %1", index);
+ LOG_DEBUG_PLAYER(" ClientArea position=(%1, %2) size=(%3, %4)", client.GetX(), client.GetY(), client.GetWidth(), client.GetHeight());
+ LOG_DEBUG_PLAYER(" Geometry position=(%1, %2) size=(%3, %4)", geometry.GetX(), geometry.GetY(), geometry.GetWidth(), geometry.GetHeight());
+ LOG_DEBUG_PLAYER(" Mode size=(%1, %2)", mode.GetWidth(), mode.GetHeight());
+ LOG_DEBUG_PLAYER(" Primary? %1", static_cast<int>(display.IsPrimary()));
+ }
if (wxDisplay::GetCount() > 1) {
- switch (Config::instance()->image_display()) {
- case 0:
- _dual_screen->Move (0, 0);
- Move (wxDisplay(0U).GetClientArea().GetWidth(), 0);
- break;
- case 1:
- _dual_screen->Move (wxDisplay(0U).GetClientArea().GetWidth(), 0);
- // (0, 0) doesn't seem to work for some strange reason
- Move (8, 8);
- break;
- }
+ 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 {
auto dcp = std::dynamic_pointer_cast<DCPContent>(_film->content().front());
DCPOMATIC_ASSERT (dcp);
- auto job = make_shared<VerifyDCPJob>(dcp->directories());
+ auto job = make_shared<VerifyDCPJob>(dcp->directories(), _kdms);
VerifyDCPProgressDialog progress(this, _("DCP-o-matic Player"));
bool const completed = progress.run(job);
progress.Close();
wxMenuItem* _view_dual_screen = nullptr;
wxSizer* _main_sizer = nullptr;
PlayerStressTester _stress;
+ /** KDMs that have been loaded, so that we can pass them to the verifier */
+ std::vector<boost::filesystem::path> _kdms;
};
static const wxCmdLineEntryDesc command_line_description[] = {
void handle (shared_ptr<Socket> socket) override
{
try {
- int const length = socket->read_uint32 ();
+ uint32_t const length = socket->read_uint32 ();
+ if (length > 65536) {
+ return;
+ }
scoped_array<char> buffer (new char[length]);
socket->read (reinterpret_cast<uint8_t*> (buffer.get()), length);
string s (buffer.get());