+
+#ifndef DCPOMATIC_WX_UTIL_H
+#define DCPOMATIC_WX_UTIL_H
+
+
+#include "lib/dcpomatic_time.h"
+#include "lib/warnings.h"
+DCPOMATIC_DISABLE_WARNINGS
+#include <wx/wx.h>
+DCPOMATIC_ENABLE_WARNINGS
+#include <wx/gbsizer.h>
+#include <boost/thread.hpp>
+#include <boost/signals2.hpp>
+
+
+class FilePickerCtrl;
+class wxDirPickerCtrl;
+class wxSpinCtrl;
+class wxSpinCtrlDouble;
+class wxGridBagSizer;
+class wxSplashScreen;
+class PasswordEntry;
+
+
+#define DCPOMATIC_SIZER_X_GAP 8
+#define DCPOMATIC_SIZER_Y_GAP 8
+#define DCPOMATIC_SIZER_GAP 8
+#define DCPOMATIC_DIALOG_BORDER 12
+#ifdef __WXGTK3__
+#define DCPOMATIC_SPIN_CTRL_WIDTH 118
+#else
+#define DCPOMATIC_SPIN_CTRL_WIDTH 56
+#endif
+
+/** Amount by which you need to bottom-pad text next to a checkbox in order
+ * for the text baselines to be aligned.
+ */
+#ifdef DCPOMATIC_OSX
+#define DCPOMATIC_CHECKBOX_BOTTOM_PAD 2
+#else
+#define DCPOMATIC_CHECKBOX_BOTTOM_PAD 0
+#endif
+
+/** Amount by which you need to top-pad a choice to make it line up, in some cases */
+#ifdef DCPOMATIC_OSX
+#define DCPOMATIC_CHOICE_TOP_PAD 1
+#else
+#define DCPOMATIC_CHOICE_TOP_PAD 0
+#endif
+
+/** Spacing to use between buttons in a vertical/horizontal line */
+#if defined(DCPOMATIC_OSX) || defined(__WXGTK3__)
+#define DCPOMATIC_BUTTON_STACK_GAP 2
+#else
+#define DCPOMATIC_BUTTON_STACK_GAP 0
+#endif
+
+#ifdef DCPOMATIC_LINUX
+#define DCPOMATIC_RTAUDIO_API RtAudio::LINUX_PULSE
+#endif
+#ifdef DCPOMATIC_WINDOWS
+#define DCPOMATIC_RTAUDIO_API RtAudio::UNSPECIFIED
+#endif
+#ifdef DCPOMATIC_OSX
+#define DCPOMATIC_RTAUDIO_API RtAudio::MACOSX_CORE
+#endif
+
+
+/** i18n macro to support strings like Context|String
+ * so that `String' can be translated to different things
+ * in different contexts.
+ */
+#define S_(x) context_translation(x)
+
+
+extern void error_dialog (wxWindow *, wxString, boost::optional<wxString> e = boost::optional<wxString>());
+extern void message_dialog (wxWindow *, wxString);
+extern bool confirm_dialog (wxWindow *, wxString);
+extern wxStaticText* create_label (wxWindow* p, wxString t, bool left);
+extern wxStaticText* add_label_to_sizer (wxSizer *, wxWindow *, wxString, bool left, int prop = 0, int flags = wxLEFT | wxRIGHT);
+extern wxStaticText* add_label_to_sizer (wxSizer *, wxStaticText *, bool left, int prop = 0, int flags = wxLEFT | wxRIGHT);
+extern wxStaticText* add_label_to_sizer (wxGridBagSizer *, wxWindow *, wxString, bool, wxGBPosition, wxGBSpan span = wxDefaultSpan);
+extern wxStaticText* add_label_to_sizer (wxGridBagSizer *, wxStaticText *, bool, wxGBPosition, wxGBSpan span = wxDefaultSpan);