From: Jakub Bogusz Date: Sun, 18 Oct 2015 09:29:01 +0000 (+0200) Subject: - new URLs, updated to 2.1.1 X-Git-Tag: auto/th/audacity-2.1.1-1 X-Git-Url: http://git.pld-linux.org/?p=packages%2Faudacity.git;a=commitdiff_plain;h=5eec20a - new URLs, updated to 2.1.1 - removed obsolete system-libs,wx-fd-constants,wx30 patches - added cast patch (add cast to fix build with current g++/wx) --- diff --git a/audacity-cast.patch b/audacity-cast.patch new file mode 100644 index 0000000..608b690 --- /dev/null +++ b/audacity-cast.patch @@ -0,0 +1,11 @@ +--- audacity-minsrc-2.1.1/src/prefs/TracksPrefs.cpp.orig 2015-07-10 19:35:40.000000000 +0200 ++++ audacity-minsrc-2.1.1/src/prefs/TracksPrefs.cpp 2015-10-17 20:48:00.933667048 +0200 +@@ -36,7 +36,7 @@ + // Bugs 1043, 1044 + // First rewrite legacy preferences + gPrefs->Write(wxT("/GUI/DefaultViewModeNew"), +- WaveTrack::FindDefaultViewMode()); ++ static_cast(WaveTrack::FindDefaultViewMode())); + + Populate(); + } diff --git a/audacity-system-libs.patch b/audacity-system-libs.patch deleted file mode 100644 index a2969fa..0000000 --- a/audacity-system-libs.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- audacity-src-1.3.2-beta/m4/audacity_checklib_libresample.m4.orig 2006-12-29 17:01:36.794372000 +0100 -+++ audacity-src-1.3.2-beta/m4/audacity_checklib_libresample.m4 2006-12-29 17:23:30.465234287 +0100 -@@ -133,7 +151,22 @@ - - dnl ... but libresample isn't generally installed as a system library... - -- LIBRESAMPLE_SYSTEM_AVAILABLE="no" -+ AC_CHECK_LIB(resample, resample_open, -+ libresample_found="yes", -+ libresample_found="no") -+ -+ AC_CHECK_HEADER(libresample.h, -+ libresample_h_found="yes", -+ libresample_h_found="no") -+ -+ if test "x$libresample_found" = "xyes" && test "x$libresample_h_found" = "xyes" ; then -+ LIBRESAMPLE_SYSTEM_AVAILABLE="yes" -+ LIBRESAMPLE_SYSTEM_LIBS=-lresample -+ AC_MSG_NOTICE([Libresample libraries are available as system libraries]) -+ else -+ LIBRESAMPLE_SYSTEM_AVAILABLE="no" -+ AC_MSG_NOTICE([Libresample libraries are NOT available as system libraries]) -+ fi - - dnl see if libresample is available locally - diff --git a/audacity.spec b/audacity.spec index 51571ce..afa8f4f 100644 --- a/audacity.spec +++ b/audacity.spec @@ -2,79 +2,75 @@ # - internal portaudio crashes when only OSS is available on startup # - use system portaudio (>= 19, but relies on local changes) # - use system portSMF? -# - use system ffmpeg (libavcodec >= 51.53, libavformat >= 52.12), libavutil +# - use system ffmpeg (libavcodec >= 51.53, libavformat >= 52.12, libavutil) # - use system sbsms (>= 1.6.0, but relies on local changes) # - use system libnyquist (if ever; currently it's a part of audacity project) # # Conditional build: -%bcond_with libresample # using libresample for resampling (default is soxr) -%bcond_with libsamplerate # using libsamplerate for resampling (default is soxr) %bcond_with ffmpeg # build with ffmpeg support (currently audacity does not support ffmpeg 1.0) +%bcond_with gtk3 # GTK+ 3.x instead of 2.x # -%if %{without libresample} && %{without libsamplerate} -%define with_soxr 1 -%endif Summary: Audacity - manipulate digital audio waveforms Summary(pl.UTF-8): Audacity - narzędzie do obróbki plików dźwiękowych Summary(ru.UTF-8): Кроссплатформенный звуковой редактор Name: audacity -Version: 2.0.5 -Release: 4 +Version: 2.1.1 +Release: 1 License: GPL v2+ Group: X11/Applications/Sound -#Source0Download: http://code.google.com/p/audacity/downloads/list -Source0: http://audacity.googlecode.com/files/%{name}-minsrc-%{version}.tar.xz -# Source0-md5: 657f71a5a214fe84731ed9842e09fa04 -# Link from http://manual.audacityteam.org/index.php?title=Main_Page -Source1: http://audacity.googlecode.com/files/%{name}-manual-%{version}.zip -# Source1-md5: 9f0b9db3f37aa4b9455a4b4e2046e1e4 +#Source0Download: http://www.oldfoss.com/Audacity.html +Source0: http://app.oldfoss.com:81/download/Audacity/%{name}-minsrc-%{version}.tar.xz +# Source0-md5: 9e37b1f5cde38d089a35febb904a9e39 +Source1: http://app.oldfoss.com:81/download/Audacity/%{name}-manual-%{version}.zip +# Source1-md5: a4116a20798b827cd1e06e50c8099aa6 Source2: %{name}.desktop Source3: %{name}-icon.png -Patch0: %{name}-system-libs.patch +Patch0: %{name}-cast.patch Patch1: %{name}-opt.patch Patch2: %{name}-no-macos.patch -# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=749659 -Patch3: wx-fd-constants.patch -Patch4: wx30.patch -URL: http://audacity.sourceforge.net/ +URL: http://audacityteam.org/ BuildRequires: alsa-lib-devel BuildRequires: autoconf >= 2.59 -BuildRequires: automake +BuildRequires: automake >= 1:1.9 BuildRequires: expat-devel >= 1.95 +# libavcodec >= 51.53 libavformat >= 52.12 libavutil %{?with_ffmpeg:BuildRequires: ffmpeg-devel >= 0.8.0} -BuildRequires: flac-c++-devel >= 1.2.0 -BuildRequires: gettext-tools -BuildRequires: gtk+2-devel >= 2.0 +BuildRequires: flac-c++-devel >= 1.3.0 +BuildRequires: gettext-tools >= 0.18 +%{!?with_gtk3:BuildRequires: gtk+2-devel >= 2.0} +%{?with_gtk3:BuildRequires: gtk+3-devel >= 3.0} BuildRequires: jack-audio-connection-kit-devel BuildRequires: hpklinux-devel >= 4.06 BuildRequires: lame-libs-devel BuildRequires: libid3tag-devel >= 0.15.0b-2 BuildRequires: libjpeg-devel BuildRequires: libmad-devel >= 0.14.2b-4 -%{?with_libresample:BuildRequires: libresample-devel >= 0.1.3} -%{?with_libsamplerate:BuildRequires: libsamplerate-devel >= 0.1.2} #BuildRequires: libsbsms-devel >= 1.6.0 +#BuildRequires: libsbsms2-devel >= 2.0.2 BuildRequires: libsndfile-devel >= 1.0.0 BuildRequires: libstdc++-devel +BuildRequires: libtool >= 2:2 BuildRequires: libvorbis-devel >= 1:1.0 +BuildRequires: lilv-devel >= 0.16 +BuildRequires: lv2-devel #BuildRequires: portaudio-devel >= 19 BuildRequires: pkgconfig BuildRequires: soundtouch-devel >= 1.3.0 -%{?with_soxr:BuildRequires: soxr-devel >= 0.0.5} +BuildRequires: soxr-devel >= 0.0.5 BuildRequires: speex-devel +BuildRequires: suil-devel >= 0.8.2 BuildRequires: twolame-devel >= 0.3.9 +BuildRequires: udev-devel BuildRequires: unzip BuildRequires: vamp-devel >= 2.0 BuildRequires: which -BuildRequires: wxGTK2-unicode-devel >= 2.8.0 -BuildRequires: wxX11-devel >= 2.8.0 +%{!?with_gtk3:BuildRequires: wxGTK2-unicode-devel >= 2.8.0} +%{?with_gtk3:BuildRequires: wxGTK3-unicode-devel >= 2.8.0} Requires(post,postun): shared-mime-info -Requires: flac-c++ >= 1.2.0 +Requires: flac-c++ >= 1.3.0 Requires: lame-libs Requires: libid3tag >= 0.15.0b-2 Requires: libmad >= 0.14.2b-4 -%{?with_libresample:Requires: libresample >= 0.1.3} -%{?with_libsamplerate:Requires: libsamplerate >= 0.1.2} Requires: libsndfile >= 1.0.0 Requires: soundtouch >= 1.3.0 %{?with_soxr:Requires: soxr >= 0.0.5} @@ -102,45 +98,68 @@ Audacity - это звуковой редактор, позволяющий ра микширование треков и применение эффектов, оформленных в виде плагинов, к любой части звукового файла. +%package devel +Summary: Header files for Audacity interfaces +Summary(pl.UTF-8): Pliki nagłówkowe interfejsów Audacity +Group: Development/Libraries +Requires: libstdc++-devel +Requires: wxWidgets-devel >= 2.8.0 +# doesn't require base + +%description devel +Header files for Audacity interfaces. + +%description devel -l pl.UTF-8 +Pliki nagłówkowe interfejsów Audacity. + %prep -%setup -q -n %{name}-src-%{version} +%setup -q -n %{name}-minsrc-%{version} %patch0 -p1 %patch1 -p1 %patch2 -p1 -%patch3 -p2 -%patch4 -p1 + +# OPTIONAL_SUBDIRS are not included in tarball; allow autotools to work +%{__sed} -i '/SUBDIRS += \$(OPTIONAL_SUBDIRS)/d' lib-src/Makefile.am %{__sed} -i 's/libmp3lame.so/libmp3lame.so.0/g' locale/*.po %build cd lib-src/portmixer +%{__libtoolize} +%{__aclocal} -I m4 %{__autoconf} +%{__automake} cd ../lib-widget-extra +%{__libtoolize} %{__aclocal} -I m4 %{__autoconf} +%{__automake} cd ../FileDialog -%{__aclocal} +%{__libtoolize} +%{__aclocal} -I m4 %{__autoconf} +%{__automake} cd ../portsmf %{__aclocal} -I autotools/m4 %{__autoconf} %{__automake} cd ../.. +%{__libtoolize} %{__aclocal} -I m4 %{__autoconf} +%{__automake} -export WX_CONFIG=$(which wx-gtk2-unicode-config) +export WX_CONFIG=$(which wx-gtk%{?with_gtk3:3}%{!?with_gtk3:2}-unicode-config) %configure \ + %{?with_gtk3:--enable-gtk3} \ --with-ffmpeg%{!?with_ffmpeg:=no} \ --with-help \ --with-id3tag=system \ --with-libmad=system \ - %{?with_libresample:--with-libresample=system} \ - %{?with_libsamplerate:--with-libsamplerate=system} \ --with-libsndfile=system \ --with-libflac=system \ --with-sbsms=local \ - %{?with_soxr:--with-soxr=system} \ + --with-soxr=system \ --with-vorbis=system %{__make} @@ -153,6 +172,11 @@ install -d $RPM_BUILD_ROOT{%{_desktopdir},%{_pixmapsdir}} DESTDIR=$RPM_BUILD_ROOT \ INSTALL_PATH=$RPM_BUILD_ROOT +# install headers in standard location +install -d $RPM_BUILD_ROOT%{_includedir} +%{__mv} $RPM_BUILD_ROOT%{_datadir}/audacity/include/audacity $RPM_BUILD_ROOT%{_includedir} +rmdir $RPM_BUILD_ROOT%{_datadir}/audacity/include + cp -a %{SOURCE2} $RPM_BUILD_ROOT%{_desktopdir} cp -a %{SOURCE3} $RPM_BUILD_ROOT%{_pixmapsdir} %{__unzip} -qq -a %{SOURCE1} -d $RPM_BUILD_ROOT%{_datadir}/%{name}/help @@ -160,7 +184,7 @@ cp -a %{SOURCE3} $RPM_BUILD_ROOT%{_pixmapsdir} # unsupported %{__rm} -r $RPM_BUILD_ROOT%{_datadir}/locale/sr_RS* -mv -f $RPM_BUILD_ROOT%{_datadir}/locale/{zh,zh_CN} +%{__mv} $RPM_BUILD_ROOT%{_datadir}/locale/{zh,zh_CN} %{__rm} $RPM_BUILD_ROOT%{_datadir}/pixmaps/audacity.xpm %{__rm} $RPM_BUILD_ROOT%{_datadir}/pixmaps/audacity16.xpm @@ -190,6 +214,11 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/man1/audacity.1* %{_desktopdir}/audacity.desktop %{_pixmapsdir}/audacity-icon.png +%{_datadir}/appdata/audacity.appdata.xml %{_datadir}/mime/packages/audacity.xml %{_iconsdir}/hicolor/*/apps/audacity.png %{_iconsdir}/hicolor/*/apps/audacity.svg + +%files devel +%defattr(644,root,root,755) +%{_includedir}/audacity diff --git a/wx-fd-constants.patch b/wx-fd-constants.patch deleted file mode 100644 index bb31e65..0000000 --- a/wx-fd-constants.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- a/audacity-2.0.5/lib-src/FileDialog/generic/FileDialogPrivate.cpp 2013-10-19 20:31:33.000000000 +1300 -+++ b/audacity-2.0.5/lib-src/FileDialog/generic/FileDialogPrivate.cpp 2014-06-01 20:38:47.890251794 +1200 -@@ -40,7 +40,7 @@ - #include "wx/settings.h" - #include "wx/filefn.h" - #include "wx/file.h" // for wxS_IXXX constants only --#include "wx/filedlg.h" // wxOPEN, wxSAVE... -+#include "wx/filedlg.h" // wxFD_OPEN, wxFD_SAVE... - #include "wx/generic/filedlgg.h" - #include "wx/generic/dirctrlg.h" // for wxFileIconsTable - -@@ -991,9 +991,9 @@ - } - - if (m_dialogStyle == 0) -- m_dialogStyle = wxOPEN; -- if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxOPEN)) -- m_dialogStyle |= wxOPEN; -+ m_dialogStyle = wxFD_OPEN; -+ if ((m_dialogStyle & wxMULTIPLE ) && !(m_dialogStyle & wxFD_OPEN)) -+ m_dialogStyle |= wxFD_OPEN; - - if ((m_dir.empty()) || (m_dir == wxT("."))) - { -@@ -1368,7 +1368,7 @@ - } - #endif // __UNIX__ - -- if (!(m_dialogStyle & wxSAVE)) -+ if (!(m_dialogStyle & wxFD_SAVE)) - { - if ((filename.Find(wxT('*')) != wxNOT_FOUND) || - (filename.Find(wxT('?')) != wxNOT_FOUND)) -@@ -1413,14 +1413,14 @@ - // VZ: the logic of testing for !wxFileExists() only for the open file - // dialog is not entirely clear to me, why don't we allow saving to a - // file without extension as well? -- if ( !(m_dialogStyle & wxOPEN) || !wxFileExists(filename) ) -+ if ( !(m_dialogStyle & wxFD_OPEN) || !wxFileExists(filename) ) - { - filename = AppendExtension(filename, m_filterExtension); - } - - // check that the file [doesn't] exist if necessary -- if ( (m_dialogStyle & wxSAVE) && -- (m_dialogStyle & wxOVERWRITE_PROMPT) && -+ if ( (m_dialogStyle & wxFD_SAVE) && -+ (m_dialogStyle & wxFD_OVERWRITE_PROMPT) && - wxFileExists( filename ) ) - { - wxString msg; -@@ -1429,8 +1429,8 @@ - if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES) - return; - } -- else if ( (m_dialogStyle & wxOPEN) && -- (m_dialogStyle & wxFILE_MUST_EXIST) && -+ else if ( (m_dialogStyle & wxFD_OPEN) && -+ (m_dialogStyle & wxFD_FILE_MUST_EXIST) && - !wxFileExists(filename) ) - { - wxMessageBox(_("Please choose an existing file."), _("Error"), ---- a/audacity-2.0.5/lib-src/FileDialog/win/FileDialogPrivate.cpp 2013-10-19 20:31:33.000000000 +1300 -+++ b/audacity-2.0.5/lib-src/FileDialog/win/FileDialogPrivate.cpp 2014-06-01 20:36:58.222264699 +1200 -@@ -731,7 +731,7 @@ - of.nMaxFile = wxMAXPATH; - - // we must set the default extension because otherwise Windows would check -- // for the existing of a wrong file with wxOVERWRITE_PROMPT (i.e. if the -+ // for the existing of a wrong file with wxFD_OVERWRITE_PROMPT (i.e. if the - // user types "foo" and the default extension is ".bar" we should force it - // to check for "foo.bar" existence and not "foo") - wxString defextBuffer; // we need it to be alive until GetSaveFileName()! diff --git a/wx30.patch b/wx30.patch deleted file mode 100644 index b16bb89..0000000 --- a/wx30.patch +++ /dev/null @@ -1,1329 +0,0 @@ -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). So the bugs (that were already present in - audacity before) become visible in wx3.0 as error messages. I've - fixed all the ones that popped up during my testing, but there might - be more of them that I just didn't happen to hit. At some point, all - the calls to wxString::Format and wxString::Printf have to be checked - systematically. -Author: Martin Steghöfer -Bug-Debian: https://bugs.debian.org/749659 - ---- a/configure.in -+++ b/configure.in -@@ -186,13 +186,11 @@ - [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 -@@ -291,19 +289,21 @@ - wxconfigargs="$static_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 - ---- a/lib-src/lib-widget-extra/configure.in -+++ b/lib-src/lib-widget-extra/configure.in -@@ -74,12 +74,11 @@ - 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 -@@ -139,19 +138,21 @@ - - 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 - ---- a/lib-src/FileDialog/configure.ac -+++ b/lib-src/FileDialog/configure.ac -@@ -47,7 +47,7 @@ - - AC_ARG_WITH(wx-version, - [AC_HELP_STRING([--with-wx-version], -- [override default wxWidgets version [2.6,2.8]])], -+ [override default wxWidgets version [2.8, 3.0]])], - wx_preference="--version=$withval", - wx_preference="") - -@@ -64,45 +64,66 @@ - fi - - dnl Gather wx arguments -+wxconfigargs="$static_preference $unicode_preference $debug_preference $wx_preference" - --CPPFLAGS="$CPPFLAGS `$WX_CONFIG $static_preference $unicode_preference $debug_preference $wx_preference --cxxflags`" -+dnl Get wx version -+wx_version=`${WX_CONFIG} $wxconfigargs --version` - --dnl OS-specific configuration -+dnl Get wx flags -+CXXFLAGS="$CXXFLAGS `$WX_CONFIG $wxconfigargs --cxxflags`" -+ -+dnl OS- and wx-version-specific configuration - - AC_CANONICAL_HOST - --case "${host_os}" in -- darwin*) -- dnl Mac OS X configuration -- EXTRADEPS="mac/FileDialogPrivate.h" -- EXTRAOBJS="mac/FileDialogPrivate.o" -- ;; -- -- cygwin*) -- dnl Windows/CygWin configuration -- EXTRADEPS="win/FileDialogPrivate.h" -- EXTRAOBJS="win/FileDialogPrivate.o" -- ;; -- -- *) -- dnl Unix configuration -- AM_PATH_GTK_2_0(2.4.0, -- have_gtk="yes", -- have_gtk="no") -- if [[ "$have_gtk" = "yes" ]] -- then -- CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" -- EXTRADEPS="gtk/FileDialogPrivate.h gtk/private.h" -- EXTRAOBJS="gtk/FileDialogPrivate.o" -- HAVE_GTK=1 -- else -- EXTRADEPS="generic/FileDialogPrivate.h" -- EXTRAOBJS="generic/FileDialogPrivate.o" -- HAVE_GTK=0 -- fi -- ;; -+case "${wx_version}" in -+ 2.8.*) -+ case "${host_os}" in -+ darwin*) -+ dnl Mac OS X configuration -+ EXTRADEPS="mac/FileDialogPrivate.h" -+ EXTRAOBJS="mac/FileDialogPrivate.o" -+ ;; -+ cygwin*) -+ dnl Windows/CygWin configuration -+ EXTRADEPS="win/FileDialogPrivate.h" -+ EXTRAOBJS="win/FileDialogPrivate.o" -+ ;; -+ *) -+ dnl Unix configuration -+ AM_PATH_GTK_2_0(2.4.0, -+ have_gtk="yes", -+ have_gtk="no") -+ if [[ "$have_gtk" = "yes" ]] -+ then -+ CPPFLAGS="$CPPFLAGS $GTK_CFLAGS" -+ EXTRADEPS="gtk/FileDialogPrivate.h gtk/private.h" -+ EXTRAOBJS="gtk/FileDialogPrivate.o" -+ HAVE_GTK=1 -+ else -+ EXTRADEPS="generic/FileDialogPrivate.h" -+ EXTRAOBJS="generic/FileDialogPrivate.o" -+ HAVE_GTK=0 -+ fi -+ ;; -+ esac -+ ;; -+ 3.0.*) -+ dnl for wxWidgets >= 3.0 we can compile a generic implementation of our FileDialog -+ EXTRADEPS="wx30/FileDialogPrivate.h" -+ EXTRAOBJS="wx30/FileDialogPrivate.o" -+ HAVE_GTK=0 dnl no need for extra GTK flags, we don't use it directly, we use wx interfaces -+ ;; -+ *) -+ 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 - -+ - # - # Write it all out - # ---- a/lib-src/FileDialog/FileDialog.h -+++ b/lib-src/FileDialog/FileDialog.h -@@ -26,14 +26,18 @@ - - typedef void (*fdCallback)(void *, int); - --#if defined(__WXMAC__) --#include "mac/FileDialogPrivate.h" --#elif defined(__WXMSW__) --#include "win/FileDialogPrivate.h" --#elif defined(__WXGTK__) && defined(HAVE_GTK) --#include "gtk/FileDialogPrivate.h" --#else --#include "generic/FileDialogPrivate.h" -+#if wxMAJOR_VERSION == 2 && wxMINOR_VERSION == 8 // wx2.8 -+# if defined(__WXMAC__) -+# include "mac/FileDialogPrivate.h" -+# elif defined(__WXMSW__) -+# include "win/FileDialogPrivate.h" -+# elif defined(__WXGTK__) && defined(HAVE_GTK) -+# include "gtk/FileDialogPrivate.h" -+# else -+# include "generic/FileDialogPrivate.h" -+# endif -+#else // wx3.0 -+# include "wx30/FileDialogPrivate.h" - #endif - - ///////////////////////////////////////////////////////////////////////////// -@@ -55,11 +59,11 @@ - //---------------------------------------------------------------------------- - - 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, ---- /dev/null -+++ b/lib-src/FileDialog/wx30/FileDialogPrivate.cpp -@@ -0,0 +1,61 @@ -+#include -+#ifndef WX_PRECOMP -+# include -+#endif -+ -+#include "../FileDialog.h" -+ -+#include -+ -+#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()); -+} -+ -+ ---- /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 -+ ---- a/src/AudacityApp.cpp -+++ b/src/AudacityApp.cpp -@@ -1324,7 +1324,7 @@ - } - - 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)) { ---- a/src/AudioIO.cpp -+++ b/src/AudioIO.cpp -@@ -561,7 +561,7 @@ - wxString errStr = _("Could not find any audio devices.\n"); - errStr += _("You will not be able to play or record audio.\n\n"); - wxString paErrStr = LAT1CTOWX(Pa_GetErrorText(err)); -- if (paErrStr) -+ if (!paErrStr.IsEmpty()) - errStr += _("Error: ")+paErrStr; - // XXX: we are in libaudacity, popping up dialogs not allowed! A - // long-term solution will probably involve exceptions ---- 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, ---- a/src/LyricsWindow.cpp -+++ b/src/LyricsWindow.cpp -@@ -68,9 +68,9 @@ - // 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 ---- a/src/Menus.cpp -+++ b/src/Menus.cpp -@@ -2403,7 +2403,7 @@ - // 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() ---- a/src/MixerBoard.cpp -+++ b/src/MixerBoard.cpp -@@ -1723,9 +1723,9 @@ - // 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 ---- a/src/PitchName.cpp -+++ b/src/PitchName.cpp -@@ -20,6 +20,10 @@ - #include - #include - -+#ifndef WX_PRECOMP -+# include "wx/wx.h" -+#endif -+ - #include "PitchName.h" - - ---- a/src/PlatformCompatibility.cpp -+++ b/src/PlatformCompatibility.cpp -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - - #include "AudacityApp.h" - #include "PlatformCompatibility.h" -@@ -37,7 +38,11 @@ - static wxString path; - - if (!found) { -+#if wxMAJOR_VERSION < 3 - wxStandardPaths std; -+#else -+ wxStandardPaths std(wxStandardPaths::Get()); -+#endif - - path = std.GetExecutablePath(); - -@@ -65,4 +70,4 @@ - #else - return filePath; - #endif --} -\ No newline at end of file -+} ---- a/src/Profiler.cpp -+++ b/src/Profiler.cpp -@@ -22,6 +22,9 @@ - - #include "Profiler.h" - -+#include -+#include -+ - ///write to a profile at the end of the test. - Profiler::~Profiler() - { -@@ -165,4 +168,3 @@ - else - return 0.0; - } -- -\ No newline at end of file ---- a/src/Project.cpp -+++ b/src/Project.cpp -@@ -79,7 +79,6 @@ - #include - #include - #include --#include - #include - - #include // this allows for creation of wxObjArray -@@ -702,6 +701,7 @@ - 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) -@@ -758,7 +758,8 @@ - mLastEffect(NULL), - mLastEffectType(0), - mTimerRecordCanceled(false), -- mMenuClose(false) -+ mMenuClose(false), -+ mShownOnce(false) - { - int widths[] = {-2, -1}; - mStatusBar = CreateStatusBar(2); -@@ -981,9 +982,9 @@ - // 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)); -@@ -1350,6 +1351,12 @@ - - 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; -@@ -1561,9 +1568,26 @@ - - 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(); - } - -@@ -1675,7 +1699,7 @@ - wxCommandEvent e(EVT_CAPTURE_KEY); - e.SetEventObject(&event); - -- if (w->ProcessEvent(e)) { -+ if (w->GetEventHandler()->ProcessEvent(e)) { - return false; - } - } ---- a/src/Sequence.cpp -+++ b/src/Sequence.cpp -@@ -1035,7 +1035,7 @@ - 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); - } - ---- a/src/Tags.cpp -+++ b/src/Tags.cpp -@@ -482,7 +482,7 @@ - - while (*attrs) { - wxString attr = *attrs++; -- if (!*attr) -+ if (attr.IsEmpty()) - break; - wxString value = *attrs++; - ---- a/src/TrackPanel.cpp -+++ b/src/TrackPanel.cpp -@@ -5097,7 +5097,7 @@ - // 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... -@@ -5534,7 +5534,7 @@ - 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; -@@ -8251,7 +8251,7 @@ - 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; ---- 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, ---- a/src/LabelTrack.cpp -+++ b/src/LabelTrack.cpp -@@ -957,7 +957,7 @@ - - // 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 @@ - - // 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 @@ - // 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 @@ - /// @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 - ---- a/src/UploadDialog.cpp -+++ b/src/UploadDialog.cpp -@@ -113,12 +113,12 @@ - icons->Add(*mp3Icon); - icons->Add(*upIcon); - -- wxFlexGridSizer *topSizer = new wxFlexGridSizer(2, 1); -+ wxFlexGridSizer *topSizer = new wxFlexGridSizer(2, 1, 0); - wxStaticBoxSizer *connectionBox = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("FTP Connection"), wxDefaultPosition, wxDefaultSize, 0, wxT("")), wxVERTICAL); - wxStaticBoxSizer *fileBox = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("File Manager"), wxDefaultPosition, wxDefaultSize, 0, wxT("")), wxVERTICAL); - wxStaticBoxSizer *siteBox = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Site Manager"), wxDefaultPosition, wxDefaultSize, 0, wxT("")), wxVERTICAL); - -- wxFlexGridSizer *connectionSizer = new wxFlexGridSizer(2, 4); -+ wxFlexGridSizer *connectionSizer = new wxFlexGridSizer(2, 4, 0); - wxBoxSizer *leftSizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *rightSizer = new wxBoxSizer(wxVERTICAL); - wxBoxSizer *fileButtonSizer = new wxBoxSizer(wxHORIZONTAL); ---- a/src/commands/ScriptCommandRelay.cpp -+++ b/src/commands/ScriptCommandRelay.cpp -@@ -57,7 +57,7 @@ - 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 ---- a/src/effects/BassTreble.cpp -+++ b/src/effects/BassTreble.cpp -@@ -35,6 +35,7 @@ - #include - #include - #include -+#include - - // Used to communicate the type of the filter. - static const int bassType = 0; //Low Shelf ---- a/src/effects/Compressor.cpp -+++ b/src/effects/Compressor.cpp -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - #include - - #include "Compressor.h" ---- a/src/effects/nyquist/Nyquist.cpp -+++ b/src/effects/nyquist/Nyquist.cpp -@@ -701,7 +701,7 @@ - // 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); ---- a/src/import/ImportRaw.cpp -+++ b/src/import/ImportRaw.cpp -@@ -324,7 +324,7 @@ - - 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; ---- a/src/ondemand/ODManager.cpp -+++ b/src/ondemand/ODManager.cpp -@@ -311,7 +311,7 @@ - AudacityProject::AllProjectsDeleteLock(); - AudacityProject* proj = GetActiveProject(); - if(proj) -- proj->AddPendingEvent( event ); -+ proj->GetEventHandler()->AddPendingEvent( event ); - AudacityProject::AllProjectsDeleteUnlock(); - } - mTerminateMutex.Lock(); ---- a/src/ondemand/ODTask.cpp -+++ b/src/ondemand/ODTask.cpp -@@ -158,7 +158,7 @@ - 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; ---- a/src/prefs/KeyConfigPrefs.cpp -+++ b/src/prefs/KeyConfigPrefs.cpp -@@ -992,7 +992,7 @@ - nevent.SetDirection(!e.ShiftDown()); - nevent.SetEventObject(t); - nevent.SetCurrentFocus(t); -- t->GetParent()->ProcessEvent(nevent); -+ t->GetParent()->GetEventHandler()->ProcessEvent(nevent); - - return; - } ---- a/src/toolbars/DeviceToolBar.cpp -+++ b/src/toolbars/DeviceToolBar.cpp -@@ -71,9 +71,7 @@ - { - 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 @@ - name = _("2 (Stereo) Input Channels"); - } - else { -- name = wxString::Format(wxT("%d"), j + 1); -+ name = wxString::Format(wxT("%lld"), j + 1); - } - mInputChannels->Append(name); - } ---- a/src/toolbars/ToolsToolBar.cpp -+++ b/src/toolbars/ToolsToolBar.cpp -@@ -59,7 +59,7 @@ - - // 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"), ---- a/src/widgets/ASlider.cpp -+++ b/src/widgets/ASlider.cpp -@@ -1191,7 +1191,7 @@ - nevent.SetDirection( !event.ShiftDown() ); - nevent.SetEventObject( mParent ); - nevent.SetCurrentFocus( mParent ); -- mParent->GetParent()->ProcessEvent( nevent ); -+ mParent->GetParent()->GetEventHandler()->ProcessEvent( nevent ); - } - break; - -@@ -1203,7 +1203,7 @@ - if (def && def->IsEnabled()) { - wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, - def->GetId()); -- mParent->ProcessEvent(cevent); -+ mParent->GetEventHandler()->ProcessEvent(cevent); - } - } - -@@ -1228,7 +1228,7 @@ - int intValue = (int)( ( mCurrentValue - mMinValue ) * 1000.0f / - ( mMaxValue - mMinValue ) ); - e.SetInt( intValue ); -- mParent->ProcessEvent( e ); -+ mParent->GetEventHandler()->ProcessEvent( e ); - } - - int LWSlider::ValueToPosition(float val) ---- a/src/widgets/ExpandingToolBar.cpp -+++ b/src/widgets/ExpandingToolBar.cpp -@@ -72,6 +72,7 @@ - #include - #endif - -+#include - #include - #include - #include ---- a/src/widgets/Grabber.cpp -+++ b/src/widgets/Grabber.cpp -@@ -89,7 +89,7 @@ - e.SetEventObject(parent); - - // Queue the event -- parent->AddPendingEvent(e); -+ parent->GetEventHandler()->AddPendingEvent(e); - } - - // ---- a/src/widgets/Grid.cpp -+++ b/src/widgets/Grid.cpp -@@ -77,7 +77,8 @@ - { - wxGridTableBase *table = grid->GetTable(); - -- table->GetValue(row, col).ToDouble(&mOld); -+ mOldString = table->GetValue(row, col); -+ mOldString.ToDouble(&mOld); - - GetTimeCtrl()->SetTimeValue(mOld); - GetTimeCtrl()->EnableMenu(); -@@ -87,16 +88,32 @@ - - 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); -@@ -303,8 +320,19 @@ - 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(); - -@@ -315,12 +343,20 @@ - } - - wxString val = mChoices[sel]; -- if (val == mOld) -- return false; -+ bool changed = val != mOld; -+ -+ if (changed) -+ { -+ mValueAsString = val; -+ *newval = val; -+ } - -- grid->GetTable()->SetValue(row, col, val); -+ return changed; -+} - -- return true; -+void ChoiceEditor::ApplyEdit(int row, int col, wxGrid *grid) -+{ -+ grid->GetTable()->SetValue(row, col, mValueAsString); - } - - void ChoiceEditor::Reset() -@@ -499,7 +535,7 @@ - if (def && def->IsEnabled()) { - wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, - def->GetId()); -- GetParent()->ProcessEvent(cevent); -+ GetParent()->GetEventHandler()->ProcessEvent(cevent); - } - } - else { ---- a/src/widgets/Grid.h -+++ b/src/widgets/Grid.h -@@ -52,8 +52,13 @@ - 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 @@ - 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 @@ - 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 @@ - - wxArrayString mChoices; - wxString mOld; -+ wxString mValueAsString; - }; - - // ---------------------------------------------------------------------------- ---- a/src/widgets/ImageRoll.cpp -+++ b/src/widgets/ImageRoll.cpp -@@ -299,7 +299,7 @@ - } - - 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::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 @@ - mImageRoll.GetMaxSize()); - } - --void ImageRollPanel::SetLogicalFunction(int func) -+void ImageRollPanel::SetLogicalFunction(wxRasterOperationMode func) - { - mLogicalFunction = func; - } ---- a/src/widgets/ImageRoll.h -+++ b/src/widgets/ImageRoll.h -@@ -12,9 +12,18 @@ - #ifndef __AUDACITY_IMAGE_ROLL__ - #define __AUDACITY_IMAGE_ROLL__ - -+#include -+#include - #include - #include - #include -+#include -+ -+ -+#if wxMAJOR_VERSION < 3 -+# define wxRasterOperationMode int -+#endif -+ - - WX_DECLARE_OBJARRAY(wxBitmap, BitmapArray); - WX_DECLARE_OBJARRAY(wxImage, ImageArray); -@@ -40,7 +49,7 @@ - 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 @@ - 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 @@ - 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 @@ - protected: - ImageRoll mImageRoll; - -- int mLogicalFunction; -+ wxRasterOperationMode mLogicalFunction; - - DECLARE_EVENT_TABLE(); - ---- a/src/widgets/TimeTextCtrl.cpp -+++ b/src/widgets/TimeTextCtrl.cpp -@@ -168,6 +168,7 @@ - - #include - -+#include - #include - #include - #include -@@ -1160,7 +1161,7 @@ - nevent.SetDirection(!event.ShiftDown()); - nevent.SetEventObject(parent); - nevent.SetCurrentFocus(parent); -- GetParent()->ProcessEvent(nevent); -+ GetParent()->GetEventHandler()->ProcessEvent(nevent); - } - - else if (keyCode == WXK_RETURN || keyCode == WXK_NUMPAD_ENTER) { -@@ -1169,7 +1170,7 @@ - if (def && def->IsEnabled()) { - wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, - def->GetId()); -- GetParent()->ProcessEvent(cevent); -+ GetParent()->GetEventHandler()->ProcessEvent(cevent); - } - } - ---- a/src/xml/XMLWriter.cpp -+++ b/src/xml/XMLWriter.cpp -@@ -246,7 +246,7 @@ - mHasKids[0] = true; - } - -- Write(value.c_str()); -+ Write(value); - } - - void XMLWriter::WriteSubTree(const wxChar *value) ---- a/src/widgets/FileHistory.cpp -+++ b/src/widgets/FileHistory.cpp -@@ -142,7 +142,7 @@ - // 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%02lld"), i), mHistory[n--]); - } - - config.SetPath(wxT("..")); ---- a/src/effects/ladspa/LoadLadspa.cpp -+++ b/src/effects/ladspa/LoadLadspa.cpp -@@ -147,7 +147,7 @@ - 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 categories; ---- a/src/import/Import.cpp -+++ b/src/import/Import.cpp -@@ -288,7 +288,7 @@ - more to delete.*/ - i = this->mExtImportItems->Count(); - do { -- name.Printf (wxT("/ExtImportItems/Item%d"), i); -+ name.Printf (wxT("/ExtImportItems/Item%lld"), i); - // No item to delete? Then it's time to finish. - if (!gPrefs->Read(name, &val)) - break; ---- a/src/effects/ladspa/LadspaEffect.cpp -+++ b/src/effects/ladspa/LadspaEffect.cpp -@@ -518,16 +518,14 @@ - 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]; ---- a/src/prefs/PrefsDialog.cpp -+++ b/src/prefs/PrefsDialog.cpp -@@ -185,8 +185,6 @@ - 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; - } ---- a/src/prefs/QualityPrefs.cpp -+++ b/src/prefs/QualityPrefs.cpp -@@ -162,13 +162,13 @@ - { - 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:"), ---- a/src/Project.h -+++ b/src/Project.h -@@ -253,6 +253,7 @@ - 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); -@@ -487,6 +488,8 @@ - // dialog for missing alias warnings - wxDialog *mAliasMissingWarningDialog; - -+ bool mShownOnce; -+ - public: - ToolManager *mToolManager; - bool mShowSplashScreen;