Merge master.
authorCarl Hetherington <cth@carlh.net>
Sun, 22 Jun 2014 20:11:18 +0000 (21:11 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 22 Jun 2014 20:11:18 +0000 (21:11 +0100)
1  2 
ChangeLog
cscript
src/wx/about_dialog.cc
src/wx/audio_panel.cc
src/wx/config_dialog.cc
src/wx/screen_dialog.cc
src/wx/timing_panel.cc
src/wx/wx_util.cc
wscript

diff --combined ChangeLog
index 28cd9b332436f39c1d417a90c2b2a973fbd2fa1f,de702dacf571603cbf6d457285a0748d3e9da725..c2439f80742ebb65e023a5420aa96f5215b04518
+++ b/ChangeLog
@@@ -1,7 -1,29 +1,33 @@@
 +2014-03-07  Carl Hetherington  <cth@carlh.net>
 +
 +      * Add subtitle view.
 +
+ 2014-06-21  Carl Hetherington  <cth@carlh.net>
+       * Move email config into the KDM email page.
+       * Version 1.69.34 released.
+ 2014-06-21  Carl Hetherington  <cth@carlh.net>
+       * Version 1.69.33 released.
+ 2014-06-21  Carl Hetherington  <cth@carlh.net>
+       * Version 1.69.32 released.
+ 2014-06-21  Carl Hetherington  <cth@carlh.net>
+       * Version 1.69.31 released.
+ 2014-06-20  Carl Hetherington  <cth@carlh.net>
+       * Version 1.69.30 released.
+ 2014-06-20  Carl Hetherington  <cth@carlh.net>
+       * Updates to de_DE translation from Carsten Kurz.
  2014-06-18  Carl Hetherington  <cth@carlh.net>
  
        * Version 1.69.29 released.
diff --combined cscript
index adc4da639a2be9ad4e3ca8e7e093f5b9b38604ba,9a576c2f46e8c76cb7dcb79cedf361317101ea76..f3757fa4ad750f2fa0740bb1bd7040ac04c818a3
+++ b/cscript
@@@ -141,8 -141,8 +141,8 @@@ def make_control(debian_version, bits, 
          print >>f,''
  
  def dependencies(target):
-     return (('ffmpeg-cdist', 'bba68a5'),
+     return (('ffmpeg-cdist', '67dc770'),
 -            ('libdcp', 'v0.95.0'))
 +            ('libdcp', '1.0'))
  
  def build(target, options):
      cmd = './waf configure --prefix=%s' % target.work_dir_cscript()
diff --combined src/wx/about_dialog.cc
index dd80e94cb68ff272f46177847fb18c37d8b5e246,5e916d149c5d158a314768c5d1c1b4f0ded507a0..21274cda21211335c9e8e06943a8399318f4f67e
@@@ -1,5 -1,5 +1,5 @@@
  /*
 -    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
 +    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
  
      This program is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
  
  */
  
 +/** @file  src/wx/about_dialog.cc
 + *  @brief The "about DCP-o-matic" dialogue box.
 + */
 +
  #include <wx/notebook.h>
  #include <wx/hyperlink.h>
  #include "lib/version.h"
@@@ -105,6 -101,7 +105,7 @@@ AboutDialog::AboutDialog (wxWindow* par
        translated_by.Add (wxT ("Markus Raab"));
        translated_by.Add (wxT ("Theo Kooijmans"));
        translated_by.Add (wxT ("Max Aeschlimann"));
+       translated_by.Add (wxT ("Carsten Kurz"));
        add_section (_("Translated by"), translated_by);
  
        wxArrayString artwork_by;
        SetSizerAndFit (overall_sizer);
  }
  
 +/** Add a section of credits.
 + *  @param name Name of section.
 + *  @param credits List of names.
 + */
  void
  AboutDialog::add_section (wxString name, wxArrayString credits)
  {
diff --combined src/wx/audio_panel.cc
index 26237db31d3e2aaf57552356bc3823cd62b5462a,917775181eeb00d9a7cafb8a02ff533db527e470..179d7db7115e315fd42d37df378a129df35f7e9c
@@@ -22,7 -22,6 +22,7 @@@
  #include "lib/config.h"
  #include "lib/sound_processor.h"
  #include "lib/ffmpeg_content.h"
 +#include "lib/ffmpeg_audio_stream.h"
  #include "audio_dialog.h"
  #include "audio_panel.h"
  #include "audio_mapping_view.h"
@@@ -50,7 -49,7 +50,7 @@@ AudioPanel::AudioPanel (FilmEditor* e
        grid->Add (_show, wxGBPosition (r, 0));
        ++r;
  
-       add_label_to_grid_bag_sizer (grid, this, _("Audio Gain"), true, wxGBPosition (r, 0));
+       add_label_to_grid_bag_sizer (grid, this, _("Gain"), true, wxGBPosition (r, 0));
        _gain = new ContentSpinCtrlDouble<AudioContent> (
                this,
                new wxSpinCtrlDouble (this),
@@@ -65,7 -64,7 +65,7 @@@
        grid->Add (_gain_calculate_button, wxGBPosition (r, 3));
        ++r;
  
-       add_label_to_grid_bag_sizer (grid, this, _("Audio Delay"), true, wxGBPosition (r, 0));
+       add_label_to_grid_bag_sizer (grid, this, _("Delay"), true, wxGBPosition (r, 0));
        _delay = new ContentSpinCtrl<AudioContent> (
                this,
                new wxSpinCtrl (this),
@@@ -79,7 -78,7 +79,7 @@@
        add_label_to_grid_bag_sizer (grid, this, _("ms"), false, wxGBPosition (r, 2));
        ++r;
  
-       add_label_to_grid_bag_sizer (grid, this, _("Audio Stream"), true, wxGBPosition (r, 0));
+       add_label_to_grid_bag_sizer (grid, this, _("Stream"), true, wxGBPosition (r, 0));
        _stream = new wxChoice (this, wxID_ANY);
        grid->Add (_stream, wxGBPosition (r, 1));
        _description = add_label_to_grid_bag_sizer (grid, this, "", false, wxGBPosition (r, 3));
@@@ -240,7 -239,7 +240,7 @@@ AudioPanel::setup_stream_description (
                } else {
                        s << fcs->audio_channels() << wxT (" ") << _("channels");
                }
 -              s << wxT (", ") << fcs->content_audio_frame_rate() << _("Hz");
 +              s << wxT (", ") << fcs->audio_frame_rate() << _("Hz");
                _description->SetLabel (s);
        }
  }
diff --combined src/wx/config_dialog.cc
index b447e0eee9a57328f76541993b44c498ef785060,19ab877c2815f50de5215f33ad62658b1896d93b..94ab0597b4239b463ce4f79bfb1925a7ebc3c939
  #include <wx/preferences.h>
  #include <wx/filepicker.h>
  #include <wx/spinctrl.h>
 -#include <libdcp/colour_matrix.h>
 +#include <dcp/colour_matrix.h>
  #include "lib/config.h"
  #include "lib/ratio.h"
  #include "lib/scaler.h"
  #include "lib/filter.h"
  #include "lib/dcp_content_type.h"
  #include "lib/colour_conversion.h"
 +#include "lib/log.h"
  #include "config_dialog.h"
  #include "wx_util.h"
  #include "editable_list.h"
@@@ -107,25 -106,6 +107,6 @@@ public
                _num_local_encoding_threads = new wxSpinCtrl (panel);
                table->Add (_num_local_encoding_threads, 1);
  
-               add_label_to_sizer (table, panel, _("Outgoing mail server"), true);
-               _mail_server = new wxTextCtrl (panel, wxID_ANY);
-               table->Add (_mail_server, 1, wxEXPAND | wxALL);
-               
-               add_label_to_sizer (table, panel, _("Mail user name"), true);
-               _mail_user = new wxTextCtrl (panel, wxID_ANY);
-               table->Add (_mail_user, 1, wxEXPAND | wxALL);
-               
-               add_label_to_sizer (table, panel, _("Mail password"), true);
-               _mail_password = new wxTextCtrl (panel, wxID_ANY);
-               table->Add (_mail_password, 1, wxEXPAND | wxALL);
-               
-               wxStaticText* plain = add_label_to_sizer (table, panel, _("(password will be stored on disk in plaintext)"), false);
-               plain->SetFont (font);
-               table->AddSpacer (0);
-               
-               add_label_to_sizer (table, panel, _("From address for KDM emails"), true);
-               _kdm_from = new wxTextCtrl (panel, wxID_ANY);
-               table->Add (_kdm_from, 1, wxEXPAND | wxALL);
                
                _check_for_updates = new wxCheckBox (panel, wxID_ANY, _("Check for updates on startup"));
                table->Add (_check_for_updates, 1, wxEXPAND | wxALL);
                _num_local_encoding_threads->SetValue (config->num_local_encoding_threads ());
                _num_local_encoding_threads->Bind (wxEVT_COMMAND_SPINCTRL_UPDATED, boost::bind (&GeneralPage::num_local_encoding_threads_changed, this));
  
-               _mail_server->SetValue (std_to_wx (config->mail_server ()));
-               _mail_server->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&GeneralPage::mail_server_changed, this));
-               _mail_user->SetValue (std_to_wx (config->mail_user ()));
-               _mail_user->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&GeneralPage::mail_user_changed, this));
-               _mail_password->SetValue (std_to_wx (config->mail_password ()));
-               _mail_password->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&GeneralPage::mail_password_changed, this));
-               _kdm_from->SetValue (std_to_wx (config->kdm_from ()));
-               _kdm_from->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&GeneralPage::kdm_from_changed, this));
                _check_for_updates->SetValue (config->check_for_updates ());
                _check_for_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_updates_changed, this));
                _check_for_test_updates->SetValue (config->check_for_test_updates ());
