Fix player config window on macOS (#2376).
[dcpomatic.git] / src / wx / player_config_dialog.cc
index 20ddde99202ce1321b6429580a7dbdb670f771b8..a7bb35bda427beca8e2e4b2f68f57d1ab46c119d 100644 (file)
 
 */
 
+
 /** @file src/player_config_dialog.cc
  *  @brief A dialogue to edit DCP-o-matic Player configuration.
  */
 
+
+#include "check_box.h"
 #include "config_dialog.h"
-#include "wx_util.h"
+#include "dir_picker_ctrl.h"
 #include "editable_list.h"
-#include "filter_dialog.h"
+#include "email_dialog.h"
 #include "file_picker_ctrl.h"
-#include "dir_picker_ctrl.h"
-#include "isdcf_metadata_dialog.h"
-#include "server_dialog.h"
+#include "filter_dialog.h"
 #include "make_chain_dialog.h"
-#include "email_dialog.h"
-#include "name_format_editor.h"
 #include "nag_dialog.h"
-#include "monitor_dialog.h"
-#include "check_box.h"
+#include "name_format_editor.h"
+#include "server_dialog.h"
 #include "static_text.h"
+#include "wx_util.h"
 #include "lib/config.h"
-#include "lib/ratio.h"
-#include "lib/filter.h"
+#include "lib/cross.h"
 #include "lib/dcp_content_type.h"
+#include "lib/exceptions.h"
+#include "lib/filter.h"
 #include "lib/log.h"
+#include "lib/ratio.h"
 #include "lib/util.h"
-#include "lib/cross.h"
-#include "lib/exceptions.h"
-#include <dcp/locale_convert.h>
-#include <dcp/exceptions.h>
 #include <dcp/certificate_chain.h>
-#include <wx/stdpaths.h>
+#include <dcp/exceptions.h>
+#include <dcp/locale_convert.h>
+#include <dcp/warnings.h>
+LIBDCP_DISABLE_WARNINGS
+#include <wx/filepicker.h>
 #include <wx/preferences.h>
 #include <wx/spinctrl.h>
-#include <wx/filepicker.h>
+#include <wx/stdpaths.h>
+LIBDCP_ENABLE_WARNINGS
 #include <RtAudio.h>
 #include <boost/filesystem.hpp>
-#include <boost/foreach.hpp>
-#include <iostream>
 
-using std::vector;
-using std::string;
+
+using std::function;
 using std::list;
-using std::cout;
-using std::pair;
 using std::make_pair;
 using std::map;
+using std::pair;
+using std::shared_ptr;
+using std::string;
+using std::vector;
 using boost::bind;
-using boost::shared_ptr;
-using boost::function;
 using boost::optional;
+#if BOOST_VERSION >= 106100
+using namespace boost::placeholders;
+#endif
 using dcp::locale_convert;
 
+
 class PlayerGeneralPage : public GeneralPage
 {
 public:
@@ -78,14 +83,13 @@ public:
        {}
 
 private:
-       void setup ()
+       void setup () override
        {
                wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
 
                int r = 0;
                add_language_controls (table, r);
-               add_play_sound_controls (table, r);
                add_update_controls (table, r);
 
                add_label_to_sizer (table, _panel, _("Start player as"), true, wxGBPosition(r, 0));
@@ -121,41 +125,19 @@ private:
                table->Add (_respect_kdm, wxGBPosition(r, 0), wxGBSpan(1, 2));
                ++r;
 
-               add_label_to_sizer (table, _panel, _("Activity log file"), true, wxGBPosition (r, 0));
-               _activity_log_file = new FilePickerCtrl (_panel, _("Select activity log file"), "*", true, true);
-               table->Add (_activity_log_file, wxGBPosition(r, 1));
-               ++r;
-
                add_label_to_sizer (table, _panel, _("Debug log file"), true, wxGBPosition (r, 0));
-               _debug_log_file = new FilePickerCtrl (_panel, _("Select debug log file"), "*", true, true);
+               _debug_log_file = new FilePickerCtrl (_panel, _("Select debug log file"), "*", false, true);
                table->Add (_debug_log_file, wxGBPosition(r, 1));
                ++r;
 
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               add_label_to_sizer (table, _panel, _("KDM server URL"), true, wxGBPosition(r, 0));
-               _kdm_server_url = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(400, -1));
-               table->Add (_kdm_server_url, wxGBPosition (r, 1));
-               ++r;
-
-               add_label_to_sizer (table, _panel, _("Lock file"), true, wxGBPosition(r, 0));
-               _lock_file = new FilePickerCtrl (_panel, _("Select lock file"), "*", true, true);
-               table->Add (_lock_file, wxGBPosition (r, 1));
-               ++r;
-#endif
-
                _player_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::player_mode_changed, this));
                _image_display->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::image_display_changed, this));
                _video_display_mode->Bind (wxEVT_CHOICE, bind(&PlayerGeneralPage::video_display_mode_changed, this));
