[SCM] Audacity debian packaging branch, master, updated. debian/1.3.7-3-52-ged594dc

diwic-guest at users.alioth.debian.org diwic-guest at users.alioth.debian.org
Wed Oct 21 18:15:29 UTC 2009


The following commit has been merged in the master branch:
commit ed594dce9990888c92617a1ca5287bebb4ceafeb
Author: David <audacity at epost.diwic.se>
Date:   Wed Oct 21 20:04:03 2009 +0200

    prevent crashes when undoing label track changes (picked from upstream CVS). (LP: #385538)

diff --git a/debian/patches/labeltrack-crash.patch b/debian/patches/labeltrack-crash.patch
new file mode 100644
index 0000000..76430b6
--- /dev/null
+++ b/debian/patches/labeltrack-crash.patch
@@ -0,0 +1,179 @@
+Description: Cherry-pick bug from upstream CVS that fixes crashes when
+undoing labeltrack changes.
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/385538
+Forwarded: not-needed
+Origin: upstream, http://audacity.cvs.sourceforge.net/viewvc/audacity/audacity-src/src/LabelTrack.cpp?r1=1.116&r2=1.117
+diff -Nur -x '*.orig' -x '*~' audacity-1.3.9/src/LabelTrack.cpp audacity-1.3.9.new/src/LabelTrack.cpp
+--- audacity-1.3.9/src/LabelTrack.cpp	2009-08-31 12:45:38.000000000 +0200
++++ audacity-1.3.9.new/src/LabelTrack.cpp	2009-10-17 05:02:14.976218354 +0200
+@@ -57,6 +57,97 @@
+ #include "Project.h"
+ #include "commands/CommandManager.h"
+ 
++#if defined(__WXGTK__)
++// 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,
++// so we have to work around it.
++//
++// This is done by pulling/merging in some code from wx29 and creating
++// the following class to capture events while accessing the clipboard
++// to prevent the asynchronous clipboard access from causing recursive
++// event processing.
++
++#include <wx/app.h>
++#include <wx/dynarray.h>
++
++#include <gtk/gtk.h>
++
++extern GtkWidget *wxGetRootWindow();
++
++static void main_do_event(GdkEvent *event, wxArrayPtrVoid *queue)
++{
++   switch (event->type)
++   {
++      case GDK_NOTHING:
++         // Ignore it
++      break;
++
++      case GDK_SELECTION_REQUEST:
++      case GDK_SELECTION_NOTIFY:
++      case GDK_SELECTION_CLEAR:
++#if GTK_CHECK_VERSION(2,6,0)
++      case GDK_OWNER_CHANGE:
++#endif
++         // process it now
++         gtk_main_do_event(event);
++      break;
++
++      default:
++         // process it later (but make a copy; the caller will free the event pointer)
++         queue->Add(gdk_event_copy(event));
++      break;
++   }
++
++   // don't allow idle callbacks while we're active
++   wxTheApp->SuspendIdleCallback();
++
++   return;
++}
++
++class CaptureEvents
++{
++ public:
++   CaptureEvents()
++   {
++#if wxUSE_LOG
++      // disable log flushing from here because a call to wxYield() shouldn't
++      // normally result in message boxes popping up &c
++      wxLog::Suspend();
++#endif
++
++      // 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();
++   }
++
++   virtual ~CaptureEvents()
++   {
++      gdk_event_handler_set((GdkEventFunc)gtk_main_do_event, NULL, NULL);
++   
++      // put all unprocessed GDK events back in the queue
++      GdkDisplay* disp = gtk_widget_get_display(wxGetRootWindow());
++      size_t cnt = queue.GetCount();
++      for (size_t i = 0; i < cnt; i++) {
++         GdkEvent* event = (GdkEvent*)queue[i];
++         // NOTE: gdk_display_put_event makes a copy of the event passed to it
++         gdk_display_put_event(disp, event);
++         gdk_event_free(event);
++      }
++
++#if wxUSE_LOG
++      // let the logs be flashed again
++      wxLog::Resume();
++#endif
++   }
++
++ private:
++   wxArrayPtrVoid queue;
++};
++#endif
++
+ wxFont LabelTrack::msFont;
+ 
+ // static member variables.
+@@ -74,13 +165,11 @@
+ 
+ int LabelTrack::mFontHeight=-1;
+ 
+-
+ LabelTrack *TrackFactory::NewLabelTrack()
+ {
+    return new LabelTrack(mDirManager);
+ }
+ 
+-
+ LabelTrack::LabelTrack(DirManager * projDirManager):
+    Track(projDirManager),
+    mbHitCenter(false),
+@@ -969,6 +1058,9 @@
+    
+    // copy data onto clipboard
+    if (wxTheClipboard->Open()) {
++#if defined(__WXGTK__)
++      CaptureEvents capture;
++#endif
+       wxTheClipboard->SetData(new wxTextDataObject(data));
+       wxTheClipboard->Close();
+    }
+@@ -1001,6 +1093,9 @@
+ 
+    // copy the data on clipboard
+    if (wxTheClipboard->Open()) {
++#if defined(__WXGTK__)
++      CaptureEvents capture;
++#endif
+       wxTheClipboard->SetData(new wxTextDataObject(data));
+       wxTheClipboard->Close();
+    }
+@@ -1021,10 +1116,13 @@
+    wxString right=wxT("");
+    
+    // if text data is available
+-   if (wxTheClipboard->IsSupported(wxDF_TEXT)) {
++   if (IsTextClipSupported()) {
+       if (wxTheClipboard->Open()) {
++#if defined(__WXGTK__)
++         CaptureEvents capture;
++#endif
+          wxTextDataObject data;
+-         wxTheClipboard->GetData( data );
++         wxTheClipboard->GetData(data);
+          wxTheClipboard->Close();
+          text = data.GetText();
+       }
+@@ -1077,6 +1175,10 @@
+ /// @return true if the text data is available in the clipboard, false otherwise
+ bool LabelTrack::IsTextClipSupported()
+ {
++#if defined(__WXGTK__)
++   CaptureEvents capture;
++#endif
++
+    return wxTheClipboard->IsSupported(wxDF_TEXT);
+ }
+ 
+diff -Nur -x '*.orig' -x '*~' audacity-1.3.9/src/LabelTrack.h audacity-1.3.9.new/src/LabelTrack.h
+--- audacity-1.3.9/src/LabelTrack.h	2009-08-31 12:45:38.000000000 +0200
++++ audacity-1.3.9.new/src/LabelTrack.h	2009-10-17 05:04:33.743726402 +0200
+@@ -129,7 +129,7 @@
+    bool CutSelectedText();
+    bool CopySelectedText();
+    bool PasteSelectedText(double sel0, double sel1);
+-   bool IsTextClipSupported();
++   static bool IsTextClipSupported();
+    
+    // methods to set flags
+    void SetDragXPos(const int d) { mDragXPos = d; };

-- 
Audacity debian packaging



More information about the pkg-multimedia-commits mailing list