El 09/10/14 a les 01:11, Benjamin Drung ha escrit:
Your patch needs to be forward ported,

We already have a patch that fixes 2.0.6 for wxWidgets 3.0. Back when you asked me to forward-port my patch to the current svn head (in order to get the changes into upstream), I did. Apart from the porting it includes specific fixes for svn head. Fortunately, 2.0.6 isn't that different from what was svn head back then, so we have a patch for 2.0.6, find it attached. To keep it small, I've removed everything that isn't relevant here (fixes of dead code or code that otherwise isn't relevant on Debian), but we will have that available for upstream. Be aware that this patch is by far not as well tested as my patch for 2.0.5!

[...] backport the preliminary upstream changes for wxWidgets 3.0.1 from r13403 
[...]
[...]
Upstream want to get wx3.0 support in for 2.0.7 and is actively working on 
getting it in the svn

"Actively working", yes, unfortunately. Why? Your messages sounded like upstream was aware of this being resolved already, especially with you being part of upstream (AFAIK). Not only was this a major duplication of effort, but now it also requires additional porting - which is mainly manual work here, given that different people have been working on similar issues and touching the same code, but in different ways. What we're doing here is really inefficient.


So you could provide the missing bits and we will get
upstream to test your proposed changes (when I commit them to the
upstream repository).

So you're proposing to do the upstream integration first? I'd do it the other way round, given that for 2.0.6 we already have a patch and that the upstream integration has just gotten more complicated. We've already lost a lot of time. And before we just upload stuff to upstream, I'd also like to discuss the upstream integration with the person that has been working on wx3.0 there, especially as he has been fixing some code that I consider obsolete with wx3.0 and that I'd like to fix some things in a different way.

Cheers,
Martin

Description: Compile audacity against wxWidgets 3.0
 Solved compilation issues:
 (1.) Allow wxWidgets 3.0 in various configure scripts.
 (2.) The file dialog was derived from an internal wx class that
 disappeared in wx3.0 (discussed in further detail below).
 (3.) In several places the types in interfaces changed between
 wxChar* and wxString. I've tried to modify the code so it works with
 both interfaces (thanks to implicit conversion; may look a bit weird
 in some places).
 (4.) Calls to "wxTheApp->SuspendIdleCallback()" are no longer
 supported. They were part of a workaround for a clipboard problem,
 which fortunately doesn't seem to be there any longer in wx3.0, so I
 deactivated it for wx3.0.
 (5.) AddPendingEvent() and ProcessEvent() now have the visibility
 "protected" in wxWindow. It has always been a bad idea to call them
 directly on a wxWindow object, but now it's explicitly forbidden.
 Instead, those functions should be called on the object returned by
 GetEventHandler().
 (6.) The class wxStandardPaths is now a singleton and has to be
 treated as such (no more explicit constructor calls).
 (7.) "wxLogWarning" is a macro now, so the "::" prefix doesn't work
 on it anymore.
 (8.) Several int types (which were actually used as enums) are now
 real enum types (e.g. wxRasterOperationMode, wxMouseButton) and have
 to be used as such.
 (9.) Apart from the FD constants (which have been fixed in Olly's
 patch already) there are some other constants which have received a
 prefix (e.g. wx* -> wxFONTFAMILY_*, wx* -> wxFONTSTYLE_*, wx* ->
 wxFONTWEIGHT_*).
 (10.) Signature changes in constructors of wxFlexGridSizer and wxIcon
 and wxSizeEvent
 (11.) Missing includes (missing header files were probably included
 indirectly in wx2.8 by chance)
 (12.) When deriving from the abstract class wxGridTableBase,
 different methods have to be implemented with wx3.0 (EndEdit with new
 signature and ApplyEdit) than before with wx2.8 (only EndEdit with
 old signature). Now both versions are implemented in parallel in the
 classes TimeEditor and ChoiceEditor (one version essentially being a
 wrapper of the other one).
 Solved runtime issues:
 (1.) Segmentation fault: The LadspaEffectDialog receives EVT_TEXT
 events before it's properly initialized. To prevent this, a
 workaround was already in place, but was only active on Windows. It
 looks like this happens now on more platforms (including GTK). As the
 workaround doesn't do any harm, even if activated unnecessarily, I've
 simply activated it for all environments.
 (2.) GTK critical warning "IA__gtk_range_set_range: assertion
 'min < max' failed" because of negative numbers as result of window
 size checking. Added a sanity check that straightens up the numbers
 in edge cases.
 (3.) GTK critical warning "IA__gdk_window_get_origin: assertion
 'GDK_IS_WINDOW (window)' failed": Received events of type wxSizeEvent
 on the main project window cause calls to "ClientToScreen" - which is
 not available until the window is first shown. So the class has to
 keep track of wxShowEvent events and inhibit those actions until the
 window is first shown.
 (4.) The functions wxString::Format and wxString::Printf have become
 stricter about parameter types that don't match (format string vs.
 function parameters). A systematic check of all occurrences was done
 to make sure all of them are fixed.
 (5.) Fix a segmentation fault that was due to an incorrect
 implementation of wxStaticCast. Use the C++ static_case as a
 workaround.
 (6.) Fix a segmentation fault due to double initialization of the
 classes wxNumberFormatter and wxNumValidator. Those classes had
 been copied from wxWidgets to audacity, but are included in
 wxWidgets 3.0, too. Use the original classes, if we compile
 against wxWidgets 3.0.
Author: Martin Steghöfer <mar...@steghoefer.eu>
Bug-Debian: https://bugs.debian.org/749659

diff --git a/configure.ac b/configure.ac
index eb6b076..f1f910f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -184,13 +184,11 @@ AC_ARG_ENABLE(dynamic-loading,
             [dynamic_loading="$enableval"],
             [dynamic_loading="yes"])
 
-dnl AC_ARG_WITH(wx-version,
-dnl            [AS_HELP_STRING([--with-wx-version],
-dnl                            [select wxWidgets version (if both installed) [2.8,]])],
-dnl            wx_preference="--version=$withval",
-dnl            wx_preference="")
-dnl At the moment we only support wx2.8. If we start supporting 3.0 when it
-dnl comes out, we'll want it back again.
+AC_ARG_WITH(wx-version,
+           [AS_HELP_STRING([--with-wx-version],
+                           [select wxWidgets version (if both installed) [2.8, 3.0]])],
+           wx_preference="--version=$withval",
+           wx_preference="")
 
 dnl ----------------------------------------------------
 dnl If user asked for debug, put debug in compiler flags
@@ -289,19 +287,21 @@ dnl more things we always pass to wx-config
 wxconfigargs="$static_wx_preference $unicode_preference  $wxconfigargs $wx_preference"
 wx_version=`${WX_CONFIG} $wxconfigargs --version`
 
-AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x])
+AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x or 3.0.x])
 
 case "${wx_version}" in
   2.8.*)
     echo "Great, you're using wxWidgets ${wx_version}!"
     ;;
+  3.0.*)
+    echo "Great, you're using wxWidgets ${wx_version}!"
+    ;;
   *)
   wx_list=`${WX_CONFIG} --list`
-  AC_MSG_ERROR([Unable to locate a suitable configuration of wxWidgets v2.8.x or higher.
-The currently available configurations are listed below.  If necessary, either
-install the package for your distribution or download the latest version of
-wxWidgets
-from http://wxwidgets.org.
+  AC_MSG_ERROR([Unable to locate a suitable configuration of wxWidgets v2.8.x
+or v3.0.x. The currently available configurations are listed below. If
+necessary, either install the package for your distribution or download a
+suitable version of wxWidgets from http://wxwidgets.org.
 ${wx_list}])
 esac
 
diff --git a/lib-src/FileDialog/FileDialog.h b/lib-src/FileDialog/FileDialog.h
index 827edd6..fbf8a46 100644
--- a/lib-src/FileDialog/FileDialog.h
+++ b/lib-src/FileDialog/FileDialog.h
@@ -43,11 +43,11 @@ typedef void (*fdCallback)(void *, int);
 //----------------------------------------------------------------------------
 
 wxString 
-FileSelector(const wxChar *message = wxFileSelectorPromptStr,
+FileSelector(const wxChar *message = wxString(wxFileSelectorPromptStr, wxConvUTF8).wc_str(),
              const wxChar *default_path = NULL,
              const wxChar *default_filename = NULL,
              const wxChar *default_extension = NULL,
-             const wxChar *wildcard = wxFileSelectorDefaultWildcardStr,
+             const wxChar *wildcard = wxString(wxFileSelectorDefaultWildcardStr, wxConvUTF8).wc_str(),
              int flags = 0,
              wxWindow *parent = NULL,
              wxString label = wxEmptyString,
diff --git a/lib-src/FileDialog/Makefile.am b/lib-src/FileDialog/Makefile.am
index a07b4ea..9773462 100644
--- a/lib-src/FileDialog/Makefile.am
+++ b/lib-src/FileDialog/Makefile.am
@@ -32,3 +32,7 @@ endif
 if WINDOWS
 libFileDialog_la_SOURCES += win/FileDialogPrivate.cpp win/FileDialogPrivate.h
 endif
+
+if WX30
+libFileDialog_la_SOURCES += wx30/FileDialogPrivate.cpp wx30/FileDialogPrivate.h
+endif
diff --git a/lib-src/FileDialog/configure.ac b/lib-src/FileDialog/configure.ac
index f5a9365..cde612d 100644
--- a/lib-src/FileDialog/configure.ac
+++ b/lib-src/FileDialog/configure.ac
@@ -42,7 +42,7 @@ AC_ARG_ENABLE(debug,
             debug_preference="")
 
 AC_ARG_WITH(wx-version,
-            [AS_HELP_STRING([--with-wx-version],[override default wxWidgets version [2.6,2.8]])],
+            [AS_HELP_STRING([--with-wx-version],[override default wxWidgets version [2.8, 3.0]])],
             wx_preference="--version=$withval",
             wx_preference="")
 
@@ -67,27 +67,48 @@ AC_SUBST([WX_LIBS])
 
 PKG_CHECK_MODULES(GTK, gtk+-2.0, have_gtk="yes", have_gtk="no")
 
-dnl OS-specific configuration
+dnl Get wx version
+wx_version=`${WX_CONFIG} $wxconfigargs --version`
+
+dnl OS- and wx-version-specific configuration
 
 AC_CANONICAL_HOST
 
 IMPLEMENTATION="generic"
-case "${host_os}" in
-   darwin*)
-      dnl Mac OS X configuration
-      IMPLEMENTATION="mac"
+case "${wx_version}" in
+   2.8.*)
+      case "${host_os}" in
+         darwin*)
+            dnl Mac OS X configuration
+            IMPLEMENTATION="mac"
+         ;;
+
+         cygwin*)
+            dnl Windows/CygWin configuration
+            IMPLEMENTATION="win"
+         ;;
+
+         *)
+            if test "$have_gtk" = "yes"; then
+               AC_DEFINE(HAVE_GTK, 1, [Define to 1 if GTK+ is available.])
+               IMPLEMENTATION="gtk"
+            fi
+         ;;
+      esac
    ;;
-
-   cygwin*)
-      dnl Windows/CygWin configuration
-      IMPLEMENTATION="win"
+   
+   3.0.*)
+      dnl wx3.0 version for all platforms
+      IMPLEMENTATION="wx30"
    ;;