-               _respect_kdm->Bind (wxEVT_CHECKBOX, bind(&PlayerGeneralPage::respect_kdm_changed, this));
-               _activity_log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::activity_log_file_changed, this));
+               _respect_kdm->bind(&PlayerGeneralPage::respect_kdm_changed, this);
                _debug_log_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::debug_log_file_changed, this));
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               _kdm_server_url->Bind (wxEVT_TEXT, bind(&PlayerGeneralPage::kdm_server_url_changed, this));
-               _lock_file->Bind (wxEVT_FILEPICKER_CHANGED, bind(&PlayerGeneralPage::lock_file_changed, this));
-#endif
        }
 
-       void config_changed ()
+       void config_changed () override
        {
                GeneralPage::config_changed ();
 
@@ -184,18 +166,9 @@ private:
 
                checked_set (_image_display, config->image_display());
                checked_set (_respect_kdm, config->respect_kdm_validity_periods());
-               if (config->player_activity_log_file()) {
-                       checked_set (_activity_log_file, *config->player_activity_log_file());
-               }
                if (config->player_debug_log_file()) {
                        checked_set (_debug_log_file, *config->player_debug_log_file());
                }
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               checked_set (_kdm_server_url, config->kdm_server_url());
-               if (config->player_lock_file()) {
-                       checked_set (_lock_file, config->player_lock_file().get());
-               }
-#endif
        }
 
 private:
@@ -233,172 +206,45 @@ private:
                Config::instance()->set_respect_kdm_validity_periods(_respect_kdm->GetValue());
        }
 
-       void activity_log_file_changed ()
-       {
-               Config::instance()->set_player_activity_log_file(wx_to_std(_activity_log_file->GetPath()));
-       }
-
        void debug_log_file_changed ()
        {
                Config::instance()->set_player_debug_log_file(wx_to_std(_debug_log_file->GetPath()));
        }
 
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-       void kdm_server_url_changed ()
-       {
-               Config::instance()->set_kdm_server_url(wx_to_std(_kdm_server_url->GetValue()));
-       }
-
-       void lock_file_changed ()
-       {
-               Config::instance()->set_player_lock_file(wx_to_std(_lock_file->GetPath()));
-       }
-#endif
-
        wxChoice* _player_mode;
        wxChoice* _image_display;
        wxChoice* _video_display_mode;
-       wxCheckBox* _respect_kdm;
-       FilePickerCtrl* _activity_log_file;
+       CheckBox* _respect_kdm;
        FilePickerCtrl* _debug_log_file;
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-       wxTextCtrl* _kdm_server_url;
-       FilePickerCtrl* _lock_file;
-#endif
 };
 
