From 53947cedc990919344082bfb4c7b0259cef09f1d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sun, 31 Aug 2014 00:34:55 +0200 Subject: [PATCH] - rel 4; use debian patch instead of our own creation --- audacity-wx.patch | 664 -------------------- audacity.spec | 12 +- wx-fd-constants.patch | 73 +++ wx30.patch | 1329 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1411 insertions(+), 667 deletions(-) delete mode 100644 audacity-wx.patch create mode 100644 wx-fd-constants.patch create mode 100644 wx30.patch diff --git a/audacity-wx.patch b/audacity-wx.patch deleted file mode 100644 index d29b98e..0000000 --- a/audacity-wx.patch +++ /dev/null @@ -1,664 +0,0 @@ ---- audacity-src-2.0.5/configure.in~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/configure.in 2014-01-15 14:33:23.736199148 +0100 -@@ -294,7 +294,7 @@ - AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x]) - - case "${wx_version}" in -- 2.8.*) -+ 2.8.*|3.0.*) - echo "Great, you're using wxWidgets ${wx_version}!" - ;; - *) -@@ -311,7 +311,7 @@ - ac_configure_args="$ac_configure_args --with-wx-config=\"$WX_CONFIG\"" - - dnl Gather wx arguments --LIBS="$LIBS `$WX_CONFIG $wxconfigargs --libs`" -+LIBS="$LIBS `$WX_CONFIG $wxconfigargs --libs` -lwx_x11univ_core-3.0" - CXXFLAGS="$CXXFLAGS `$WX_CONFIG $wxconfigargs --cxxflags`" - - dnl----------------------------------------------------------------- ---- audacity-src-2.0.5/lib-src/lib-widget-extra/configure.in~ 2013-10-19 09:31:34.000000000 +0200 -+++ audacity-src-2.0.5/lib-src/lib-widget-extra/configure.in 2014-01-15 14:35:09.519583138 +0100 -@@ -142,7 +142,7 @@ - AC_MSG_NOTICE([Checking that the chosen version of wxWidgets is 2.8.x]) - - case "${wx_version}" in -- 2.8.*) -+ 2.8.*|3.0.*) - echo "Great, you're using wxWidgets ${wx_version}!" - ;; - *) ---- audacity-src-2.0.5/lib-src/FileDialog/FileDialog.h~ 2013-10-19 09:31:33.000000000 +0200 -+++ audacity-src-2.0.5/lib-src/FileDialog/FileDialog.h 2014-01-15 14:48:35.805376488 +0100 -@@ -55,11 +55,11 @@ - //---------------------------------------------------------------------------- - - wxString --FileSelector(const wxChar *message = wxFileSelectorPromptStr, -+FileSelector(const wxChar *message = (const wxChar *)wxFileSelectorPromptStr, - const wxChar *default_path = NULL, - const wxChar *default_filename = NULL, - const wxChar *default_extension = NULL, -- const wxChar *wildcard = wxFileSelectorDefaultWildcardStr, -+ const wxChar *wildcard = (const wxChar *)wxFileSelectorDefaultWildcardStr, - int flags = 0, - wxWindow *parent = NULL, - wxString label = wxEmptyString, ---- audacity-src-2.0.5/lib-src/FileDialog/gtk/FileDialogPrivate.cpp 2014-01-15 18:42:47.255235243 +0100 -+++ audacity-src-2.0.5/lib-src/FileDialog/gtk/FileDialogPrivate.cpp.org 2014-01-15 18:42:42.785091188 +0100 -@@ -18,13 +18,17 @@ - - #include "../FileDialog.h" - --#if defined(__WXGTK24__) && (!defined(__WXGPE__)) -+ -+ -+ -+#if 1 - - #include - #include "private.h" - - #include // chdir - -+#include "wx/defs.h" - #include "wx/intl.h" - #include "wx/filename.h" // wxFilename - #include "wx/tokenzr.h" // wxStringTokenizer -@@ -299,7 +303,7 @@ - EndModal(wxID_OK); - } else - #endif -- wxGenericFileDialog::OnListOk( event ); -+ wxGenericFileDialog::OnOk( event ); - } - - int FileDialog::ShowModal() ---- audacity-src-2.0.5/src/Sequence.cpp.org 2014-01-15 18:46:25.845608473 +0100 -+++ audacity-src-2.0.5/src/Sequence.cpp 2014-01-15 18:54:18.464160530 +0100 -@@ -1034,8 +1034,8 @@ - _("Sequence has block file with length %s > mMaxSamples %s.\nTruncating to mMaxSamples."), - 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); -+ wxMessageBox(sMsg, _("Warning - Length in Writing Sequence"), wxICON_EXCLAMATION | wxOK); -+ wxLogWarning(sMsg); - bb->f->SetLength(mMaxSamples); - } - ---- audacity-src-2.0.5/src/AudacityApp.cpp.org 2014-01-15 18:55:56.667324154 +0100 -+++ audacity-src-2.0.5/src/AudacityApp.cpp 2014-01-15 19:35:30.704368875 +0100 -@@ -1324,7 +1324,7 @@ - } - - if (option < argc - 1 && -- argv[option + 1] && -+ !argv[option + 1].IsEmpty() && - !wxString(wxT("-blocksize")).CmpNoCase(argv[option])) { - long theBlockSize; - if (wxString(argv[option + 1]).ToLong(&theBlockSize)) { ---- audacity-src-2.0.5/src/AudioIO.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/AudioIO.cpp 2014-01-15 19:36:45.000091144 +0100 -@@ -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 != wxEmptyString) - errStr += _("Error: ")+paErrStr; - // XXX: we are in libaudacity, popping up dialogs not allowed! A - // long-term solution will probably involve exceptions ---- audacity-src-2.0.5/src/CaptureEvents.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/CaptureEvents.cpp 2014-01-15 19:45:04.053070193 +0100 -@@ -76,8 +76,6 @@ - // temporarily replace the global GDK event handler with our function - gdk_event_handler_set((GdkEventFunc)main_do_event, &queue, NULL); - -- // temporarily suspend idle callbacks -- wxTheApp->SuspendIdleCallback(); - } - - CaptureEvents::~CaptureEvents() ---- audacity-src-2.0.5/src/CaptureEvents.cpp~ 2014-01-15 19:45:04.000000000 +0100 -+++ audacity-src-2.0.5/src/CaptureEvents.cpp 2014-01-15 19:45:45.754464727 +0100 -@@ -59,9 +59,6 @@ - break; - } - -- // don't allow idle callbacks while we're active -- wxTheApp->SuspendIdleCallback(); -- - return; - } - ---- audacity-src-2.0.5/src/Menus.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/Menus.cpp 2014-01-15 19:55:08.146305162 +0100 -@@ -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() ---- audacity-src-2.0.5/src/PitchName.cpp.org 2014-01-15 19:58:21.012574229 +0100 -+++ audacity-src-2.0.5/src/PitchName.cpp 2014-01-15 20:07:39.509684788 +0100 -@@ -20,6 +20,12 @@ - #include - #include - -+#include "wx/defs.h" -+#include "wx/dlimpexp.h" -+#include "wx/wxcrtbase.h" -+#include "wx/wxcrtvararg.h" -+#include "wx/wxcrt.h" -+ - #include "PitchName.h" - - ---- audacity-src-2.0.5/src/PlatformCompatibility.cpp.org 2014-01-15 20:31:30.447274594 +0100 -+++ audacity-src-2.0.5/src/PlatformCompatibility.cpp 2014-01-15 20:31:50.037920878 +0100 -@@ -37,9 +37,8 @@ - static wxString path; - - if (!found) { -- wxStandardPaths std; - -- path = std.GetExecutablePath(); -+ path = wxStandardPaths::Get().GetExecutablePath(); - - found = true; - } -@@ -65,4 +64,4 @@ - #else - return filePath; - #endif --} -\ Brak znaku nowej linii na końcu pliku -+} ---- audacity-src-2.0.5/src/Profiler.cpp~ 2013-10-19 09:31:49.000000000 +0200 -+++ audacity-src-2.0.5/src/Profiler.cpp 2014-01-15 20:32:39.369547031 +0100 -@@ -20,6 +20,9 @@ - - *//*******************************************************************/ - -+#include -+#include -+ - #include "Profiler.h" - - ///write to a profile at the end of the test. -@@ -165,4 +168,4 @@ - else - return 0.0; - } -- -\ Brak znaku nowej linii na końcu pliku -+ ---- audacity-src-2.0.5/src/Project.cpp~ 2014-01-15 20:34:38.000000000 +0100 -+++ audacity-src-2.0.5/src/Project.cpp 2014-01-15 20:35:31.352033096 +0100 -@@ -1675,7 +1675,7 @@ - wxCommandEvent e(EVT_CAPTURE_KEY); - e.SetEventObject(&event); - -- if (w->ProcessEvent(e)) { -+ if (w->ProcessWindowEvent(e)) { - return false; - } - } ---- audacity-src-2.0.5/src/TrackPanel.cpp.org 2014-01-15 20:40:41.349305322 +0100 -+++ audacity-src-2.0.5/src/TrackPanel.cpp 2014-01-15 20:44:35.530549708 +0100 -@@ -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((wxMouseButton)3) || 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; ---- audacity-src-2.0.5/src/UploadDialog.cpp.org 2014-01-15 21:26:09.207158042 +0100 -+++ audacity-src-2.0.5/src/UploadDialog.cpp 2014-01-15 21:36:01.093744587 +0100 -@@ -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); ---- audacity-src-2.0.5/src/commands/ScriptCommandRelay.cpp~ 2013-10-19 09:31:52.000000000 +0200 -+++ audacity-src-2.0.5/src/commands/ScriptCommandRelay.cpp 2014-01-15 21:38:44.739235286 +0100 -@@ -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 ---- audacity-src-2.0.5/src/effects/BassTreble.cpp~ 2014-01-15 21:52:07.000000000 +0100 -+++ audacity-src-2.0.5/src/effects/BassTreble.cpp 2014-01-15 21:54:22.387472634 +0100 -@@ -35,6 +35,7 @@ - #include - #include - #include -+#include - - // Used to communicate the type of the filter. - static const int bassType = 0; //Low Shelf ---- audacity-src-2.0.5/src/effects/Compressor.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/effects/Compressor.cpp 2014-01-15 21:56:28.328381464 +0100 -@@ -39,6 +39,7 @@ - #include - #include - #include -+#include - - #include "Compressor.h" - #include "../ShuttleGui.h" ---- audacity-src-2.0.5/src/import/ImportRaw.cpp~ 2013-10-19 09:31:52.000000000 +0200 -+++ audacity-src-2.0.5/src/import/ImportRaw.cpp 2014-01-15 22:08:33.731103084 +0100 -@@ -324,7 +324,7 @@ - - if (sf_format_check(&info)) { - mEncodingSubtype[mNumEncodings] = subtype; -- encodings.Add(LAT1CTOWX(sf_encoding_index_name(i))); -+ encodings.Add(wxString (sf_encoding_index_name(i).wc_str(), wxConvISO8859_1)); - - if ((mEncoding & SF_FORMAT_SUBMASK) == subtype) - selection = mNumEncodings; ---- audacity-src-2.0.5/src/ondemand/ODManager.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/ondemand/ODManager.cpp 2014-01-15 22:09:57.850563760 +0100 -@@ -311,7 +311,7 @@ - AudacityProject::AllProjectsDeleteLock(); - AudacityProject* proj = GetActiveProject(); - if(proj) -- proj->AddPendingEvent( event ); -+ proj->GetEventHandler()->AddPendingEvent( event ); - AudacityProject::AllProjectsDeleteUnlock(); - } - mTerminateMutex.Lock(); ---- audacity-src-2.0.5/src/ondemand/ODTask.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/ondemand/ODTask.cpp 2014-01-15 22:10:33.568417325 +0100 -@@ -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; ---- audacity-src-2.0.5/src/prefs/KeyConfigPrefs.cpp~ 2013-10-19 09:31:49.000000000 +0200 -+++ audacity-src-2.0.5/src/prefs/KeyConfigPrefs.cpp 2014-01-15 22:11:54.407771374 +0100 -@@ -992,7 +992,7 @@ - nevent.SetDirection(!e.ShiftDown()); - nevent.SetEventObject(t); - nevent.SetCurrentFocus(t); -- t->GetParent()->ProcessEvent(nevent); -+ t->GetParent()->GetEventHandler()->ProcessEvent(nevent); - - return; - } - ---- audacity-src-2.0.5/src/Tags.cpp~ 2013-10-19 09:31:52.000000000 +0200 -+++ audacity-src-2.0.5/src/Tags.cpp 2014-01-18 21:43:27.834969194 +0100 -@@ -482,7 +482,7 @@ - - while (*attrs) { - wxString attr = *attrs++; -- if (!*attr) -+ if (attr.IsEmpty()) - break; - wxString value = *attrs++; - ---- audacity-src-2.0.5/src/toolbars/DeviceToolBar.cpp~ 2013-10-19 09:31:49.000000000 +0200 -+++ audacity-src-2.0.5/src/toolbars/DeviceToolBar.cpp 2014-01-18 21:53:51.332343784 +0100 -@@ -70,10 +70,6 @@ - void DeviceToolBar::Create(wxWindow *parent) - { - ToolBar::Create(parent); -- -- // Simulate a size event to set initial meter placement/size -- wxSizeEvent dummy; -- OnSize(dummy); - } - - void DeviceToolBar::RecreateTipWindows() ---- audacity-src-2.0.5/src/toolbars/ToolsToolBar.cpp~ 2013-10-19 09:31:49.000000000 +0200 -+++ audacity-src-2.0.5/src/toolbars/ToolsToolBar.cpp 2014-01-18 21:55:38.645899664 +0100 -@@ -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 char * 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"), -@@ -71,7 +71,7 @@ - wxTRANSLATE("Left=Zoom In, Right=Zoom Out, Middle=Normal"), - #endif - wxTRANSLATE("Click and drag to move a track in time"), -- wxT("") // multi-mode tool -+ "" // multi-mode tool - }; - - //////////////////////////////////////////////////////////// ---- audacity-src-2.0.5/src/widgets/ImageRoll.h~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/ImageRoll.h 2014-01-18 21:59:51.830959923 +0100 -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - - WX_DECLARE_OBJARRAY(wxBitmap, BitmapArray); - WX_DECLARE_OBJARRAY(wxImage, ImageArray); -@@ -48,7 +49,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); - ---- audacity-src-2.0.5/src/widgets/ImageRoll.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/ImageRoll.cpp 2014-01-18 22:00:44.529374296 +0100 -@@ -100,6 +100,7 @@ - #include - #include - #include -+#include - - WX_DEFINE_OBJARRAY(BitmapArray); - WX_DEFINE_OBJARRAY(ImageArray); -@@ -299,7 +300,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); ---- audacity-src-2.0.5/src/widgets/ASlider.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/ASlider.cpp 2014-01-18 22:02:45.678817685 +0100 -@@ -1191,7 +1191,7 @@ - nevent.SetDirection( !event.ShiftDown() ); - nevent.SetEventObject( mParent ); - nevent.SetCurrentFocus( mParent ); -- mParent->GetParent()->ProcessEvent( nevent ); -+ mParent->GetParent()->ProcessWindowEvent( nevent ); - } - break; - -@@ -1203,7 +1203,7 @@ - if (def && def->IsEnabled()) { - wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, - def->GetId()); -- mParent->ProcessEvent(cevent); -+ mParent->ProcessWindowEvent(cevent); - } - } - -@@ -1228,7 +1228,7 @@ - int intValue = (int)( ( mCurrentValue - mMinValue ) * 1000.0f / - ( mMaxValue - mMinValue ) ); - e.SetInt( intValue ); -- mParent->ProcessEvent( e ); -+ mParent->ProcessWindowEvent( e ); - } - - int LWSlider::ValueToPosition(float val) ---- audacity-src-2.0.5/src/widgets/ExpandingToolBar.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/ExpandingToolBar.cpp 2014-01-18 22:11:30.136223627 +0100 -@@ -77,6 +77,7 @@ - #include - #include - #include -+#include - - #include "ExpandingToolBar.h" - #include "AButton.h" ---- audacity-src-2.0.5/src/widgets/Grabber.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/Grabber.cpp 2014-01-18 22:12:27.131449284 +0100 -@@ -89,7 +89,7 @@ - e.SetEventObject(parent); - - // Queue the event -- parent->AddPendingEvent(e); -+ parent->GetEventHandler()->AddPendingEvent(e); - } - - // ---- audacity-src-2.0.5/src/widgets/Grid.cpp.org 2014-01-18 22:14:27.708786335 +0100 -+++ audacity-src-2.0.5/src/widgets/Grid.cpp 2014-01-18 22:16:29.522831589 +0100 -@@ -26,16 +26,18 @@ - #include "Grid.h" - #include "TimeTextCtrl.h" - --TimeEditor::TimeEditor() -+TimeEditor::TimeEditor() : -+ mFormat(wxT("seconds")), -+ mRate(44100), -+ mOld(0.0) - { -- TimeEditor(wxT("seconds"), 44100); - } - --TimeEditor::TimeEditor(const wxString &format, double rate) -+TimeEditor::TimeEditor(const wxString &format, double rate) : -+ mFormat(format), -+ mRate(rate), -+ mOld(0.0) - { -- mFormat = format; -- mRate = rate; -- mOld = 0.0; - } - - TimeEditor::~TimeEditor() -@@ -499,7 +501,7 @@ - if (def && def->IsEnabled()) { - wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, - def->GetId()); -- GetParent()->ProcessEvent(cevent); -+ GetParent()->ProcessWindowEvent(cevent); - } - } - else { ---- audacity-src-2.0.5/src/widgets/Grid.h 2014-01-18 22:24:05.184633440 +0100 -+++ audacity-src-2.0.5/src/widgets/Grid.h.org 2014-01-18 22:21:44.749968295 +0100 -@@ -53,6 +53,9 @@ - - void BeginEdit(int row, int col, wxGrid *grid); - bool EndEdit(int row, int col, wxGrid *grid); -+ bool EndEdit(int WXUNUSED(row), int WXUNUSED(col), const wxGrid * WXUNUSED(grid), -+ const wxString& WXUNUSED(oldval), wxString * WXUNUSED(newval)) {return false;}; -+ void ApplyEdit(int WXUNUSED(row), int WXUNUSED(col), wxGrid* WXUNUSED(grid)) {}; - - void Reset(); - -@@ -128,6 +125,9 @@ - - void BeginEdit(int row, int col, wxGrid *grid); - bool EndEdit(int row, int col, wxGrid *grid); -+ bool EndEdit(int WXUNUSED(row), int WXUNUSED(col), const wxGrid * WXUNUSED(grid), -+ const wxString& WXUNUSED(oldval), wxString * WXUNUSED(newval)) {return false;}; -+ void ApplyEdit(int WXUNUSED(row), int WXUNUSED(col), wxGrid* WXUNUSED(grid)) {}; - - void Reset(); - ---- audacity-src-2.0.5/src/widgets/TimeTextCtrl.cpp 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/widgets/TimeTextCtrl.cpp 2014-01-18 22:29:03.714552995 +0100 -@@ -176,6 +176,7 @@ - #include - #include - #include -+#include - - #ifdef _DEBUG - #ifdef _MSC_VER -@@ -425,7 +426,7 @@ - { - wxCommandEvent e(EVT_RELEASE_KEYBOARD); - e.SetEventObject(this); -- GetParent()->GetEventHandler()->ProcessEvent(e); -+ GetParent()->ProcessWindowEvent(e); - - if (mBackgroundBitmap) - delete mBackgroundBitmap; -@@ -1044,7 +1045,7 @@ - e.SetEventType(EVT_RELEASE_KEYBOARD); - } - e.SetEventObject(this); -- GetParent()->GetEventHandler()->ProcessEvent(e); -+ GetParent()->ProcessWindowEvent(e); - - Refresh(false); - } -@@ -1160,7 +1161,7 @@ - nevent.SetDirection(!event.ShiftDown()); - nevent.SetEventObject(parent); - nevent.SetCurrentFocus(parent); -- GetParent()->ProcessEvent(nevent); -+ GetParent()->ProcessWindowEvent(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()->ProcessWindowEvent(cevent); - } - } - -@@ -1218,7 +1219,7 @@ - { - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, GetId()); - event.SetEventObject(this); -- GetEventHandler()->ProcessEvent(event); -+ ProcessWindowEvent(event); - - #if wxUSE_ACCESSIBILITY - GetAccessible()->NotifyEvent(wxACC_EVENT_OBJECT_NAMECHANGE, ---- audacity-src-2.0.5/src/xml/XMLWriter.cpp~ 2013-10-19 09:31:48.000000000 +0200 -+++ audacity-src-2.0.5/src/xml/XMLWriter.cpp 2014-01-18 22:31:17.405663293 +0100 -@@ -246,7 +246,7 @@ - mHasKids[0] = true; - } - -- Write(value.c_str()); -+ Write(value); - } - - void XMLWriter::WriteSubTree(const wxChar *value) ---- audacity-src-2.0.5/src/effects/nyquist/Nyquist.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/effects/nyquist/Nyquist.cpp 2014-01-18 22:32:46.528625569 +0100 -@@ -701,7 +701,8 @@ - // 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")); -+ wxString C(wxT("C")); -+ wxSetlocale(LC_NUMERIC, C); - - nyx_init(); - nyx_set_os_callback(StaticOSCallback, (void *)this); ---- audacity-src-2.0.5/src/PitchName.cpp~ 2014-01-18 22:36:45.000000000 +0100 -+++ audacity-src-2.0.5/src/PitchName.cpp 2014-01-18 22:36:48.306661815 +0100 -@@ -20,6 +20,8 @@ - #include - #include - -+#include -+ - #include "PitchName.h" - - ---- audacity-src-2.0.5/src/LyricsWindow.cpp.org 2014-01-18 22:45:15.566855563 +0100 -+++ audacity-src-2.0.5/src/LyricsWindow.cpp 2014-01-19 00:21:21.443062502 +0100 -@@ -68,11 +68,10 @@ - // loads either the XPM or the windows resource, depending on the platform - #if !defined(__WXMAC__) && !defined(__WXX11__) - #ifdef __WXMSW__ -- wxIcon ic(wxICON(AudacityLogo)); -+ SetIcon(wxICON(AudacityLogo)); - #else -- wxIcon ic(wxICON(AudacityLogo48x48)); -+ SetIcon(wxICON(AudacityLogo48x48)); - #endif -- SetIcon(ic); - #endif - - wxPoint panelPos(0, 0); ---- audacity-src-2.0.5/src/MixerBoard.cpp~ 2013-10-19 09:31:50.000000000 +0200 -+++ audacity-src-2.0.5/src/MixerBoard.cpp 2014-01-19 00:22:04.117814479 +0100 -@@ -1723,11 +1723,10 @@ - // loads either the XPM or the windows resource, depending on the platform - #if !defined(__WXMAC__) && !defined(__WXX11__) - #ifdef __WXMSW__ -- wxIcon ic(wxICON(AudacityLogo)); -+ SetIcon(wxICON(AudacityLogo)); - #else -- wxIcon ic(wxICON(AudacityLogo48x48)); -+ SetIcon(wxICON(AudacityLogo48x48)); - #endif -- SetIcon(ic); - #endif - } - ---- audacity-src-2.0.5/src/Project.cpp~ 2014-01-18 22:40:12.000000000 +0100 -+++ audacity-src-2.0.5/src/Project.cpp 2014-01-19 00:23:07.386584398 +0100 -@@ -981,14 +981,14 @@ - // loads either the XPM or the windows resource, depending on the platform - #if !defined(__WXMAC__) && !defined(__WXX11__) - #if defined(__WXMSW__) -- wxIcon ic(wxICON(AudacityLogo)); -+ SetIcon(wxICON(AudacityLogo)); - #elif defined(__WXGTK__) -- wxIcon ic(wxICON(AudacityLogoAlpha)); -+ SetIcon(wxICON(AudacityLogoAlpha)); - #else - wxIcon ic; - ic.CopyFromBitmap(theTheme.Bitmap(bmpAudacityLogo48x48)); -+ SetIcon(ic); - #endif -- SetIcon(ic); - #endif - mIconized = false; - diff --git a/audacity.spec b/audacity.spec index 845f032..40e5e71 100644 --- a/audacity.spec +++ b/audacity.spec @@ -19,7 +19,7 @@ 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: 3 +Release: 4 License: GPL v2+ Group: X11/Applications/Sound #Source0Download: http://code.google.com/p/audacity/downloads/list @@ -33,7 +33,9 @@ Source3: %{name}-icon.png Patch0: %{name}-system-libs.patch Patch1: %{name}-opt.patch Patch2: %{name}-no-macos.patch -Patch3: %{name}-wx.patch +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=749659 +Patch3: wx-fd-constants.patch +Patch4: wx30.patch URL: http://audacity.sourceforge.net/ BuildRequires: alsa-lib-devel BuildRequires: autoconf >= 2.59 @@ -105,7 +107,8 @@ Audacity - это звуковой редактор, позволяющий ра %patch0 -p1 %patch1 -p1 %patch2 -p1 -%patch3 -p1 +%patch3 -p2 +%patch4 -p1 %{__sed} -i 's/libmp3lame.so/libmp3lame.so.0/g' locale/*.po @@ -115,6 +118,9 @@ cd lib-src/portmixer cd ../lib-widget-extra %{__aclocal} -I m4 %{__autoconf} +cd ../FileDialog +%{__aclocal} +%{__autoconf} cd ../portsmf %{__aclocal} -I autotools/m4 %{__autoconf} diff --git a/wx-fd-constants.patch b/wx-fd-constants.patch new file mode 100644 index 0000000..bb31e65 --- /dev/null +++ b/wx-fd-constants.patch @@ -0,0 +1,73 @@ +--- 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 new file mode 100644 index 0000000..b16bb89 --- /dev/null +++ b/wx30.patch @@ -0,0 +1,1329 @@ +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; -- 2.44.0