-
+   
    *)
-      if test "$have_gtk" = "yes"; then
-         AC_DEFINE(HAVE_GTK, 1, [Define to 1 if GTK+ is available.])
-         IMPLEMENTATION="gtk"
-      fi
+      wx_list=`${WX_CONFIG} --list`
+      AC_MSG_ERROR([Unable to locate a suitable configuration of wxWidgets v2.8.x
+      or v3.0.x. The currently available configurations are listed below. If
+      necessary, either install the package for your distribution or download a
+      suitable version of wxWidgets from http://wxwidgets.org.
+      ${wx_list}])
    ;;
 esac
 
@@ -96,6 +117,7 @@ AM_CONDITIONAL([GENERIC], test "$IMPLEMENTATION" = "generic")
 AM_CONDITIONAL([GTK], test "$IMPLEMENTATION" = "gtk")
 AM_CONDITIONAL([MAC], test "$IMPLEMENTATION" = "mac")
 AM_CONDITIONAL([WINDOWS], test "$IMPLEMENTATION" = "win")
+AM_CONDITIONAL([WX30], test "$IMPLEMENTATION" = "wx30")
 
 echo "Implementation to use: $IMPLEMENTATION"
 
diff --git a/lib-src/FileDialog/wx30/FileDialogPrivate.cpp b/lib-src/FileDialog/wx30/FileDialogPrivate.cpp
new file mode 100644
index 0000000..289b1bf
--- /dev/null
+++ b/lib-src/FileDialog/wx30/FileDialogPrivate.cpp
@@ -0,0 +1,61 @@
+#include <wx/wxprec.h>
+#ifndef WX_PRECOMP
+#  include <wx/wx.h>
+#endif
+
+#include "../FileDialog.h"
+
+#include <cassert>
+
+#include "wx/event.h"
+#include "wx/filedlg.h"
+#include "wx/window.h"
+
+
+FileDialog::FileDialog(wxWindow *parent,
+        const wxString& message,
+        const wxString& defaultDir,
+        const wxString& defaultFile,
+        const wxString& wildCard,
+        long style,
+        const wxPoint& pos,
+        const wxSize& sz,
+        const wxString& name)
+: wxFileDialog(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name)
+{
+}
+
+
+FileDialog::~FileDialog()
+{
+    // intentionally left blank; it's just there to make sure
+    // we have a virtual destructor (in case of subclassing)
+}
+
+
+int FileDialog::ShowModal()
+{
+    assert (SupportsExtraControl());
+    
+    if (!m_buttonlabel.IsEmpty()) {
+        SetExtraControlCreator(&FileDialog::CreateButton);
+    }
+    
+    return wxFileDialog::ShowModal();
+}
+
+
+wxWindow * FileDialog::CreateButton(wxWindow *fileDialogGeneric)
+{
+    FileDialog *fileDialog = (FileDialog *) fileDialogGeneric;
+    wxButton *button = new wxButton(fileDialog, wxID_ANY, fileDialog->m_buttonlabel);
+    fileDialog->Bind(wxEVT_BUTTON, &FileDialog::OnButton, fileDialog, button->GetId());
+    return button;
+}
+
+void FileDialog::OnButton(wxCommandEvent& WXUNUSED(event))
+{
+    ClickButton(GetFilterIndex());
+}
+
+
diff --git a/lib-src/FileDialog/wx30/FileDialogPrivate.h b/lib-src/FileDialog/wx30/FileDialogPrivate.h
new file mode 100644
index 0000000..1673db1
--- /dev/null
+++ b/lib-src/FileDialog/wx30/FileDialogPrivate.h
@@ -0,0 +1,47 @@
+#ifndef __FILEDIALOGWX30H__
+#define __FILEDIALOGWX30H__
+
+
+#include "wx/filedlg.h"
+
+
+class FileDialog : public wxFileDialog
+{
+public: // constructors/destructors
+    FileDialog() { }
+    
+    FileDialog(wxWindow *parent,
+               const wxString& message = wxFileSelectorPromptStr,
+               const wxString& defaultDir = wxEmptyString,
+               const wxString& defaultFile = wxEmptyString,
+               const wxString& wildCard = wxFileSelectorDefaultWildcardStr,
+               long style = wxFD_DEFAULT_STYLE,
+               const wxPoint& pos = wxDefaultPosition,
+               const wxSize& sz = wxDefaultSize,
+               const wxString& name = wxFileDialogNameStr);
+    
+    virtual ~FileDialog();
+    
+public: // public methods
+    virtual void EnableButton(wxString label, fdCallback cb, void *cbdata);
+    
+    virtual void ClickButton(int index);
+    
+    virtual int ShowModal();
+    
+    void OnButton(wxCommandEvent& event);
+    
+private: // private methods
+    static wxWindow * CreateButton(wxWindow *fileDialog);
+    
+private: // attributes
+    wxString m_buttonlabel;
+    
+    fdCallback m_callback;
+    
+    void *m_cbdata;
+};
+
+
+#endif
+
diff --git a/lib-src/lib-widget-extra/configure.ac b/lib-src/lib-widget-extra/configure.ac
index 649da27..0efd162 100644
--- a/lib-src/lib-widget-extra/configure.ac
+++ b/lib-src/lib-widget-extra/configure.ac
@@ -63,12 +63,11 @@ AC_ARG_ENABLE(debug,
             debug_preference="$enableval",
             debug_preference="no")
 
-dnl AC_ARG_WITH(wx-version,
-dnl             [AS_HELP_STRING([--with-wx-version],
-dnl                            [select wxWidgets version (if both installed) [2.8,]])],
-dnl            wx_preference="--version=$withval",
-dnl            wx_preference="")
-dnl Right now only support wx 2.8
+AC_ARG_WITH(wx-version,
+           [AS_HELP_STRING([--with-wx-version],
+                           [select wxWidgets version (if both installed) [2.8, 3.0]])],
+           wx_preference="--version=$withval",
+           wx_preference="")
 
 dnl ----------------------------------------------------
 dnl If user asked for debug, put debug in compiler flags
@@ -128,19 +127,21 @@ wxconfigargs="$static_wx_preference $unicode_preference $wxconfigargs $wx_prefer
 
 wx_version=`${WX_CONFIG} $wxconfigargs --version`
 
-AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x])
+AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x or 3.0.x])
 
 case "${wx_version}" in
   2.8.*)
     echo "Great, you're using wxWidgets ${wx_version}!"
     ;;
+  3.0.*)
+    echo "Great, you're using wxWidgets ${wx_version}!"
+    ;;
   *)
   wx_list=`${WX_CONFIG} --list`