-class LocationsPage : public StandardPage
-{
-public:
-       LocationsPage (wxSize panel_size, int border)
-               : StandardPage (panel_size, border)
-       {}
-
-       wxString GetName () const
-       {
-               return _("Locations");
-       }
-
-#ifdef DCPOMATIC_OSX
-       wxBitmap GetLargeIcon () const
-       {
-               return wxBitmap ("locations", wxBITMAP_TYPE_PNG_RESOURCE);
-       }
-#endif
-
-private:
-       void setup ()
-       {
-
-               int r = 0;
-
-               wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
-               _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
-
-               add_label_to_sizer (table, _panel, _("Content directory"), true, wxGBPosition (r, 0));
-               _content_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1));
-               table->Add (_content_directory, wxGBPosition (r, 1));
-               ++r;
-
-               add_label_to_sizer (table, _panel, _("Playlist directory"), true, wxGBPosition (r, 0));
-               _playlist_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1));
-               table->Add (_playlist_directory, wxGBPosition (r, 1));
-               ++r;
-
-               add_label_to_sizer (table, _panel, _("KDM directory"), true, wxGBPosition (r, 0));
-               _kdm_directory = new wxDirPickerCtrl (_panel, wxID_ANY, wxEmptyString, wxDirSelectorPromptStr, wxDefaultPosition, wxSize (300, -1));
-               table->Add (_kdm_directory, wxGBPosition (r, 1));
-               ++r;
-
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               add_label_to_sizer (table, _panel, _("Background image"), true, wxGBPosition (r, 0));
-               _background_image = new FilePickerCtrl (_panel, _("Select image file"), "*.png;*.jpg;*.jpeg;*.tif;*.tiff", true);
-               table->Add (_background_image, wxGBPosition (r, 1));
-               ++r;
-#endif
-
-               _content_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::content_directory_changed, this));
-               _playlist_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::playlist_directory_changed, this));
-               _kdm_directory->Bind (wxEVT_DIRPICKER_CHANGED, bind(&LocationsPage::kdm_directory_changed, this));
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               _background_image->Bind (wxEVT_FILEPICKER_CHANGED, bind(&LocationsPage::background_image_changed, this));
-#endif
-       }
-
-       void config_changed ()
-       {
-               Config* config = Config::instance ();
-
-               if (config->player_content_directory()) {
-                       checked_set (_content_directory, *config->player_content_directory());
-               }
-               if (config->player_playlist_directory()) {
-                       checked_set (_playlist_directory, *config->player_playlist_directory());
-               }
-               if (config->player_kdm_directory()) {
-                       checked_set (_kdm_directory, *config->player_kdm_directory());
-               }
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-               if (config->player_background_image()) {
-                       checked_set (_background_image, *config->player_background_image());
-               }
-#endif
-       }
-
-       void content_directory_changed ()
-       {
-               Config::instance()->set_player_content_directory(wx_to_std(_content_directory->GetPath()));
-       }
-
-       void playlist_directory_changed ()
-       {
-               Config::instance()->set_player_playlist_directory(wx_to_std(_playlist_directory->GetPath()));
-       }
-
-       void kdm_directory_changed ()
-       {
-               Config::instance()->set_player_kdm_directory(wx_to_std(_kdm_directory->GetPath()));
-       }
-
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-       void background_image_changed ()
-       {
-               boost::filesystem::path const f = wx_to_std(_background_image->GetPath());
-               if (!boost::filesystem::is_regular_file(f) || !wxImage::CanRead(std_to_wx(f.string()))) {
-                       error_dialog (0, _("Could not load image file."));
-                       if (Config::instance()->player_background_image()) {
-                               checked_set (_background_image, *Config::instance()->player_background_image());
-                       }
-                       return;
-               }
-
-               Config::instance()->set_player_background_image(f);
-       }
-#endif
-
-       wxDirPickerCtrl* _content_directory;
-       wxDirPickerCtrl* _playlist_directory;
-       wxDirPickerCtrl* _kdm_directory;
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-       FilePickerCtrl* _background_image;
-#endif
-};
 
 /** @class PlayerAdvancedPage
  *  @brief Advanced page of the preferences dialog for the player.
  */