@@@ -223,26 -195,6 +196,6 @@@ private
                }
        }
        
-       void mail_server_changed ()
-       {
-               Config::instance()->set_mail_server (wx_to_std (_mail_server->GetValue ()));
-       }
-       
-       void mail_user_changed ()
-       {
-               Config::instance()->set_mail_user (wx_to_std (_mail_user->GetValue ()));
-       }
-       
-       void mail_password_changed ()
-       {
-               Config::instance()->set_mail_password (wx_to_std (_mail_password->GetValue ()));
-       }
-       
-       void kdm_from_changed ()
-       {
-               Config::instance()->set_kdm_from (wx_to_std (_kdm_from->GetValue ()));
-       }
        void check_for_updates_changed ()
        {
                Config::instance()->set_check_for_updates (_check_for_updates->GetValue ());
        wxCheckBox* _set_language;
        wxChoice* _language;
        wxSpinCtrl* _num_local_encoding_threads;
-       wxTextCtrl* _mail_server;
-       wxTextCtrl* _mail_user;
-       wxTextCtrl* _mail_password;
-       wxTextCtrl* _kdm_from;
        wxCheckBox* _check_for_updates;
        wxCheckBox* _check_for_test_updates;
  };
@@@ -447,14 -395,14 +396,14 @@@ private
  
        void issuer_changed ()
        {
 -              libdcp::XMLMetadata m = Config::instance()->dcp_metadata ();
 +              dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
                m.issuer = wx_to_std (_issuer->GetValue ());
                Config::instance()->set_dcp_metadata (m);
        }
        
        void creator_changed ()
        {
 -              libdcp::XMLMetadata m = Config::instance()->dcp_metadata ();
 +              dcp::XMLMetadata m = Config::instance()->dcp_metadata ();
                m.creator = wx_to_std (_creator->GetValue ());
                Config::instance()->set_dcp_metadata (m);
        }