-  AC_MSG_ERROR([Unable to locate a suitable configuration of wxWidgets v2.8.x or higher.
-The currently available configurations are listed below.  If necessary, either
-install the package for your distribution or download the latest version of
-wxWidgets
-from http://wxwidgets.org.
+  AC_MSG_ERROR([Unable to locate a suitable configuration of wxWidgets v2.8.x
+or v3.0.x. The currently available configurations are listed below. If
+necessary, either install the package for your distribution or download a
+suitable version of wxWidgets from http://wxwidgets.org.
 ${wx_list}])
 esac
 
diff --git a/src/AudacityApp.cpp b/src/AudacityApp.cpp
index e0277ca..328b132 100644
--- a/src/AudacityApp.cpp
+++ b/src/AudacityApp.cpp
@@ -924,7 +924,7 @@ bool AudacityApp::ShouldShowMissingAliasedFileWarning()
 
 AudacityLogger *AudacityApp::GetLogger()
 {
-   return wxStaticCast(wxLog::GetActiveTarget(), AudacityLogger);
+   return static_cast<AudacityLogger *>(wxLog::GetActiveTarget());
 }
 
 void AudacityApp::InitLang( const wxString & lang )
@@ -1295,7 +1295,7 @@ bool AudacityApp::OnInit()
          }
 
          if (option < argc - 1 &&
-             argv[option + 1] &&
+             !wxString(argv[option + 1]).IsEmpty() && // *argv is of type wxChar* in wx28 and wxString in wx30
              !wxString(wxT("-blocksize")).CmpNoCase(argv[option])) {
             long theBlockSize;
             if (wxString(argv[option + 1]).ToLong(&theBlockSize)) {
diff --git a/src/AudacityLogger.cpp b/src/AudacityLogger.cpp
index e6e043f..0b1e6bf 100644
--- a/src/AudacityLogger.cpp
+++ b/src/AudacityLogger.cpp
@@ -170,9 +170,9 @@ void AudacityLogger::Show(bool show)
    // loads either the XPM or the windows resource, depending on the platform
 #if !defined(__WXMAC__) && !defined(__WXX11__)
    #if defined(__WXMSW__)
-      wxIcon ic(wxICON(AudacityLogo));
+      wxIcon ic = wxICON(AudacityLogo);
    #elif defined(__WXGTK__)
-      wxIcon ic(wxICON(AudacityLogoAlpha));
+      wxIcon ic = wxICON(AudacityLogoAlpha);
    #else
       wxIcon ic;
       ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
diff --git a/src/Benchmark.cpp b/src/Benchmark.cpp
index af4d256..a91897f 100644
--- a/src/Benchmark.cpp
+++ b/src/Benchmark.cpp
@@ -394,8 +394,8 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
    t->GetEndTime();
 
    if (t->GetClipByIndex(0)->GetSequence()->GetNumSamples() != (sampleCount)nChunks * chunkSize) {
-      Printf(wxT("Expected len %d, track len %d.\n"), nChunks * chunkSize,
-             t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
+      Printf(wxT("Expected len %d, track len %lld.\n"), nChunks * chunkSize,
+             (long long) t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
       goto fail;
    }
 
@@ -415,8 +415,8 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
          Printf(wxT("Trial %d\n"), z);
          Printf(wxT("Cut (%d, %d) failed.\n"), (x0 * chunkSize),
                 (x0 + xlen) * chunkSize);
-         Printf(wxT("Expected len %d, track len %d.\n"), nChunks * chunkSize,
-                t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
+         Printf(wxT("Expected len %d, track len %lld.\n"), nChunks * chunkSize,
+                (long long) t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
          goto fail;
       }
 
@@ -432,8 +432,8 @@ void BenchmarkDialog::OnRun( wxCommandEvent & WXUNUSED(event))
 
       if (t->GetClipByIndex(0)->GetSequence()->GetNumSamples() != (sampleCount) nChunks * chunkSize) {
          Printf(wxT("Trial %d\n"), z);
-         Printf(wxT("Expected len %d, track len %d.\n"), nChunks * chunkSize,
-                t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
+         Printf(wxT("Expected len %d, track len %lld.\n"), nChunks * chunkSize,
+                (long long) t->GetClipByIndex(0)->GetSequence()->GetNumSamples());
          goto fail;
       }
       // Copy
diff --git a/src/CaptureEvents.cpp b/src/CaptureEvents.cpp
index 7875578..b95295a 100644
--- a/src/CaptureEvents.cpp
+++ b/src/CaptureEvents.cpp
@@ -17,7 +17,7 @@
 #include "Audacity.h"
 #include "CaptureEvents.h"
 
-#if defined(__WXGTK__) && defined(HAVE_GTK)
+#if defined(__WXGTK__) && defined(HAVE_GTK) && wxMAJOR_VERSION < 3
 // As of wxGTK 2.8.9, there is a problem in the wxClipboard class that
 // allows recursive event processing.  This problem has been corrected
 // by wxWidgets 2.9+.  However, this han't made it into a release yet,
diff --git a/src/CaptureEvents.h b/src/CaptureEvents.h
index 96fa36c..44e4886 100644
--- a/src/CaptureEvents.h
+++ b/src/CaptureEvents.h
@@ -17,7 +17,7 @@
 #ifndef _AUDACITY_CAPTURE_EVENTS_
 #define _AUDACITY_CAPTURE_EVENTS_
 
-#if defined(__WXGTK__) && defined(HAVE_GTK)
+#if defined(__WXGTK__) && defined(HAVE_GTK) && wxMAJOR_VERSION < 3
 // As of wxGTK 2.8.9, there is a problem in the wxClipboard class that
 // allows recursive event processing.  This problem has been corrected
 // by wxWidgets 2.9+.  However, this han't made it into a release yet,
diff --git a/src/DirManager.cpp b/src/DirManager.cpp
index 097bfaa..759e849 100644
--- a/src/DirManager.cpp
+++ b/src/DirManager.cpp
@@ -1417,7 +1417,7 @@ int DirManager::ProjectFSCK(const bool bForceError, const bool bAutoRecoverMode)
       {
          wxString msgA =
 _("Project check of \"%s\" folder \
-\ndetected %d missing external audio file(s) \
+\ndetected %lld missing external audio file(s) \
 \n('aliased files'). There is no way for Audacity \
 \nto recover these files automatically. \
 \n\nIf you choose the first or second option below, \
@@ -1429,7 +1429,7 @@ _("Project check of \"%s\" folder \
 \nproject in its current state, unless you \"Close \
 \nproject immediately\" on further error alerts.");
          wxString msg;
-         msg.Printf(msgA, this->projName.c_str(), missingAliasedFilePathHash.size());
+         msg.Printf(msgA, this->projName.c_str(), (long long) missingAliasedFilePathHash.size());
          const wxChar *buttons[] =
             {_("Close project immediately with no changes"),
                _("Treat missing audio as silence (this session only)"),
@@ -1487,11 +1487,11 @@ _("Project check of \"%s\" folder \
       {
          wxString msgA =
 _("Project check of \"%s\" folder \
-\ndetected %d missing alias (.auf) blockfile(s). \
+\ndetected %lld missing alias (.auf) blockfile(s). \
 \nAudacity can fully regenerate these files \
 \nfrom the current audio in the project.");
          wxString msg;
-         msg.Printf(msgA, this->projName.c_str(), missingAUFHash.size());
+         msg.Printf(msgA, this->projName.c_str(), (long long) missingAUFHash.size());
          const wxChar *buttons[] = {_("Regenerate alias summary files (safe and recommended)"),
                                     _("Fill in silence for missing display data (this session only)"),
                                     _("Close project immediately with no further changes"),
@@ -1538,7 +1538,7 @@ _("Project check of \"%s\" folder \
       {
          wxString msgA =
 _("Project check of \"%s\" folder \
-\ndetected %d missing audio data (.au) blockfile(s), \
+\ndetected %lld missing audio data (.au) blockfile(s), \
 \nprobably due to a bug, system crash, or accidental \
 \ndeletion. There is no way for Audacity to recover \
 \nthese missing files automatically. \
@@ -1548,7 +1548,7 @@ _("Project check of \"%s\" folder \
 \n\nNote that for the second option, the waveform \
 \nmay not show silence.");
          wxString msg;
-         msg.Printf(msgA, this->projName.c_str(), missingAUHash.size());
+         msg.Printf(msgA, this->projName.c_str(), (long long) missingAUHash.size());
          const wxChar *buttons[] =
             {_("Close project immediately with no further changes"),
                _("Treat missing audio as silence (this session only)"),
diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp
index f5eb186..b90c32f 100644
--- a/src/LabelTrack.cpp
+++ b/src/LabelTrack.cpp
@@ -957,7 +957,7 @@ bool LabelTrack::CutSelectedText()
 
    // copy data onto clipboard
    if (wxTheClipboard->Open()) {
-#if defined(__WXGTK__) && defined(HAVE_GTK)
+#if defined(__WXGTK__) && defined(HAVE_GTK) && wxMAJOR_VERSION < 3
       CaptureEvents capture;
 #endif
       wxTheClipboard->SetData(new wxTextDataObject(data));
@@ -992,7 +992,7 @@ bool LabelTrack::CopySelectedText()
 
    // copy the data on clipboard
    if (wxTheClipboard->Open()) {
-#if defined(__WXGTK__) && defined(HAVE_GTK)
+#if defined(__WXGTK__) && defined(HAVE_GTK) && wxMAJOR_VERSION < 3
       CaptureEvents capture;
 #endif
       wxTheClipboard->SetData(new wxTextDataObject(data));
@@ -1017,7 +1017,7 @@ bool LabelTrack::PasteSelectedText(double sel0, double sel1)
    // if text data is available
    if (IsTextClipSupported()) {
       if (wxTheClipboard->Open()) {
-#if defined(__WXGTK__) && HAVE_GTK
+#if defined(__WXGTK__) && HAVE_GTK && wxMAJOR_VERSION < 3
          CaptureEvents capture;
 #endif
          wxTextDataObject data;
@@ -1074,7 +1074,7 @@ bool LabelTrack::PasteSelectedText(double sel0, double sel1)
 /// @return true if the text data is available in the clipboard, false otherwise
 bool LabelTrack::IsTextClipSupported()
 {
-#if defined(__WXGTK__) && defined(HAVE_GTK)
+#if defined(__WXGTK__) && defined(HAVE_GTK) && wxMAJOR_VERSION < 3
    CaptureEvents capture;
 #endif
 
diff --git a/src/LyricsWindow.cpp b/src/LyricsWindow.cpp
index e794e5b..3c9d1d6 100644
--- a/src/LyricsWindow.cpp
+++ b/src/LyricsWindow.cpp
@@ -68,9 +68,9 @@ LyricsWindow::LyricsWindow(AudacityProject *parent):
    // loads either the XPM or the windows resource, depending on the platform
    #if !defined(__WXMAC__) && !defined(__WXX11__)
       #ifdef __WXMSW__
-         wxIcon ic(wxICON(AudacityLogo));
+         wxIcon ic = wxICON(AudacityLogo);
       #else
-         wxIcon ic(wxICON(AudacityLogo48x48));
+         wxIcon ic = wxICON(AudacityLogo48x48);
       #endif
       SetIcon(ic);
    #endif
diff --git a/src/Menus.cpp b/src/Menus.cpp
index 9b9505f..c2bf5f7 100644
--- a/src/Menus.cpp
+++ b/src/Menus.cpp
@@ -2422,7 +2422,7 @@ void AudacityProject::OnTrackMenu()
    //       The workaround is to queue a context menu event, allowing the key press
    //       event to complete.
    wxContextMenuEvent e(wxEVT_CONTEXT_MENU, GetId());
-   mTrackPanel->AddPendingEvent(e);
+   mTrackPanel->GetEventHandler()->AddPendingEvent(e);
 }
 
 void AudacityProject::OnTrackMute()
@@ -5871,7 +5871,7 @@ void AudacityProject::OnResample()
       wxArrayString rates;
       wxComboBox *cb;
 
-      rate.Printf(wxT("%d"), lrint(mRate));
+      rate.Printf(wxT("%ld"), lrint(mRate));
 
       rates.Add(wxT("8000"));
       rates.Add(wxT("11025"));
diff --git a/src/MixerBoard.cpp b/src/MixerBoard.cpp
index d628352..07b0d25 100644
--- a/src/MixerBoard.cpp
+++ b/src/MixerBoard.cpp
@@ -1723,9 +1723,9 @@ MixerBoardFrame::MixerBoardFrame(AudacityProject* parent)
    // loads either the XPM or the windows resource, depending on the platform
    #if !defined(__WXMAC__) && !defined(__WXX11__)
       #ifdef __WXMSW__
-         wxIcon ic(wxICON(AudacityLogo));
+         wxIcon ic = wxICON(AudacityLogo);
       #else
-         wxIcon ic(wxICON(AudacityLogo48x48));
+         wxIcon ic = wxICON(AudacityLogo48x48);
       #endif
       SetIcon(ic);
    #endif
diff --git a/src/PitchName.cpp b/src/PitchName.cpp
index 29c42f3..699339d 100644
--- a/src/PitchName.cpp
+++ b/src/PitchName.cpp
@@ -20,6 +20,10 @@
 #include <math.h>
 #include <stdio.h>
 
+#ifndef WX_PRECOMP
+#  include "wx/wx.h"
+#endif
+
 #include "PitchName.h"
 
 
diff --git a/src/PlatformCompatibility.cpp b/src/PlatformCompatibility.cpp
index 3d5377c..4a447e0 100644
--- a/src/PlatformCompatibility.cpp
+++ b/src/PlatformCompatibility.cpp
@@ -20,6 +20,7 @@
 #include <wx/filename.h>
 #include <wx/stdpaths.h>
 #include <wx/app.h>
+#include <wx/version.h>
 
 #include "AudacityApp.h"
 #include "PlatformCompatibility.h"
@@ -37,7 +38,11 @@ wxString PlatformCompatibility::GetExecutablePath()
    static wxString path;
 
    if (!found) {
+#if wxMAJOR_VERSION < 3
       wxStandardPaths std;
+#else
+      wxStandardPaths std(wxStandardPaths::Get());
+#endif
 
       path = std.GetExecutablePath();
 
@@ -65,4 +70,4 @@ wxString PlatformCompatibility::ConvertSlashInFileName(const wxString& filePath)
 #else
    return filePath;
 #endif
-}
\ No newline at end of file
+}
diff --git a/src/Profiler.cpp b/src/Profiler.cpp
index c90ffe8..e371bdc 100644
--- a/src/Profiler.cpp
+++ b/src/Profiler.cpp
@@ -22,6 +22,9 @@ but it will probably work fine if you use it on a high level.
 
 #include "Profiler.h"
 
+#include <cstdio>
+#include <cstring>
+
 ///write to a profile at the end of the test.
 Profiler::~Profiler()
 {
diff --git a/src/Project.cpp b/src/Project.cpp
index eab0226..41fddd9 100644
--- a/src/Project.cpp
+++ b/src/Project.cpp
@@ -79,7 +79,6 @@ scroll information.  It also has some status flags.
 #include <wx/string.h>
 #include <wx/textfile.h>
 #include <wx/timer.h>
-#include <wx/generic/filedlgg.h>
 #include <wx/display.h>
 
 #include <wx/arrimpl.cpp>       // this allows for creation of wxObjArray
@@ -704,6 +703,7 @@ BEGIN_EVENT_TABLE(AudacityProject, wxFrame)
    EVT_MOUSE_EVENTS(AudacityProject::OnMouseEvent)
    EVT_CLOSE(AudacityProject::OnCloseWindow)
    EVT_SIZE(AudacityProject::OnSize)
+   EVT_SHOW(AudacityProject::OnShow)
    EVT_MOVE(AudacityProject::OnMove)
    EVT_ACTIVATE(AudacityProject::OnActivate)
    EVT_COMMAND_SCROLL_LINEUP(HSBarID, AudacityProject::OnScrollLeftButton)
@@ -763,7 +763,8 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
      mLastEffect(NULL),
      mLastEffectType(0),
      mTimerRecordCanceled(false),
-     mMenuClose(false)
+     mMenuClose(false),
+     mShownOnce(false)
 {
    int widths[] = {-2, -1};
    mStatusBar = CreateStatusBar(2);
@@ -985,9 +986,9 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
    // loads either the XPM or the windows resource, depending on the platform
 #if !defined(__WXMAC__) && !defined(__WXX11__)
    #if defined(__WXMSW__)
-      wxIcon ic(wxICON(AudacityLogo));
+      wxIcon ic = wxICON(AudacityLogo);
    #elif defined(__WXGTK__)
-      wxIcon ic(wxICON(AudacityLogoAlpha));
+      wxIcon ic = wxICON(AudacityLogoAlpha);
    #else
       wxIcon ic;
       ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48));
@@ -1392,6 +1393,12 @@ void AudacityProject::FixScrollbars()
 
    int panelWidth, panelHeight;
    mTrackPanel->GetTracksUsableArea(&panelWidth, &panelHeight);
+   if (panelWidth < 0) {
+      panelWidth = 0;
+   }
+   if (panelHeight < 0) {
+      panelHeight = 0;
+   }
 
    // Add 1/4 of a screen of blank space to the end of the longest track
    mViewInfo.screen = ((double) panelWidth) / mViewInfo.zoom;
@@ -1603,9 +1610,26 @@ void AudacityProject::OnMove(wxMoveEvent & event)
 
 void AudacityProject::OnSize(wxSizeEvent & event)
 {
-   HandleResize();
-   if (!this->IsMaximized() && !this->IsIconized())
-      SetNormalizedWindowState(this->GetRect());
+   if (mShownOnce) {
+      HandleResize();
+      if (!this->IsMaximized() && !this->IsIconized())
+         SetNormalizedWindowState(this->GetRect());
+   }
+   event.Skip();
+}
+
+void AudacityProject::OnShow(wxShowEvent & event)
+{
+   // Remember that the window has been shown at least once
+   mShownOnce = true;
+   
+   // Call "OnSize" again (the previous calls to "OnSize" might not
+   // have succeeded because some methods are not available before
+   // the actual creation/showing of the window)
+   wxSizeEvent sizeEvent(GetSize());
+   OnSize(sizeEvent);
+   
+   // Further processing by default handlers
    event.Skip();
 }
 
@@ -1717,7 +1741,7 @@ bool AudacityProject::HandleKeyDown(wxKeyEvent & event)
       wxCommandEvent e(EVT_CAPTURE_KEY);
       e.SetEventObject(&event);
 
-      if (w->ProcessEvent(e)) {
+      if (w->GetEventHandler()->ProcessEvent(e)) {
          return false;
       }
    }
diff --git a/src/Project.h b/src/Project.h
index c859c97..dcc3ccb 100644
--- a/src/Project.h
+++ b/src/Project.h
@@ -254,6 +254,7 @@ class AUDACITY_DLL_API AudacityProject:  public wxFrame,
    void OnMouseEvent(wxMouseEvent & event);
    void OnIconize(wxIconizeEvent &event);
    void OnSize(wxSizeEvent & event);
+   void OnShow(wxShowEvent & event);
    void OnMove(wxMoveEvent & event);
    void OnScroll(wxScrollEvent & event);
    void OnCloseWindow(wxCloseEvent & event);
@@ -499,6 +500,8 @@ class AUDACITY_DLL_API AudacityProject:  public wxFrame,
    // dialog for missing alias warnings
    wxDialog            *mAliasMissingWarningDialog;
 
+   bool mShownOnce;
+
  public:
    ToolManager *mToolManager;
    bool mShowSplashScreen;
diff --git a/src/Sequence.cpp b/src/Sequence.cpp
index 02883db..7ec00d7 100644
--- a/src/Sequence.cpp
+++ b/src/Sequence.cpp
@@ -1048,7 +1048,7 @@ void Sequence::WriteXML(XMLWriter &xmlFile)
                Internat::ToString(((wxLongLong)(bb->f->GetLength())).ToDouble(), 0).c_str(),
                Internat::ToString(((wxLongLong)mMaxSamples).ToDouble(), 0).c_str());
          ::wxMessageBox(sMsg, _("Warning - Length in Writing Sequence"), wxICON_EXCLAMATION | wxOK);
-         ::wxLogWarning(sMsg);
+         wxLogWarning(sMsg);
          bb->f->SetLength(mMaxSamples);
       }
 
@@ -1843,10 +1843,10 @@ void Sequence::DebugPrintf(wxString *dest)
    for (i = 0; i < mBlock->GetCount(); i++) {
       SeqBlock* pSeqBlock = mBlock->Item(i);
       *dest += wxString::Format
-         (wxT("   Block %3d: start %8d, len %8d, refs %d, "),
+         (wxT("   Block %3u: start %8lld, len %8lld, refs %d, "),
           i,
-          pSeqBlock->start,
-          pSeqBlock->f ? pSeqBlock->f->GetLength() : 0,
+          (long long) pSeqBlock->start,
+          pSeqBlock->f ? (long long) pSeqBlock->f->GetLength() : 0,
           pSeqBlock->f ? mDirManager->GetRefCount(pSeqBlock->f) : 0);
 
       if (pSeqBlock->f)
@@ -1864,7 +1864,7 @@ void Sequence::DebugPrintf(wxString *dest)
    }
    if (pos != mNumSamples)
       *dest += wxString::Format
-         (wxT("ERROR mNumSamples = %d\n"), mNumSamples);
+         (wxT("ERROR mNumSamples = %lld\n"), (long long) mNumSamples);
 }
 
 // static
diff --git a/src/Shuttle.cpp b/src/Shuttle.cpp
index 993a5dd..b704338 100644
--- a/src/Shuttle.cpp
+++ b/src/Shuttle.cpp
@@ -189,7 +189,7 @@ bool Shuttle::TransferLongLong( const wxString & Name, wxLongLong_t & iValue, co
    else
    {
       /// \todo Fix for long long values.
-      mValueString = wxString::Format(wxT("%d"),iValue);
+      mValueString = wxString::Format(wxT("%lld"), (long long) iValue);
       return ExchangeWithMaster( Name );
    }
    return true;
diff --git a/src/Tags.cpp b/src/Tags.cpp
index cf61d6f..1cfc35e 100644
--- a/src/Tags.cpp
+++ b/src/Tags.cpp
@@ -474,7 +474,7 @@ bool Tags::HandleXMLTag(const wxChar *tag, const wxChar **attrs)
 
       while (*attrs) {
          wxString attr = *attrs++;
-         if (!*attr)
+         if (attr.IsEmpty())
             break;
          wxString value = *attrs++;
 
diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp
index d7cb246..eea4884 100644
--- a/src/TrackPanel.cpp
+++ b/src/TrackPanel.cpp
@@ -5124,7 +5124,7 @@ void TrackPanel::OnMouseEvent(wxMouseEvent & event)
       // The activate event is used to make the
       // parent window 'come alive' if it didn't have focus.
       wxActivateEvent e;
-      GetParent()->ProcessEvent(e);
+      GetParent()->GetEventHandler()->ProcessEvent(e);
 
       // wxTimers seem to be a little unreliable, so this
       // "primes" it to make sure it keeps going for a while...
@@ -5562,7 +5562,7 @@ int TrackPanel::DetermineToolToUse( ToolsToolBar * pTtb, wxMouseEvent & event)
    int trackKind = pTrack->GetKind();
    currentTool = selectTool; // the default.
 
-   if( event.ButtonIsDown(3) || event.RightUp()){
+   if( event.ButtonIsDown(wxMOUSE_BTN_RIGHT) || event.RightUp()){
       currentTool = zoomTool;
    } else if( trackKind == Track::Time ){
       currentTool = envelopeTool;
@@ -7583,7 +7583,7 @@ void TrackPanel::SetRate(Track * pTrack, double rate)
    Track *partner = mTracks->GetLink(pTrack);
    if (partner)
       ((WaveTrack *) partner)->SetRate(rate);
-   MakeParentPushState(wxString::Format(_("Changed '%s' to %d Hz"),
+   MakeParentPushState(wxString::Format(_("Changed '%s' to %f Hz"),
                                         pTrack->GetName().c_str(), rate),
                        _("Rate Change"));
 }
@@ -7723,7 +7723,7 @@ void TrackPanel::OnRateOther(wxCommandEvent &event)
       wxArrayString rates;
       wxComboBox *cb;
 
-      rate.Printf(wxT("%d"), lrint(((WaveTrack *) mPopupMenuTarget)->GetRate()));
+      rate.Printf(wxT("%ld"), lrint(((WaveTrack *) mPopupMenuTarget)->GetRate()));
 
       rates.Add(wxT("8000"));
       rates.Add(wxT("11025"));
@@ -7810,7 +7810,7 @@ void TrackPanel::OnSetTimeTrackRange(wxCommandEvent & /*event*/)
       if( lower >= 10 && upper <= 1000 && lower < upper ) {
          t->SetRangeLower((double)lower / 100.0);
          t->SetRangeUpper((double)upper / 100.0);
-         MakeParentPushState(wxString::Format(_("Set range to '%d' - '%d'"),
+         MakeParentPushState(wxString::Format(_("Set range to '%ld' - '%ld'"),
                                               lower,
                                               upper),
       /* i18n-hint: (verb)*/
@@ -8065,7 +8065,7 @@ void TrackPanel::OnSetFont(wxCommandEvent & WXUNUSED(event))
          /* i18n-hint: (noun) The size of the typeface*/
          S.AddPrompt(_("Face size"));
          sc = new wxSpinCtrl(&dlg, wxID_ANY,
-                             wxString::Format(wxT("%d"), fontsize),
+                             wxString::Format(wxT("%ld"), fontsize),
                              wxDefaultPosition,
                              wxDefaultSize,
                              wxSP_ARROW_KEYS,
@@ -8382,7 +8382,7 @@ TrackInfo::TrackInfo(wxWindow * pParentIn)
    mSliderOffset = 0;
 
    int fontSize = 10;
-   mFont.Create(fontSize, wxSWISS, wxNORMAL, wxNORMAL);
+   mFont.Create(fontSize, wxFONTFAMILY_SWISS, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
 
    int allowableWidth = GetTrackInfoWidth() - 2; // 2 to allow for left/right borders
    int textWidth, textHeight;
diff --git a/src/blockfile/SimpleBlockFile.cpp b/src/blockfile/SimpleBlockFile.cpp
index c256588..6c23af7 100644
--- a/src/blockfile/SimpleBlockFile.cpp
+++ b/src/blockfile/SimpleBlockFile.cpp
@@ -207,7 +207,7 @@ bool SimpleBlockFile::WriteSimpleBlockFile(
    size_t nBytesWritten = file.Write(&header, nBytesToWrite);
    if (nBytesWritten != nBytesToWrite)
    {
-      wxLogDebug(wxT("Wrote %d bytes, expected %d."), nBytesWritten, nBytesToWrite);
+      wxLogDebug(wxT("Wrote %lld bytes, expected %lld."), (long long) nBytesWritten, (long long) nBytesToWrite);
       return false;
    }
 
@@ -215,7 +215,7 @@ bool SimpleBlockFile::WriteSimpleBlockFile(
    nBytesWritten = file.Write(summaryData, nBytesToWrite);
    if (nBytesWritten != nBytesToWrite)
    {
-      wxLogDebug(wxT("Wrote %d bytes, expected %d."), nBytesWritten, nBytesToWrite);
+      wxLogDebug(wxT("Wrote %lld bytes, expected %lld."), (long long) nBytesWritten, (long long) nBytesToWrite);
       return false;
    }
 
@@ -237,7 +237,7 @@ bool SimpleBlockFile::WriteSimpleBlockFile(
             #endif
          if (nBytesWritten != nBytesToWrite)
          {
-            wxLogDebug(wxT("Wrote %d bytes, expected %d."), nBytesWritten, nBytesToWrite);
+            wxLogDebug(wxT("Wrote %lld bytes, expected %lld."), (long long) nBytesWritten, (long long) nBytesToWrite);
             return false;
          }
       }
@@ -250,7 +250,7 @@ bool SimpleBlockFile::WriteSimpleBlockFile(
       nBytesWritten = file.Write(sampleData, nBytesToWrite);
       if (nBytesWritten != nBytesToWrite)
       {
-         wxLogDebug(wxT("Wrote %d bytes, expected %d."), nBytesWritten, nBytesToWrite);
+         wxLogDebug(wxT("Wrote %lld bytes, expected %lld."), (long long) nBytesWritten, (long long) nBytesToWrite);
          return false;
       }
    }
diff --git a/src/commands/CompareAudioCommand.cpp b/src/commands/CompareAudioCommand.cpp
index afb209f..f8ed52f 100644
--- a/src/commands/CompareAudioCommand.cpp
+++ b/src/commands/CompareAudioCommand.cpp
@@ -135,8 +135,8 @@ bool CompareAudioCommand::Apply(CommandExecutionContext context)
 
    // Output the results
    double errorSeconds = mTrack0->LongSamplesToTime(errorCount);
-   Status(wxString::Format(wxT("%i"), errorCount));
+   Status(wxString::Format(wxT("%li"), errorCount));
    Status(wxString::Format(wxT("%.4f"), errorSeconds));
-   Status(wxString::Format(wxT("Finished comparison: %i samples (%.3f seconds) exceeded the error threshold of %f."), errorCount, errorSeconds, errorThreshold));
+   Status(wxString::Format(wxT("Finished comparison: %li samples (%.3f seconds) exceeded the error threshold of %f."), errorCount, errorSeconds, errorThreshold));
    return true;
 }
diff --git a/src/commands/ScriptCommandRelay.cpp b/src/commands/ScriptCommandRelay.cpp
index c4dc2bd..01b4152 100644
--- a/src/commands/ScriptCommandRelay.cpp
+++ b/src/commands/ScriptCommandRelay.cpp
@@ -57,7 +57,7 @@ void ScriptCommandRelay::PostCommand(AudacityProject *project, Command *cmd)
    wxASSERT(cmd != NULL);
    AppCommandEvent ev;
    ev.SetCommand(cmd);
-   project->AddPendingEvent(ev);
+   project->GetEventHandler()->AddPendingEvent(ev);
 }
 
 /// This is the function which actually obeys one command.  Rather than applying
diff --git a/src/commands/Validators.h b/src/commands/Validators.h
index d2bd768..0201d30 100644
--- a/src/commands/Validators.h
+++ b/src/commands/Validators.h
@@ -201,7 +201,7 @@ public:
    }
    virtual wxString GetDescription() const
    {
-      return wxString::Format(wxT("between %d and %d"), mLower, mUpper);
+      return wxString::Format(wxT("between %f and %f"), mLower, mUpper);
    }
    virtual Validator *GetClone() const
    {
diff --git a/src/effects/BassTreble.cpp b/src/effects/BassTreble.cpp
index 53af991..315b701 100644
--- a/src/effects/BassTreble.cpp
+++ b/src/effects/BassTreble.cpp
@@ -35,6 +35,7 @@
 #include <wx/checkbox.h>
 #include <wx/slider.h>
 #include <wx/sizer.h>
+#include <wx/textctrl.h>
 
 // Used to communicate the type of the filter.
 static const int bassType = 0; //Low Shelf
diff --git a/src/effects/Compressor.cpp b/src/effects/Compressor.cpp
index 560fe50..c52c67c 100644
--- a/src/effects/Compressor.cpp
+++ b/src/effects/Compressor.cpp
@@ -38,6 +38,7 @@
 #include <wx/textdlg.h>
 #include <wx/brush.h>
 #include <wx/image.h>
+#include <wx/dcclient.h>
 #include <wx/dcmemory.h>
 
 #include "Compressor.h"
diff --git a/src/effects/FindClipping.cpp b/src/effects/FindClipping.cpp
index 8bad09c..18fa53e 100644
--- a/src/effects/FindClipping.cpp
+++ b/src/effects/FindClipping.cpp
@@ -183,7 +183,7 @@ bool EffectFindClipping::ProcessOne(LabelTrack * l,
             if (stoprun >= mStop) {
                l->AddLabel(startTime,
                            t->LongSamplesToTime(start + s - mStop),
-                           wxString::Format(wxT("%lld of %lld"), startrun, samps - mStop));
+                           wxString::Format(wxT("%lld of %lld"), (long long) startrun, (long long) (samps - mStop)));
                startrun = 0;
                stoprun = 0;
                samps = 0;
diff --git a/src/effects/ladspa/LadspaEffect.cpp b/src/effects/ladspa/LadspaEffect.cpp
index 1507133..c96b9dc 100644
--- a/src/effects/ladspa/LadspaEffect.cpp
+++ b/src/effects/ladspa/LadspaEffect.cpp
@@ -518,16 +518,14 @@ LadspaEffectDialog::LadspaEffectDialog(LadspaEffect *eff,
    this->mData = data;
    this->inputControls = inputControls;
    this->sampleRate = sampleRate;
-   #ifdef __WXMSW__
-      // On Windows, for some reason, wxWidgets calls OnTextCtrl during creation
-      // of the text control, and LadspaEffectDialog::OnTextCtrl calls HandleText,
-      // which assumes all the fields have been initialized.
-      // This can give us a bad pointer crash, so manipulate inSlider to
-      // no-op HandleText during creation.
-      inSlider = true;
-   #else
-      inSlider = false;
-   #endif
+
+   // wxWidgets calls OnTextCtrl during creation
+   // of the text control, and LadspaEffectDialog::OnTextCtrl calls HandleText,
+   // which assumes all the fields have been initialized.
+   // This can give us a bad pointer crash, so manipulate inSlider to
+   // no-op HandleText during creation.
+   inSlider = true;
+   
    inText = false;
 
    toggles = new wxCheckBox*[mData->PortCount];
diff --git a/src/effects/ladspa/LoadLadspa.cpp b/src/effects/ladspa/LoadLadspa.cpp
index 5758b1f..affcdb2 100644
--- a/src/effects/ladspa/LoadLadspa.cpp
+++ b/src/effects/ladspa/LoadLadspa.cpp
@@ -147,7 +147,7 @@ static void LoadLadspaEffect(wxSortedArrayString &uniq, wxString fname,
       data = mainFn(index);
       while(data) {
 
-         wxString uniqid = wxString::Format(wxT("%08x-%s"), data->UniqueID, LAT1CTOWX(data->Label).c_str());
+         wxString uniqid = wxString::Format(wxT("%08x-%s"), (unsigned int) data->UniqueID, LAT1CTOWX(data->Label).c_str());
          if (uniq.Index(uniqid) == wxNOT_FOUND) {
             uniq.Add(uniqid);
             std::set<wxString> categories;
diff --git a/src/effects/nyquist/Nyquist.cpp b/src/effects/nyquist/Nyquist.cpp
index 902c12a..88e9975 100644
--- a/src/effects/nyquist/Nyquist.cpp
+++ b/src/effects/nyquist/Nyquist.cpp
@@ -703,7 +703,7 @@ bool EffectNyquist::Process()
          // See also http://bugzilla.audacityteam.org/show_bug.cgi?id=642#c9
          // for further info about this thread safety question.
          wxString prevlocale = wxSetlocale(LC_NUMERIC, NULL);
-         wxSetlocale(LC_NUMERIC, wxT("C"));
+         wxSetlocale(LC_NUMERIC, wxString(wxT("C")));
 
          nyx_init();
          nyx_set_os_callback(StaticOSCallback, (void *)this);
@@ -1242,13 +1242,7 @@ NyquistDialog::NyquistDialog(wxWindow * parent, wxWindowID id,
             wxFloatingPointValidator<double> vld(12, &ctrl->val);
             vld.SetRange(-FLT_MAX, FLT_MAX);
             // Set number of decimal places
-            if (ctrl->high - ctrl->low < 10) {
-               vld.SetStyle(wxNUM_VAL_THREE_TRAILING_ZEROES);
-            } else if (ctrl->high - ctrl->low < 100) {
-               vld.SetStyle(wxNUM_VAL_TWO_TRAILING_ZEROES);
-            } else {
-               vld.SetStyle(wxNUM_VAL_ONE_TRAILING_ZERO);
-            }
+            vld.SetStyle(wxNUM_VAL_NO_TRAILING_ZEROES);
             item->SetValidator(vld);
          }
          else {
diff --git a/src/export/ExportFFmpeg.cpp b/src/export/ExportFFmpeg.cpp
index 28c5cc9..2077d6e 100644
--- a/src/export/ExportFFmpeg.cpp
+++ b/src/export/ExportFFmpeg.cpp
@@ -452,7 +452,7 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project)
    if (codec == NULL)
    {
       wxLogError(wxT("FFmpeg : ERROR - Can't find audio codec 0x%x."),mEncAudioCodecCtx->codec_id);
-      wxMessageBox(wxString::Format(_("FFmpeg cannot find audio codec 0x%x.\nSupport for this codec is probably not compiled in."),mEncAudioCodecCtx->codec_id));
+      wxMessageBox(wxString::Format(_("FFmpeg cannot find audio codec 0x%x.\nSupport for this codec is probably not compiled in."), (unsigned int) mEncAudioCodecCtx->codec_id));
       return false;
    }
 
diff --git a/src/export/ExportFFmpegDialogs.cpp b/src/export/ExportFFmpegDialogs.cpp
index 260a0ab..d0a421e 100644
--- a/src/export/ExportFFmpegDialogs.cpp
+++ b/src/export/ExportFFmpegDialogs.cpp
@@ -1846,7 +1846,7 @@ void ExportFFmpegOptions::DoOnCodecList()
       mCodecName->SetLabel(wxString(_("Failed to find the codec")));
       return;
    }
-   mCodecName->SetLabel(wxString::Format(wxT("[%d] %s"),cdc->id,selcdclong->c_str()));
+   mCodecName->SetLabel(wxString::Format(wxT("[%d] %s"), (int) cdc->id,selcdclong->c_str()));
 
    if (selfmt != NULL)
    {
diff --git a/src/export/ExportMP2.cpp b/src/export/ExportMP2.cpp
index 0baa5d3..92d25fe 100644
--- a/src/export/ExportMP2.cpp
+++ b/src/export/ExportMP2.cpp
@@ -276,8 +276,8 @@ int ExportMP2::Export(AudacityProject *project,
 
    ProgressDialog *progress = new ProgressDialog(wxFileName(fName).GetName(),
       selectionOnly ?
-      wxString::Format(_("Exporting selected audio at %d kbps"), bitrate) :
-      wxString::Format(_("Exporting entire file at %d kbps"), bitrate));
+      wxString::Format(_("Exporting selected audio at %ld kbps"), bitrate) :
+      wxString::Format(_("Exporting entire file at %ld kbps"), bitrate));
 
    int updateResult = eProgressSuccess;
    while(updateResult == eProgressSuccess) {
diff --git a/src/export/ExportMP3.cpp b/src/export/ExportMP3.cpp
index 3c998bf..6d7d9fb 100644
--- a/src/export/ExportMP3.cpp
+++ b/src/export/ExportMP3.cpp
@@ -1799,7 +1799,7 @@ int ExportMP3::Export(AudacityProject *project,
 
       if (bytes < 0) {
          wxString msg;
-         msg.Printf(_("Error %d returned from MP3 encoder"), bytes);
+         msg.Printf(_("Error %ld returned from MP3 encoder"), bytes);
          wxMessageBox(msg);
          break;
       }
diff --git a/src/export/ExportMultiple.cpp b/src/export/ExportMultiple.cpp
index 45057f4..c8d42c2 100644
--- a/src/export/ExportMultiple.cpp
+++ b/src/export/ExportMultiple.cpp
@@ -535,14 +535,14 @@ void ExportMultiple::OnExport(wxCommandEvent& WXUNUSED(event))
    {
       wxString msg;
       msg.Printf(
-         ok == eProgressSuccess ? _("Successfully exported the following %ld file(s).")
-           : (ok == eProgressFailed ? _("Something went wrong after exporting the following %ld file(s).")
-             : (ok == eProgressCancelled ? _("Export canceled after exporting the following %ld file(s).")
-               : (ok == eProgressStopped ? _("Export stopped after exporting the following %ld file(s).")
-                 : _("Something went really wrong after exporting the following %ld file(s).")
+         ok == eProgressSuccess ? _("Successfully exported the following %lld file(s).")
+           : (ok == eProgressFailed ? _("Something went wrong after exporting the following %lld file(s).")
+             : (ok == eProgressCancelled ? _("Export canceled after exporting the following %lld file(s).")
+               : (ok == eProgressStopped ? _("Export stopped after exporting the following %lld file(s).")
+                 : _("Something went really wrong after exporting the following %lld file(s).")
                  )
                )
-             ), mExported.GetCount());
+             ), (long long) mExported.GetCount());
 
       wxString FileList;
       for (size_t i = 0; i < mExported.GetCount(); i++) {
diff --git a/src/import/Import.cpp b/src/import/Import.cpp
index d7d5214..bdf7293 100644
--- a/src/import/Import.cpp
+++ b/src/import/Import.cpp
@@ -279,7 +279,7 @@ void Importer::WriteImportItems()
                val.Append (wxT(":"));
          }
       }
-      name.Printf (wxT("/ExtImportItems/Item%d"), i);
+      name.Printf (wxT("/ExtImportItems/Item%lld"), (long long) i);
       gPrefs->Write (name, val);
       gPrefs->Flush();
    }
@@ -288,7 +288,7 @@ void Importer::WriteImportItems()
    more to delete.*/
    i = this->mExtImportItems->Count();
    do {
-     name.Printf (wxT("/ExtImportItems/Item%d"), i);
+     name.Printf (wxT("/ExtImportItems/Item%lld"), (long long) i);
      // No item to delete?  Then it's time to finish.
      if (!gPrefs->Read(name, &val))
         break;
diff --git a/src/import/ImportFFmpeg.cpp b/src/import/ImportFFmpeg.cpp
index 212ded3..5a7a26a 100644
--- a/src/import/ImportFFmpeg.cpp
+++ b/src/import/ImportFFmpeg.cpp
@@ -440,7 +440,7 @@ bool FFmpegImportFileHandle::InitCodecs()
          {
             lang.FromUTF8(tag->value);
          }
-         strinfo.Printf(_("Index[%02x] Codec[%S], Language[%S], Bitrate[%S], Channels[%d], Duration[%d]"),sc->m_stream->id,codec->name,lang.c_str(),bitrate.c_str(),sc->m_stream->codec->channels, duration);
+         strinfo.Printf(_("Index[%02x] Codec[%s], Language[%s], Bitrate[%s], Channels[%d], Duration[%d]"),sc->m_stream->id,codec->name,lang.c_str(),bitrate.c_str(),sc->m_stream->codec->channels, duration);
          mStreamInfo->Add(strinfo);
          mScs[mNumStreams++] = sc;
       }
@@ -541,7 +541,7 @@ int FFmpegImportFileHandle::Import(TrackFactory *trackFactory,
       if (mScs[s]->m_stream->start_time != int64_t(AV_NOPTS_VALUE) && mScs[s]->m_stream->start_time > 0)
       {
          stream_delay = mScs[s]->m_stream->start_time;
-         wxLogDebug(wxT("Stream %d start_time = %d, that would be %f milliseconds."), s, mScs[s]->m_stream->start_time, double(mScs[s]->m_stream->start_time)/AV_TIME_BASE*1000);
+         wxLogDebug(wxT("Stream %d start_time = %lld, that would be %f milliseconds."), s, (long long) mScs[s]->m_stream->start_time, double(mScs[s]->m_stream->start_time)/AV_TIME_BASE*1000);
       }
       if (stream_delay != 0)
       {
diff --git a/src/import/ImportGStreamer.cpp b/src/import/ImportGStreamer.cpp
index 256ef65..6f52198 100644
--- a/src/import/ImportGStreamer.cpp
+++ b/src/import/ImportGStreamer.cpp
@@ -983,9 +983,9 @@ GStreamerImportFileHandle::Init()
       // Create stream info string
       wxString strinfo;
       strinfo.Printf(wxT("Index[%02d], Type[%s], Channels[%d], Rate[%d]"),
-                     i,
+                     (unsigned int) i,
                      wxString::FromUTF8(c->mType).c_str(),
-                     c->mNumChannels,
+                     (int) c->mNumChannels,
                      (int) c->mSampleRate);
       mStreamInfo.Add(strinfo);
    }
@@ -1371,7 +1371,7 @@ GStreamerImportFileHandle::OnTag(GstAppSink * WXUNUSED(appsink), GstTagList *tag
          }
          else if (G_VALUE_HOLDS_UINT(val))
          {
-            string.Printf(wxT("%u"), g_value_get_uint(val));
+            string.Printf(wxT("%u"), (unsigned int) g_value_get_uint(val));
          }
          else if (G_VALUE_HOLDS_DOUBLE(val))
          {
diff --git a/src/import/ImportOGG.cpp b/src/import/ImportOGG.cpp
index 347e590..0676a38 100644
--- a/src/import/ImportOGG.cpp
+++ b/src/import/ImportOGG.cpp
@@ -109,7 +109,7 @@ public:
       for (int i = 0; i < vorbisFile->links; i++)
       {
          wxString strinfo;
-         strinfo.Printf(wxT("Index[%02x] Version[%d], Channels[%d], Rate[%d]"),i,vorbisFile->vi[i].version,vorbisFile->vi[i].channels,vorbisFile->vi[i].rate);
+         strinfo.Printf(wxT("Index[%02x] Version[%d], Channels[%d], Rate[%ld]"), (unsigned int) i,vorbisFile->vi[i].version,vorbisFile->vi[i].channels,vorbisFile->vi[i].rate);
          mStreamInfo->Add(strinfo);
          mStreamUsage[i] = 0;
       }
diff --git a/src/import/ImportRaw.cpp b/src/import/ImportRaw.cpp
index 03279f0..4e38753 100644
--- a/src/import/ImportRaw.cpp
+++ b/src/import/ImportRaw.cpp
@@ -337,7 +337,7 @@ ImportRawDialog::ImportRawDialog(wxWindow * parent,
 
       if (sf_format_check(&info)) {
          mEncodingSubtype[mNumEncodings] = subtype;
-         encodings.Add(LAT1CTOWX(sf_encoding_index_name(i)));
+         encodings.Add(sf_encoding_index_name(i));
 
          if ((mEncoding & SF_FORMAT_SUBMASK) == subtype)
             selection = mNumEncodings;
diff --git a/src/ondemand/ODManager.cpp b/src/ondemand/ODManager.cpp
index a2b352c..b69cc5a 100644
--- a/src/ondemand/ODManager.cpp
+++ b/src/ondemand/ODManager.cpp
@@ -311,7 +311,7 @@ void ODManager::Start()
          AudacityProject::AllProjectsDeleteLock();
          AudacityProject* proj = GetActiveProject();
          if(proj)
-            proj->AddPendingEvent( event );
+            proj->GetEventHandler()->AddPendingEvent( event );
          AudacityProject::AllProjectsDeleteUnlock();
       }
       mTerminateMutex.Lock();
diff --git a/src/ondemand/ODTask.cpp b/src/ondemand/ODTask.cpp
index c15b73d..fbf1f0c 100644
--- a/src/ondemand/ODTask.cpp
+++ b/src/ondemand/ODTask.cpp
@@ -158,7 +158,7 @@ void ODTask::DoSome(float amountWork)
          if(IsTaskAssociatedWithProject(gAudacityProjects[i]))
          {
             //this assumes tasks are only associated with one project.
-            gAudacityProjects[i]->AddPendingEvent( event );
+            gAudacityProjects[i]->GetEventHandler()->AddPendingEvent( event );
             //mark the changes so that the project can be resaved.
             gAudacityProjects[i]->GetUndoManager()->SetODChangesFlag();
             break;
diff --git a/src/prefs/KeyConfigPrefs.cpp b/src/prefs/KeyConfigPrefs.cpp
index bac9697..224290b 100644
--- a/src/prefs/KeyConfigPrefs.cpp
+++ b/src/prefs/KeyConfigPrefs.cpp
@@ -420,7 +420,7 @@ void KeyConfigPrefs::OnHotkeyKeyDown(wxKeyEvent & e)
       nevent.SetDirection(!e.ShiftDown());
       nevent.SetEventObject(t);
       nevent.SetCurrentFocus(t);
-      t->GetParent()->ProcessEvent(nevent);
+      t->GetParent()->GetEventHandler()->ProcessEvent(nevent);
       return;
    }
 
@@ -465,7 +465,7 @@ void KeyConfigPrefs::OnFilterKeyDown(wxKeyEvent & e)
       nevent.SetDirection(!e.ShiftDown());
       nevent.SetEventObject(t);
       nevent.SetCurrentFocus(t);
-      t->GetParent()->ProcessEvent(nevent);
+      t->GetParent()->GetEventHandler()->ProcessEvent(nevent);
 
       return;
    }
@@ -996,7 +996,7 @@ void KeyConfigPrefs::OnCaptureKeyDown(wxKeyEvent & e)
       nevent.SetDirection(!e.ShiftDown());
       nevent.SetEventObject(t);
       nevent.SetCurrentFocus(t);
-      t->GetParent()->ProcessEvent(nevent);
+      t->GetParent()->GetEventHandler()->ProcessEvent(nevent);
 
       return;
    }
diff --git a/src/prefs/PrefsDialog.cpp b/src/prefs/PrefsDialog.cpp
index d6cc2ba..0a306ed 100644
--- a/src/prefs/PrefsDialog.cpp
+++ b/src/prefs/PrefsDialog.cpp
@@ -185,8 +185,6 @@ PrefsDialog::PrefsDialog(wxWindow * parent)
    Fit();
    wxSize sz = GetSize();
 
-   wxASSERT_MSG(sz.x <= 800 && sz.y <= 600, wxT("Preferences dialog exceeds max size"));
-
    if (sz.x > 800) {
       sz.x = 800;
    }
diff --git a/src/prefs/QualityPrefs.cpp b/src/prefs/QualityPrefs.cpp
index d3d3e75..44c6f6d 100644
--- a/src/prefs/QualityPrefs.cpp
+++ b/src/prefs/QualityPrefs.cpp
@@ -162,13 +162,13 @@ void QualityPrefs::PopulateOrExchange(ShuttleGui & S)
    {
       S.StartMultiColumn(2, wxEXPAND);
       {
-         S.SetStretchyCol(2);
+         S.SetStretchyCol(1); // 2nd column (= index 1) is stretchy
 
          S.TieChoice(_("Sample Rate Con&verter:"),
                      Resample::GetFastMethodKey(),
                      Resample::GetFastMethodDefault(),
                      mConverterNames,
-                     mConverterLabels),
+                     mConverterLabels);
          S.SetSizeHints(mConverterNames);
 
          S.TieChoice(_("&Dither:"),
diff --git a/src/toolbars/DeviceToolBar.cpp b/src/toolbars/DeviceToolBar.cpp
index 13a5a58..3412886 100644
--- a/src/toolbars/DeviceToolBar.cpp
+++ b/src/toolbars/DeviceToolBar.cpp
@@ -71,9 +71,7 @@ void DeviceToolBar::Create(wxWindow *parent)
 {
    ToolBar::Create(parent);
 
-   // Simulate a size event to set initial meter placement/size
-   wxSizeEvent dummy;
-   OnSize(dummy);
+   Layout();
 }
 
 void DeviceToolBar::RecreateTipWindows()
@@ -618,7 +616,7 @@ void DeviceToolBar::FillInputChannels()
                name = _("2 (Stereo) Recording Channels");
             }
             else {
-               name = wxString::Format(wxT("%d"), j + 1);
+               name = wxString::Format(wxT("%lld"), (long long) (j + 1));
             }
             mInputChannels->Append(name);
          }
diff --git a/src/toolbars/ToolsToolBar.cpp b/src/toolbars/ToolsToolBar.cpp
index 2fcecab..9688674 100644
--- a/src/toolbars/ToolsToolBar.cpp
+++ b/src/toolbars/ToolsToolBar.cpp
@@ -59,7 +59,7 @@ IMPLEMENT_CLASS(ToolsToolBar, ToolBar);
 
 // Strings to convert a tool number into a status message
 // These MUST be in the same order as the ids above.
-static const wxChar * MessageOfTool[numTools] = {
+static const wxString MessageOfTool[numTools] = {
    wxTRANSLATE("Click and drag to select audio"),
    wxTRANSLATE("Click and drag to edit the amplitude envelope"),
    wxTRANSLATE("Click and drag to edit the samples"),
diff --git a/src/widgets/ASlider.cpp b/src/widgets/ASlider.cpp
index a7f6449..90abba8 100644
--- a/src/widgets/ASlider.cpp
+++ b/src/widgets/ASlider.cpp
@@ -1191,7 +1191,7 @@ void LWSlider::OnKeyEvent(wxKeyEvent & event)
                nevent.SetDirection( !event.ShiftDown() );
                nevent.SetEventObject( mParent );
                nevent.SetCurrentFocus( mParent );
-               mParent->GetParent()->ProcessEvent( nevent );
+               mParent->GetParent()->GetEventHandler()->ProcessEvent( nevent );
             }
             break;
 
@@ -1203,7 +1203,7 @@ void LWSlider::OnKeyEvent(wxKeyEvent & event)
                if (def && def->IsEnabled()) {
                   wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED,
                         def->GetId());
-                  mParent->ProcessEvent(cevent);
+                  mParent->GetEventHandler()->ProcessEvent(cevent);
                }
             }
 
@@ -1228,7 +1228,7 @@ void LWSlider::SendUpdate( float newValue )
    int intValue = (int)( ( mCurrentValue - mMinValue ) * 1000.0f /
                          ( mMaxValue - mMinValue ) );
    e.SetInt( intValue );
-   mParent->ProcessEvent( e );
+   mParent->GetEventHandler()->ProcessEvent( e );
 }
 
 int LWSlider::ValueToPosition(float val)
diff --git a/src/widgets/ExpandingToolBar.cpp b/src/widgets/ExpandingToolBar.cpp
index 801aa53..4fa5aa6 100644
--- a/src/widgets/ExpandingToolBar.cpp
+++ b/src/widgets/ExpandingToolBar.cpp
@@ -72,6 +72,7 @@ ExpandingToolBar.
 #include <wx/window.h>
 #endif
 
+#include <wx/dcclient.h>
 #include <wx/dcmemory.h>
 #include <wx/log.h>
 #include <wx/dragimag.h>
diff --git a/src/widgets/FileHistory.cpp b/src/widgets/FileHistory.cpp
index 8ff5d05..c83f496 100644
--- a/src/widgets/FileHistory.cpp
+++ b/src/widgets/FileHistory.cpp
@@ -142,7 +142,7 @@ void FileHistory::Save(wxConfigBase & config, const wxString & group)
    // Stored in reverse order
    int n = mHistory.GetCount() - 1;
    for (size_t i = 1; i <= mHistory.GetCount(); i++) {
-      config.Write(wxString::Format(wxT("file%02d"), i), mHistory[n--]);
+      config.Write(wxString::Format(wxT("file%02d"), (int) i), mHistory[n--]);
    }
 
    config.SetPath(wxT(".."));
diff --git a/src/widgets/Grabber.cpp b/src/widgets/Grabber.cpp
index cf1d1fb..aff2ce6 100644
--- a/src/widgets/Grabber.cpp
+++ b/src/widgets/Grabber.cpp
@@ -89,7 +89,7 @@ void Grabber::SendEvent(wxEventType type, const wxPoint & pos)
    e.SetEventObject(parent);
 
    // Queue the event
-   parent->AddPendingEvent(e);
+   parent->GetEventHandler()->AddPendingEvent(e);
 }
 
 //
diff --git a/src/widgets/Grid.cpp b/src/widgets/Grid.cpp
index cd246d8..85e8b5c 100644
--- a/src/widgets/Grid.cpp
+++ b/src/widgets/Grid.cpp
@@ -71,7 +71,8 @@ void TimeEditor::BeginEdit(int row, int col, wxGrid *grid)
 {
    wxGridTableBase *table = grid->GetTable();
 
-   table->GetValue(row, col).ToDouble(&mOld);
+   mOldString = table->GetValue(row, col);
+   mOldString.ToDouble(&mOld);
 
    GetTimeCtrl()->SetTimeValue(mOld);
    GetTimeCtrl()->EnableMenu();
@@ -81,16 +82,32 @@ void TimeEditor::BeginEdit(int row, int col, wxGrid *grid)
 
 bool TimeEditor::EndEdit(int row, int col, wxGrid *grid)
 {
+    wxString newvalue;
+    bool changed = EndEdit(row, col, grid, mOldString, &newvalue);
+    if (changed) {
+        ApplyEdit(row, col, grid);
+    }
+    return changed;
+}
+
+bool TimeEditor::EndEdit(int row, int col, const wxGrid *grid, const wxString &oldval, wxString *newval)
+{
    double newtime = GetTimeCtrl()->GetTimeValue();
    bool changed = newtime != mOld;
 
    if (changed) {
-      grid->GetTable()->SetValue(row, col, wxString::Format(wxT("%g"), newtime));
+      mValueAsString = wxString::Format(wxT("%g"), newtime);
+      *newval = mValueAsString;
    }
 
    return changed;
 }
 
+void TimeEditor::ApplyEdit(int row, int col, wxGrid *grid)
+{
+   grid->GetTable()->SetValue(row, col, mValueAsString);
+}
+
 void TimeEditor::Reset()
 {
    GetTimeCtrl()->SetTimeValue(mOld);
@@ -295,8 +312,19 @@ void ChoiceEditor::BeginEdit(int row, int col, wxGrid* grid)
    Choice()->SetFocus();
 }
 
+bool ChoiceEditor::EndEdit(int row, int col, wxGrid *grid)
+{
+    wxString newvalue;
+    bool changed = EndEdit(row, col, grid, mOld, &newvalue);
+    if (changed) {
+        ApplyEdit(row, col, grid);
+    }
+    return changed;
+}
+
 bool ChoiceEditor::EndEdit(int row, int col,
-                           wxGrid* grid)
+                           const wxGrid* grid,
+                           const wxString &oldval, wxString *newval)
 {
    int sel = Choice()->GetSelection();
 
@@ -307,12 +335,20 @@ bool ChoiceEditor::EndEdit(int row, int col,
    }
 
    wxString val = mChoices[sel];
-   if (val == mOld)
-      return false;
+   bool changed = val != mOld;
 
-   grid->GetTable()->SetValue(row, col, val);
+   if (changed)
+   {
+      mValueAsString = val;
+      *newval = val;
+   }
 
-   return true;
+   return changed;
+}
+
+void ChoiceEditor::ApplyEdit(int row, int col, wxGrid *grid)
+{
+   grid->GetTable()->SetValue(row, col, mValueAsString);
 }
 
 void ChoiceEditor::Reset()
@@ -491,7 +527,7 @@ void Grid::OnKeyDown(wxKeyEvent &event)
             if (def && def->IsEnabled()) {
                wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED,
                                      def->GetId());
-               GetParent()->ProcessEvent(cevent);
+               GetParent()->GetEventHandler()->ProcessEvent(cevent);
             }
          }
          else {
diff --git a/src/widgets/Grid.h b/src/widgets/Grid.h
index fbdf553..9d036cc 100644
--- a/src/widgets/Grid.h
+++ b/src/widgets/Grid.h
@@ -52,8 +52,13 @@ class TimeEditor:public wxGridCellEditor
    void SetSize(const wxRect &rect);
 
    void BeginEdit(int row, int col, wxGrid *grid);
+
    bool EndEdit(int row, int col, wxGrid *grid);
 
+   bool EndEdit(int row, int col, const wxGrid *grid, const wxString &oldval, wxString *newval);
+
+   void ApplyEdit(int row, int col, wxGrid *grid);
+
    void Reset();
 
    wxString GetFormat();
@@ -65,12 +70,14 @@ class TimeEditor:public wxGridCellEditor
    wxString GetValue() const;
 
    TimeTextCtrl *GetTimeCtrl() const { return (TimeTextCtrl *)m_control; };
-
+   
  private:
 
    wxString mFormat;
    double mRate;
    double mOld;
+   wxString mOldString;
+   wxString mValueAsString;
 };
 
 // ----------------------------------------------------------------------------
@@ -124,8 +131,13 @@ public:
    void SetSize(const wxRect &rect);
 
    void BeginEdit(int row, int col, wxGrid *grid);
+
    bool EndEdit(int row, int col, wxGrid *grid);
 
+   bool EndEdit(int row, int col, const wxGrid *grid, const wxString &oldval, wxString *newval);
+
+   void ApplyEdit(int row, int col, wxGrid *grid);
+
    void Reset();
 
    wxGridCellEditor *Clone() const;
@@ -159,6 +171,7 @@ public:
 
    wxArrayString mChoices;
    wxString mOld;
+   wxString mValueAsString;
 };
 
 // ----------------------------------------------------------------------------
diff --git a/src/widgets/ImageRoll.cpp b/src/widgets/ImageRoll.cpp
index dd8c200..9686961 100644
--- a/src/widgets/ImageRoll.cpp
+++ b/src/widgets/ImageRoll.cpp
@@ -299,7 +299,7 @@ bool ImageRoll::Ok() const
 }
 
 void ImageRoll::DrawBitmap(wxDC &dc, wxBitmap &bitmap,
-                           int x, int y, int logicalFunc)
+                           int x, int y, wxRasterOperationMode logicalFunc)
 {
    if (logicalFunc == wxCOPY)
       dc.DrawBitmap(bitmap, x, y);
@@ -311,7 +311,7 @@ void ImageRoll::DrawBitmap(wxDC &dc, wxBitmap &bitmap,
    }
 }
 
-void ImageRoll::Draw(wxDC &dc, wxRect rect, int WXUNUSED(logicalFunc))
+void ImageRoll::Draw(wxDC &dc, wxRect rect, wxRasterOperationMode WXUNUSED(logicalFunc))
 {
    int width = rect.width;
    int height = rect.height;
@@ -434,7 +434,7 @@ ImageRollPanel::ImageRollPanel(wxWindow *parent,
                 mImageRoll.GetMaxSize());
 }
 
-void ImageRollPanel::SetLogicalFunction(int func)
+void ImageRollPanel::SetLogicalFunction(wxRasterOperationMode func)
 {
    mLogicalFunction = func;
 }
diff --git a/src/widgets/ImageRoll.h b/src/widgets/ImageRoll.h
index e8ed46c..4503e80 100644
--- a/src/widgets/ImageRoll.h
+++ b/src/widgets/ImageRoll.h
@@ -12,9 +12,18 @@
 #ifndef __AUDACITY_IMAGE_ROLL__
 #define __AUDACITY_IMAGE_ROLL__
 
+#include <wx/dc.h>
+#include <wx/dcclient.h>
 #include <wx/defs.h>
 #include <wx/dynarray.h>
 #include <wx/panel.h>
+#include <wx/version.h>
+
+
+#if wxMAJOR_VERSION < 3
+#  define wxRasterOperationMode int
+#endif
+
 
 WX_DECLARE_OBJARRAY(wxBitmap, BitmapArray);
 WX_DECLARE_OBJARRAY(wxImage, ImageArray);
@@ -40,7 +49,7 @@ class ImageRoll
    wxSize GetMaxSize() const { return mMaxSize; }
 
    void Draw(wxDC &dc, wxRect rect,
-             int logicalFunc = wxCOPY);
+             wxRasterOperationMode logicalFunc = wxCOPY);
 
    static ImageArray SplitH(const wxImage &src, wxColour magicColor);
    static ImageArray SplitV(const wxImage &src, wxColour magicColor);
@@ -48,7 +57,7 @@ class ImageRoll
  protected:
 
    void DrawBitmap(wxDC &dc, wxBitmap &bitmap,
-                   int x, int y, int logicalFunc = wxCOPY);
+                   int x, int y, wxRasterOperationMode logicalFunc = wxCOPY);
 
    void Init(RollType type, const wxImage &src, wxColour magicColor);
 
@@ -72,7 +81,7 @@ class ImageRollPanel : public wxPanel
                   const wxSize& size = wxDefaultSize,
                   long style = wxTAB_TRAVERSAL);
 
-   void SetLogicalFunction(int func);
+   void SetLogicalFunction(wxRasterOperationMode func);
 
    void OnPaint(wxPaintEvent &evt);
    void OnSize(wxSizeEvent &evt);
@@ -80,7 +89,7 @@ class ImageRollPanel : public wxPanel
  protected:
    ImageRoll mImageRoll;
 
-   int mLogicalFunction;
+   wxRasterOperationMode mLogicalFunction;
 
    DECLARE_EVENT_TABLE();
 
diff --git a/src/widgets/KeyView.cpp b/src/widgets/KeyView.cpp
index 5e30e16..275e35e 100644
--- a/src/widgets/KeyView.cpp
+++ b/src/widgets/KeyView.cpp
@@ -1576,7 +1576,7 @@ KeyView::CmpKeyNodeByTree(KeyNode ***n1, KeyNode ***n2)
    else
    {
       // A "menu" node, so prepend the line number
-      k1.Printf(wxT("%08x%s"), t1->line, t1->label.c_str());
+      k1.Printf(wxT("%08x%s"), (unsigned int) t1->line, t1->label.c_str());
    }
 
    // See above for explanation
@@ -1588,7 +1588,7 @@ KeyView::CmpKeyNodeByTree(KeyNode ***n1, KeyNode ***n2)
    else
    {
       // A "menu" node, so prepend the line number
-      k2.Printf(wxT("%08x%s"), t2->line, t2->label.c_str());
+      k2.Printf(wxT("%08x%s"), (unsigned int) t2->line, t2->label.c_str());
    }
 
    // See wxWidgets documentation for explanation of comparison results.
diff --git a/src/widgets/TimeTextCtrl.cpp b/src/widgets/TimeTextCtrl.cpp
index 6137354..0b2fb0b 100644
--- a/src/widgets/TimeTextCtrl.cpp
+++ b/src/widgets/TimeTextCtrl.cpp
@@ -168,6 +168,7 @@ different formats.
 
 #include <math.h>
 
+#include <wx/dcclient.h>
 #include <wx/dcmemory.h>
 #include <wx/font.h>
 #include <wx/intl.h>
@@ -1435,7 +1436,7 @@ void TimeTextCtrl::OnKeyDown(wxKeyEvent &event)
       nevent.SetDirection(!event.ShiftDown());
       nevent.SetEventObject(parent);
       nevent.SetCurrentFocus(parent);
-      GetParent()->ProcessEvent(nevent);
+      GetParent()->GetEventHandler()->ProcessEvent(nevent);
       event.Skip(false);
    }
 
@@ -1445,7 +1446,7 @@ void TimeTextCtrl::OnKeyDown(wxKeyEvent &event)
       if (def && def->IsEnabled()) {
          wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED,
                                def->GetId());
-         GetParent()->ProcessEvent(cevent);
+         GetParent()->GetEventHandler()->ProcessEvent(cevent);
          event.Skip(false);
       }
    }
diff --git a/src/widgets/numformatter.cpp b/src/widgets/numformatter.cpp
index 8277231..9104109 100644
--- a/src/widgets/numformatter.cpp
+++ b/src/widgets/numformatter.cpp
@@ -11,6 +11,11 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+#include "wx/version.h"
+
+// on wx >= 3.0 we should use the real numformatter (instead of a backported copy)
+#if !wxCHECK_VERSION(3,0,0)
+
 // ----------------------------------------------------------------------------
 // headers
 // ----------------------------------------------------------------------------
@@ -367,3 +372,6 @@ bool wxNumberFormatter::FromString(wxString s, double *val)
     RemoveThousandsSeparators(s);
     return s.ToDouble(val);
 }
+
+#endif // !wxCHECK_VERSION(3,0,0)
+
diff --git a/src/widgets/numformatter.h b/src/widgets/numformatter.h
index f32306d..6123b78 100644
--- a/src/widgets/numformatter.h
+++ b/src/widgets/numformatter.h
@@ -11,8 +11,15 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_NUMFORMATTER_H_
-#define _WX_NUMFORMATTER_H_
+#ifndef _NUMFORMATTER_H_
+#define _NUMFORMATTER_H_
+
+#include "wx/version.h"
+
+// on wx >= 3.0 we should use the real numformatter (instead of a backported copy)
+#if wxCHECK_VERSION(3,0,0)
+#  include "wx/numformatter.h"
+#else // wxCHECK_VERSION(3,0,0)
 
 #include "wx/string.h"
 
@@ -84,4 +91,6 @@ private:
     static void RemoveThousandsSeparators(wxString& s);
 };
 
-#endif // _WX_NUMFORMATTER_H_
+#endif // wxCHECK_VERSION(3,0,0)
+
+#endif // _NUMFORMATTER_H_
diff --git a/src/widgets/valnum.cpp b/src/widgets/valnum.cpp
index 2bde5ff..ea45613 100644
--- a/src/widgets/valnum.cpp
+++ b/src/widgets/valnum.cpp
@@ -11,6 +11,11 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+#include "wx/version.h"
+
+// on wx >= 3.0 we should use the real valnum (instead of a backported copy)
+#if !wxCHECK_VERSION(3,0,0)
+
 // ============================================================================
 // Declarations
 // ============================================================================
@@ -310,3 +315,6 @@ wxFloatingPointValidatorBase::IsCharOk(const wxString& val,
 }
 
 #endif // wxUSE_VALIDATORS && wxUSE_TEXTCTRL
+
+#endif // !wxCHECK_VERSION(3,0,0)
+
diff --git a/src/widgets/valnum.h b/src/widgets/valnum.h
index a049eb3..c5bc3a6 100644
--- a/src/widgets/valnum.h
+++ b/src/widgets/valnum.h
@@ -8,8 +8,15 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_VALNUM_H_
-#define _WX_VALNUM_H_
+#ifndef _VALNUM_H_
+#define _VALNUM_H_
+
+#include "wx/version.h"
+
+// on wx >= 3.0 we should use the real valnum (instead of a backported copy)
+#if wxCHECK_VERSION(3,0,0)
+#  include "wx/valnum.h"
+#else // wxCHECK_VERSION(3,0,0)
 
 #include "wx/defs.h"
 
@@ -471,4 +478,6 @@ wxMakeFloatingPointValidator(int precision, T *value, int style = wxNUM_VAL_DEFA
 
 #endif // wxUSE_VALIDATORS
 
-#endif // _WX_VALNUM_H_
+#endif // wxCHECK_VERSION(3,0,0)
+
+#endif // _VALNUM_H_
diff --git a/src/xml/XMLWriter.cpp b/src/xml/XMLWriter.cpp
index da9971f..1838693 100644
--- a/src/xml/XMLWriter.cpp
+++ b/src/xml/XMLWriter.cpp
@@ -189,9 +189,9 @@ void XMLWriter::WriteAttr(const wxChar *name, long long value)
 
 void XMLWriter::WriteAttr(const wxString &name, size_t value)
 {
-   Write(wxString::Format(wxT(" %s=\"%ld\""),
+   Write(wxString::Format(wxT(" %s=\"%lld\""),
       name.c_str(),
-      value));
+      (long long) value));
 }
 
 void XMLWriter::WriteAttr(const wxChar *name, size_t value)
@@ -247,7 +247,7 @@ void XMLWriter::WriteSubTree(const wxString &value)
       mHasKids[0] = true;
    }
 
-   Write(value.c_str());
+   Write(value);
 }
 
 void XMLWriter::WriteSubTree(const wxChar *value)
-- 
1.9.1

_______________________________________________
pkg-multimedia-maintainers mailing list
pkg-multimedia-maintainers@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-multimedia-maintainers

Reply via email to