-class PlayerAdvancedPage : public StockPage
+class PlayerAdvancedPage : public Page
 {
 public:
        PlayerAdvancedPage (wxSize panel_size, int border)
-               : StockPage (Kind_Advanced, panel_size, border)
+               : Page (panel_size, border)
                , _log_general (0)
                , _log_warning (0)
                , _log_error (0)
                , _log_timing (0)
-               , _log_debug_decode (0)
        {}
 
+       wxString GetName () const override
+       {
+               return _("Advanced");
+       }
+
+#ifdef DCPOMATIC_OSX
+       wxBitmap GetLargeIcon () const override
+       {
+               return wxBitmap(icon_path("advanced"), wxBITMAP_TYPE_PNG);
+       }
+#endif
+
 private:
        void add_top_aligned_label_to_sizer (wxSizer* table, wxWindow* parent, wxString text)
        {
@@ -411,9 +257,9 @@ private:
                table->Add (m, 0, flags, DCPOMATIC_SIZER_Y_GAP);
        }
 
-       void setup ()
+       void setup () override
        {
-               wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
+               auto table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
                table->AddGrowableCol (1, 1);
                _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
 
@@ -429,8 +275,6 @@ private:
                        /// TRANSLATORS: translate the word "Timing" here; do not include the "Config|" prefix
                        _log_timing = new CheckBox (_panel, S_("Config|Timing"));
                        t->Add (_log_timing, 1, wxEXPAND | wxALL);
-                       _log_debug_decode = new CheckBox (_panel, _("Debug"));
-                       t->Add (_log_debug_decode, 1, wxEXPAND | wxALL);
                        table->Add (t, 0, wxALL, 6);
                }
 
@@ -440,25 +284,23 @@ private:
                table->AddSpacer (0);
 #endif
 
-               _log_general->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::log_changed, this));
-               _log_warning->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::log_changed, this));
-               _log_error->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::log_changed, this));
-               _log_timing->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::log_changed, this));
-               _log_debug_decode->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::log_changed, this));
+               _log_general->bind(&PlayerAdvancedPage::log_changed, this);
+               _log_warning->bind(&PlayerAdvancedPage::log_changed, this);
+               _log_error->bind(&PlayerAdvancedPage::log_changed, this);
+               _log_timing->bind(&PlayerAdvancedPage::log_changed, this);
 #ifdef DCPOMATIC_WINDOWS
-               _win32_console->Bind (wxEVT_CHECKBOX, boost::bind (&PlayerAdvancedPage::win32_console_changed, this));
+               _win32_console->bind(&PlayerAdvancedPage::win32_console_changed, this);
 #endif
        }
 
-       void config_changed ()
+       void config_changed () override
        {
-               Config* config = Config::instance ();
+               auto config = Config::instance ();
 
                checked_set (_log_general, config->log_types() & LogEntry::TYPE_GENERAL);
                checked_set (_log_warning, config->log_types() & LogEntry::TYPE_WARNING);
                checked_set (_log_error, config->log_types() & LogEntry::TYPE_ERROR);
                checked_set (_log_timing, config->log_types() & LogEntry::TYPE_TIMING);
-               checked_set (_log_debug_decode, config->log_types() & LogEntry::TYPE_DEBUG_DECODE);
 #ifdef DCPOMATIC_WINDOWS
                checked_set (_win32_console, config->win32_console());
 #endif
@@ -479,9 +321,6 @@ private:
                if (_log_timing->GetValue ()) {
                        types |= LogEntry::TYPE_TIMING;
                }
-               if (_log_debug_decode->GetValue ()) {
-                       types |= LogEntry::TYPE_DEBUG_DECODE;
-               }
                Config::instance()->set_log_types (types);
        }
 