@@@ -698,22 -646,82 +647,82 @@@ public
  #endif                
                wxBoxSizer* s = new wxBoxSizer (wxVERTICAL);
                panel->SetSizer (s);
+               wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+               table->AddGrowableCol (1, 1);
+               s->Add (table, 1, wxTOP | wxLEFT | wxRIGHT | wxEXPAND, _border);
+               add_label_to_sizer (table, panel, _("Outgoing mail server"), true);
+               _mail_server = new wxTextCtrl (panel, wxID_ANY);
+               table->Add (_mail_server, 1, wxEXPAND | wxALL);
                
-               _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (480, 128), wxTE_MULTILINE);
-               s->Add (_kdm_email, 1, wxEXPAND | wxALL, _border);
+               add_label_to_sizer (table, panel, _("Mail user name"), true);
+               _mail_user = new wxTextCtrl (panel, wxID_ANY);
+               table->Add (_mail_user, 1, wxEXPAND | wxALL);
+               
+               add_label_to_sizer (table, panel, _("Mail password"), true);
+               _mail_password = new wxTextCtrl (panel, wxID_ANY);
+               table->Add (_mail_password, 1, wxEXPAND | wxALL);
+               
+               wxStaticText* plain = add_label_to_sizer (table, panel, _("(password will be stored on disk in plaintext)"), false);
+               wxFont font = plain->GetFont();
+               font.SetStyle (wxFONTSTYLE_ITALIC);
+               font.SetPointSize (font.GetPointSize() - 1);
+               plain->SetFont (font);
+               table->AddSpacer (0);
+               
+               add_label_to_sizer (table, panel, _("From address"), true);
+               _kdm_from = new wxTextCtrl (panel, wxID_ANY);
+               table->Add (_kdm_from, 1, wxEXPAND | wxALL);
                