@@ -492,204 +331,37 @@ private:
        }
 #endif
 
-       wxCheckBox* _log_general;
-       wxCheckBox* _log_warning;
-       wxCheckBox* _log_error;
-       wxCheckBox* _log_timing;
-       wxCheckBox* _log_debug_decode;
+       CheckBox* _log_general;
+       CheckBox* _log_warning;
+       CheckBox* _log_error;
+       CheckBox* _log_timing;
 #ifdef DCPOMATIC_WINDOWS
-       wxCheckBox* _win32_console;
+       CheckBox* _win32_console;
 #endif
 };
 
 
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-class WatermarkPage : public StandardPage
-{
-public:
-       WatermarkPage (wxSize panel_size, int border)
-               : StandardPage (panel_size, border)
-       {}
-
-       wxString GetName () const
-       {
-               return _("Watermark");
-       }
-
-#ifdef DCPOMATIC_OSX
-       wxBitmap GetLargeIcon () const
-       {
-               /* XXX: this icon doesn't exist; this is just to make the swaroop variant build on OS X */
-               return wxBitmap ("watermark", wxBITMAP_TYPE_PNG_RESOURCE);
-       }
-#endif
-
-private:
-       void setup ()
-       {
-               wxGridBagSizer* table = new wxGridBagSizer (DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP);
-               _panel->GetSizer()->Add (table, 1, wxALL | wxEXPAND, _border);
-
-               int r = 0;
-
-               add_label_to_sizer (table, _panel, _("Theatre name"), true, wxGBPosition(r, 0));
-               _theatre = new wxTextCtrl (_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(300, -1));
-               table->Add (_theatre, wxGBPosition(r, 1), wxGBSpan(1, 2));
-               ++r;
-
-               add_label_to_sizer (table, _panel, _("Period"), true, wxGBPosition(r, 0));
-               _period = new wxSpinCtrl (_panel, wxID_ANY);
-               _period->SetRange (1, 60);
-               table->Add (_period, wxGBPosition(r, 1));
-               add_label_to_sizer (table, _panel, _("minutes"), false, wxGBPosition(r, 2));
-               ++r;
-
-               add_label_to_sizer (table, _panel, _("Duration"), true, wxGBPosition(r, 0));
-               _duration = new wxSpinCtrl (_panel, wxID_ANY);
-               _duration->SetRange (100, 5000);
-               table->Add (_duration, wxGBPosition(r, 1));
-               add_label_to_sizer (table, _panel, _("milliseconds"), false, wxGBPosition(r, 2));
-               ++r;
-
-               _theatre->Bind (wxEVT_TEXT, bind(&WatermarkPage::theatre_changed, this));
-               _duration->Bind (wxEVT_SPINCTRL, bind(&WatermarkPage::duration_changed, this));
-               _period->Bind (wxEVT_SPINCTRL, bind(&WatermarkPage::period_changed, this));
-       }
-
-       void config_changed ()
-       {
-               Config* config = Config::instance ();
-               checked_set (_theatre, config->player_watermark_theatre());
-               checked_set (_duration, config->player_watermark_duration());
-               checked_set (_period, config->player_watermark_period());
-       }
-
-       void theatre_changed ()
-       {
-               Config::instance()->set_player_watermark_theatre(wx_to_std(_theatre->GetValue()));
-       }
-
-       void period_changed ()
-       {
-               Config::instance()->set_player_watermark_period(_period->GetValue());
-       }
-
-       void duration_changed ()
-       {
-               Config::instance()->set_player_watermark_duration(_duration->GetValue());
-       }
-
-       wxTextCtrl* _theatre;
-       wxSpinCtrl* _period;
-       wxSpinCtrl* _duration;
-};
-
-class DevicesPage : public StandardPage
-{
-public:
-       DevicesPage (wxSize panel_size, int border)
-               : StandardPage (panel_size, border)
-       {}
-
-       wxString GetName () const
-       {
-               return _("Devices");
-       }
-
-#ifdef DCPOMATIC_OSX
-       wxBitmap GetLargeIcon () const
-       {
-               /* XXX: this icon doesn't exist; this is just to make the swaroop variant build on OS X */
-               return wxBitmap ("devices", wxBITMAP_TYPE_PNG_RESOURCE);
-       }
-#endif
-
-private:
-       void setup ()
-       {
-               vector<EditableListColumn> columns;
-               columns.push_back(EditableListColumn(wx_to_std(_("Manufacturer ID"))));
-               columns.push_back(EditableListColumn(wx_to_std(_("Product code"))));
-               columns.push_back(EditableListColumn(wx_to_std(_("Serial"))));
-               columns.push_back(EditableListColumn(wx_to_std(_("Manufacture week"))));
-               columns.push_back(EditableListColumn(wx_to_std(_("Manufacture year"))));
-               _monitor_list = new EditableList<Monitor, MonitorDialog> (
-                       _panel,
-                       columns,
-                       boost::bind (&Config::required_monitors, Config::instance()),
-                       boost::bind (&Config::set_required_monitors, Config::instance(), _1),
-                       boost::bind (&DevicesPage::monitor_column, this, _1, _2),
-                       true,
-                       true
-                       );
-               _panel->GetSizer()->Add(_monitor_list, 1, wxEXPAND | wxALL, _border);
-
-               wxButton* get = new Button(_panel, _("Read current devices"));
-               _panel->GetSizer()->Add(get, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
-               get->Bind(wxEVT_BUTTON, bind(&DevicesPage::get_clicked, this));
-       }
-
-       void get_clicked ()
-       {
-               Config::instance()->set_required_monitors(get_monitors());
-               _monitor_list->refresh ();
-       }
-
-       string monitor_column (Monitor m, int c)
-       {
-               switch (c) {
-               case 0:
-                       return m.manufacturer_id;
-               case 1:
-                       return locale_convert<string>(m.manufacturer_product_code);
-               case 2:
-                       return locale_convert<string>(m.serial_number);
-               case 3:
-                       return locale_convert<string>(m.week_of_manufacture);
-               case 4:
-                       return locale_convert<string>(m.year_of_manufacture);
-               default:
-                       DCPOMATIC_ASSERT(false);
-               }
-
-               return "";
-       }
-
-       void config_changed ()
-       {
-               _monitor_list->refresh ();
-       }
-
-private:
-       EditableList<Monitor, MonitorDialog>* _monitor_list;
-};
-
-#endif
-
 wxPreferencesEditor*
 create_player_config_dialog ()
 {
-       wxPreferencesEditor* e = new wxPreferencesEditor ();
+       auto e = new wxPreferencesEditor (_("DCP-o-matic Player Preferences"));
 
 #ifdef DCPOMATIC_OSX
        /* Width that we force some of the config panels to be on OSX so that
           the containing window doesn't shrink too much when we select those panels.
           This is obviously an unpleasant hack.
        */
-       wxSize ps = wxSize (520, -1);
+       auto ps = wxSize (520, -1);
        int const border = 16;
 #else
-       wxSize ps = wxSize (-1, -1);
+       auto ps = wxSize (-1, -1);
        int const border = 8;
 #endif
 
        e->AddPage (new PlayerGeneralPage(wxSize(-1, 500), border));
+       e->AddPage (new SoundPage(ps, border));
        e->AddPage (new LocationsPage(ps, border));
        e->AddPage (new KeysPage(ps, border));
-#ifdef DCPOMATIC_VARIANT_SWAROOP
-       e->AddPage (new WatermarkPage(ps, border));
-       e->AddPage (new DevicesPage(ps, border));
-#endif
        e->AddPage (new PlayerAdvancedPage(ps, border));
        return e;
 }