+               _kdm_email = new wxTextCtrl (panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize (480, 128), wxTE_MULTILINE);
+               s->Add (_kdm_email, 1.5, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, _border);
+               Config* config = Config::instance ();
+               _mail_server->SetValue (std_to_wx (config->mail_server ()));
+               _mail_server->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_server_changed, this));
+               _mail_user->SetValue (std_to_wx (config->mail_user ()));
+               _mail_user->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_user_changed, this));
+               _mail_password->SetValue (std_to_wx (config->mail_password ()));
+               _mail_password->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::mail_password_changed, this));
+               _kdm_from->SetValue (std_to_wx (config->kdm_from ()));
+               _kdm_from->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_from_changed, this));
                _kdm_email->Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&KDMEmailPage::kdm_email_changed, this));
                _kdm_email->SetValue (wx_to_std (Config::instance()->kdm_email ()));
  
                return panel;
        }
  
- private:      
+ private:
+       void mail_server_changed ()
+       {
+               Config::instance()->set_mail_server (wx_to_std (_mail_server->GetValue ()));
+       }
+       
+       void mail_user_changed ()
+       {
+               Config::instance()->set_mail_user (wx_to_std (_mail_user->GetValue ()));
+       }
+       
+       void mail_password_changed ()
+       {
+               Config::instance()->set_mail_password (wx_to_std (_mail_password->GetValue ()));
+       }
+       
+       void kdm_from_changed ()
+       {
+               Config::instance()->set_kdm_from (wx_to_std (_kdm_from->GetValue ()));
+       }
        void kdm_email_changed ()
        {
                Config::instance()->set_kdm_email (wx_to_std (_kdm_email->GetValue ()));
        }
  
+       wxTextCtrl* _mail_server;
+       wxTextCtrl* _mail_user;
+       wxTextCtrl* _mail_password;
+       wxTextCtrl* _kdm_from;
        wxTextCtrl* _kdm_email;
  };
  
@@@ -736,10 -744,15 +745,15 @@@ public
                wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                table->AddGrowableCol (1, 1);
                s->Add (table, 1, wxALL | wxEXPAND, _border);
-               
-               add_label_to_sizer (table, panel, _("Maximum JPEG2000 bandwidth"), true);
-               _maximum_j2k_bandwidth = new wxSpinCtrl (panel);
-               table->Add (_maximum_j2k_bandwidth, 1);
+               {
+                       add_label_to_sizer (table, panel, _("Maximum JPEG2000 bandwidth"), true);
+                       wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+                       _maximum_j2k_bandwidth = new wxSpinCtrl (panel);
+                       s->Add (_maximum_j2k_bandwidth, 1);
+                       add_label_to_sizer (s, panel, _("Mbit/s"), false);
+                       table->Add (s, 1);
+               }
  
                _allow_any_dcp_frame_rate = new wxCheckBox (panel, wxID_ANY, _("Allow any DCP frame rate"));
                table->Add (_allow_any_dcp_frame_rate, 1, wxEXPAND | wxALL);
                _log_error = new wxCheckBox (panel, wxID_ANY, _("Errors"));
                table->AddSpacer (0);
                table->Add (_log_error, 1, wxEXPAND | wxALL);
-               _log_timing = new wxCheckBox (panel, wxID_ANY, _("Timing"));
+               _log_timing = new wxCheckBox (panel, wxID_ANY, S_("Config|Timing"));
                table->AddSpacer (0);
                table->Add (_log_timing, 1, wxEXPAND | wxALL);
  
@@@ -828,10 -841,7 +842,7 @@@ create_config_dialog (
        wxSize ps = wxSize (480, -1);
        int const border = 16;
  #else
-       /* We seem to need to specify height here, otherwise the general panel
-          is too short (at least on Linux).
-        */
-       wxSize ps = wxSize (-1, 400);
+       wxSize ps = wxSize (-1, -1);
        int const border = 8;
  #endif
        
diff --combined src/wx/screen_dialog.cc
index 0d46a46ec215dfc5f7de8cdaf89821d955bf3fe2,c6991271675f3321e82886478fbad2a879bff1ea..6b58145eb367737c6bf6317f8b4b7d368bf43b8f
@@@ -19,7 -19,7 +19,7 @@@
  
  #include <wx/filepicker.h>
  #include <wx/validate.h>
 -#include <libdcp/exceptions.h>
 +#include <dcp/exceptions.h>
  #include "lib/compose.hpp"
  #include "lib/util.h"
  #include "screen_dialog.h"
@@@ -31,14 -31,14 +31,14 @@@ using std::string
  using std::cout;
  using boost::shared_ptr;
  
 -ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name, shared_ptr<libdcp::Certificate> certificate)
 +ScreenDialog::ScreenDialog (wxWindow* parent, string title, string name, shared_ptr<dcp::Certificate> certificate)
        : TableDialog (parent, std_to_wx (title), 2, true)
        , _certificate (certificate)
  {
-       add ("Name", true);
+       add (_("Name"), true);
        _name = add (new wxTextCtrl (this, wxID_ANY, std_to_wx (name), wxDefaultPosition, wxSize (320, -1)));
  
-       add ("Server manufacturer", true);
+       add (_("Server manufacturer"), true);
        _manufacturer = add (new wxChoice (this, wxID_ANY));
  
        add (_("Certificate"), true);
@@@ -79,7 -79,7 +79,7 @@@ ScreenDialog::name () cons
        return wx_to_std (_name->GetValue());
  }
  
 -shared_ptr<libdcp::Certificate>
 +shared_ptr<dcp::Certificate>
  ScreenDialog::certificate () const
  {
        return _certificate;
@@@ -89,10 -89,10 +89,10 @@@ voi
  ScreenDialog::load_certificate (boost::filesystem::path file)
  {
        try {
 -              _certificate.reset (new libdcp::Certificate (file));
 +              _certificate.reset (new dcp::Certificate (file));
                _certificate_text->SetValue (_certificate->certificate ());
 -      } catch (libdcp::MiscError& e) {
 +      } catch (dcp::MiscError& e) {
-               error_dialog (this, String::compose ("Could not read certificate file (%1)", e.what()));
+               error_dialog (this, wxString::Format (_("Could not read certificate file (%s)"), e.what()));
        }
  }
  
@@@ -128,7 -128,7 +128,7 @@@ voi
  ScreenDialog::setup_sensitivity ()
  {
        wxButton* ok = dynamic_cast<wxButton*> (FindWindowById (wxID_OK, this));
 -      ok->Enable (_certificate);
 +      ok->Enable (_certificate.get ());
  
        _download_certificate->Enable (
                _manufacturer->GetStringSelection() == _("Doremi") ||
diff --combined src/wx/timing_panel.cc
index cc0639b4ccfd500609c879e41c36df016d4b1b36,5d21d0a02bbe4b5ddadf4ee43ee992d06f08380b..9a4551193e9672dfe2ed4468fe01678f5af556c5
@@@ -31,7 -31,8 +31,8 @@@ using boost::dynamic_pointer_cast
  using boost::lexical_cast;
  
  TimingPanel::TimingPanel (FilmEditor* e)
-       : FilmEditorPanel (e, _("Timing"))
+       /* horrid hack for apparent lack of context support with wxWidgets i18n code */
+       : FilmEditorPanel (e, S_("Timing|Timing"))
  {
        wxFlexGridSizer* grid = new wxFlexGridSizer (2, 4, 4);
        _sizer->Add (grid, 0, wxALL, 8);
@@@ -87,7 -88,7 +88,7 @@@ TimingPanel::film_content_changed (int 
                if (content) {
                        _position->set (content->position (), film_video_frame_rate);
                } else {
 -                      _position->set (0, 24);
 +                      _position->set (DCPTime () , 24);
                }
        } else if (
                property == ContentProperty::LENGTH ||
                        _full_length->set (content->full_length (), film_video_frame_rate);
                        _play_length->set (content->length_after_trim (), film_video_frame_rate);
                } else {
 -                      _full_length->set (0, 24);
 -                      _play_length->set (0, 24);
 +                      _full_length->set (DCPTime (), 24);
 +                      _play_length->set (DCPTime (), 24);
                }
        } else if (property == ContentProperty::TRIM_START) {
                if (content) {
                        _trim_start->set (content->trim_start (), film_video_frame_rate);
                        _play_length->set (content->length_after_trim (), film_video_frame_rate);
                } else {
 -                      _trim_start->set (0, 24);
 -                      _play_length->set (0, 24);
 +                      _trim_start->set (DCPTime (), 24);
 +                      _play_length->set (DCPTime (), 24);
                }
        } else if (property == ContentProperty::TRIM_END) {
                if (content) {
                        _trim_end->set (content->trim_end (), film_video_frame_rate);
                        _play_length->set (content->length_after_trim (), film_video_frame_rate);
                } else {
 -                      _trim_end->set (0, 24);
 -                      _play_length->set (0, 24);
 +                      _trim_end->set (DCPTime (), 24);
 +                      _play_length->set (DCPTime (), 24);
                }
        }
  
@@@ -155,8 -156,7 +156,8 @@@ TimingPanel::full_length_changed (
        if (c.size() == 1) {
                shared_ptr<ImageContent> ic = dynamic_pointer_cast<ImageContent> (c.front ());
                if (ic && ic->still ()) {
 -                      ic->set_video_length (rint (_full_length->get (_editor->film()->video_frame_rate()) * ic->video_frame_rate() / TIME_HZ));
 +                      /* XXX: No effective FRC here... is this right? */
 +                      ic->set_video_length (ContentTime (_full_length->get (_editor->film()->video_frame_rate()), FrameRateChange (1, 1)));
                }
        }
  }
diff --combined src/wx/wx_util.cc
index aac35e97a4a1a2b2eb4ba5b78b81f0eeb1b3a697,218a786b2a8f52dd57237416fb5406867e0726ad..94a08f37289625eaf4c660ab4ba5c81d6b5cab36
@@@ -123,7 -123,7 +123,7 @@@ int const ThreadedStaticText::_update_e
   *  @param initial Initial text for the wxStaticText while the computation is being run.
   *  @param fn Function which works out what the wxStaticText content should be and returns it.
   */
 -ThreadedStaticText::ThreadedStaticText (wxWindow* parent, wxString initial, function<string ()> fn)
 +ThreadedStaticText::ThreadedStaticText (wxWindow* parent, wxString initial, boost::function<string ()> fn)
        : wxStaticText (parent, wxID_ANY, initial)
  {
        Bind (wxEVT_COMMAND_TEXT_UPDATED, boost::bind (&ThreadedStaticText::thread_finished, this, _1), _update_event_id);
@@@ -139,7 -139,7 +139,7 @@@ ThreadedStaticText::~ThreadedStaticTex
  
  /** Run our thread and post the result to the GUI thread via AddPendingEvent */
  void
 -ThreadedStaticText::run (function<string ()> fn)
 +ThreadedStaticText::run (boost::function<string ()> fn)
  try
  {
        wxCommandEvent ev (wxEVT_COMMAND_TEXT_UPDATED, _update_event_id);
@@@ -319,3 -319,21 +319,21 @@@ run_gui_loop (
                wxTheApp->Dispatch ();
        }
  }
+ /** @param s String of the form Context|String
+  *  @return translation, or String if no translation is available.
+  */
+ wxString
+ context_translation (wxString s)
+ {
+       wxString t = wxGetTranslation (s);
+       if (t == s) {
+               /* No translation; strip the context */
+               int c = t.Find (wxT ("|"));
+               if (c != wxNOT_FOUND) {
+                       t = t.Mid (c + 1);
+               }
+       }
+       return t;
+ }
diff --combined wscript
index 0a9049a2deaad1775d91c5df6583cce33e2fe3e7,2704ec2e34940338ff5a387783edf1b7775be659..57f8a1bb693a3ee9b7cbf3c99108ec8676631859
+++ b/wscript
@@@ -3,7 -3,7 +3,7 @@@ import o
  import sys
  
  APPNAME = 'dcpomatic'
 -VERSION = '1.69.34devel'
 +VERSION = '2.0.0devel'
  
  def options(opt):
      opt.load('compiler_cxx')
@@@ -33,6 -33,8 +33,8 @@@ def static_ffmpeg(conf)
      conf.env.STLIB_SWSCALE = ['swscale']
      conf.check_cfg(package='libswresample', args='--cflags', uselib_store='SWRESAMPLE', mandatory=True)
      conf.env.STLIB_SWRESAMPLE = ['swresample']
+     conf.check_cfg(package='libpostproc', args='--cflags', uselib_store='POSTPROC', mandatory=True)
+     conf.env.STLIB_POSTPROC = ['postproc']
  
  def dynamic_ffmpeg(conf):
      conf.check_cfg(package='libavformat', args='--cflags --libs', uselib_store='AVFORMAT', mandatory=True)
@@@ -41,6 -43,7 +43,7 @@@
      conf.check_cfg(package='libavutil', args='--cflags --libs', uselib_store='AVUTIL', mandatory=True)
      conf.check_cfg(package='libswscale', args='--cflags --libs', uselib_store='SWSCALE', mandatory=True)
      conf.check_cfg(package='libswresample', args='--cflags --libs', uselib_store='SWRESAMPLE', mandatory=True)
+     conf.check_cfg(package='libpostproc', args='--cflags --libs', uselib_store='POSTPROC', mandatory=True)
  
  def static_openjpeg(conf):
      conf.check_cfg(package='libopenjpeg', args='--cflags', atleast_version='1.5.0', uselib_store='OPENJPEG', mandatory=True)
@@@ -52,9 -55,9 +55,9 @@@ def dynamic_openjpeg(conf)
      conf.check_cfg(package='libopenjpeg', args='--cflags --libs', max_version='1.5.2', mandatory=True)
  
  def static_dcp(conf, static_boost, static_xmlpp, static_xmlsec, static_ssh):
 -    conf.check_cfg(package='libdcp', atleast_version='0.92', args='--cflags', uselib_store='DCP', mandatory=True)
 +    conf.check_cfg(package='libdcp-1.0', atleast_version='0.92', args='--cflags', uselib_store='DCP', mandatory=True)
      conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
 -    conf.env.STLIB_DCP = ['dcp', 'asdcp-libdcp', 'kumu-libdcp']
 +    conf.env.STLIB_DCP = ['dcp-1.0', 'asdcp-libdcp-1.0', 'kumu-libdcp-1.0']
      conf.env.LIB_DCP = ['glibmm-2.4', 'ssl', 'crypto', 'bz2', 'xslt']
  
      if static_boost:
@@@ -78,7 -81,7 +81,7 @@@
          conf.env.LIB_DCP.append('ssh')
  
  def dynamic_dcp(conf):
 -    conf.check_cfg(package='libdcp', atleast_version='0.95.0', args='--cflags --libs', uselib_store='DCP', mandatory=True)
 +    conf.check_cfg(package='libdcp-1.0', atleast_version='0.92', args='--cflags --libs', uselib_store='DCP', mandatory=True)
      conf.env.DEFINES_DCP = [f.replace('\\', '') for f in conf.env.DEFINES_DCP]
  
  def dynamic_ssh(conf):
@@@ -299,8 -302,6 +302,8 @@@ def configure(conf)
      conf.check_cfg(package='glib-2.0', args='--cflags --libs', uselib_store='GLIB', mandatory=True)
      conf.check_cfg(package= '', path=conf.options.magickpp_config, args='--cppflags --cxxflags --libs', uselib_store='MAGICK', mandatory=True)
      conf.check_cfg(package='libzip', args='--cflags --libs', uselib_store='ZIP', mandatory=True)
 +    conf.check_cfg(package='pangomm-1.4', args='--cflags --libs', uselib_store='PANGOMM', mandatory=True)
 +    conf.check_cfg(package='cairomm-1.0', args='--cflags --libs', uselib_store='CAIROMM', mandatory=True)
  
      conf.check_cc(fragment="""
                             #include <glib.h>
@@@ -404,4 -405,4 +407,4 @@@ def pot_merge(bld)
      bld.recurse('src')
  
  def tags(bld):
 -    os.system('etags src/lib/*.cc src/lib/*.h src/wx/*.cc src/wx/*.h src/tools/*.cc src/tools/*.h')
 +    os.system('etags src/lib/*.cc src/lib/*.h src/wx/*.cc src/wx/*.h src/tools/*.cc src/tools/*.h test/*.cc')