]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/region.cpp
redraw fixes
[wxWidgets.git] / src / mgl / region.cpp
index 3ec5b7d7516e270754e6ba4a60abe1d5e78288b2..ad94b811232e02f6c401b87ae897f0f8b93b0fa2 100644 (file)
@@ -1,13 +1,13 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:      region.cpp
-// Purpose:   Region handling for wxWindows/MGL
+// Purpose:   Region handling for wxWidgets/MGL
 // Author:    Vaclav Slavik
 // RCS-ID:    $Id$
 // Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
 // Licence:   wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
 #pragma implementation "region.h"
 #endif
 
@@ -21,6 +21,7 @@
 #include "wx/region.h"
 #include "wx/gdicmn.h"
 #include "wx/thread.h"
+#include "wx/module.h"
 
 #include <mgraph.hpp>
 
@@ -290,6 +291,27 @@ wxRegionContain wxRegion::Contains(const wxRect& rect) const
 //                               wxRegionIterator                                 //
 ///////////////////////////////////////////////////////////////////////////////
 
+#if wxUSE_THREADS
+static wxMutex *gs_mutexIterator;
+
+class wxMglRegionModule : public wxModule
+{
+public:
+    virtual bool OnInit()
+    {
+        gs_mutexIterator = new wxMutex();
+        return TRUE;
+    }
+    virtual void OnExit()
+    {
+        wxDELETE(gs_mutexIterator);
+    }
+
+    DECLARE_DYNAMIC_CLASS(wxMglRegionModule)
+};
+IMPLEMENT_DYNAMIC_CLASS(wxMglRegionModule, wxModule)
+#endif
+
 /*
  * Initialize empty iterator
  */
@@ -331,10 +353,11 @@ void wxRegionIterator::Reset(const wxRegion& region)
 
     if (!region.Empty())
     {
-        wxMutexGuiEnter();
+#if wxUSE_THREADS
+        wxMutexLocker(*gs_mutexIterator);
+#endif
         gs_rectList = &m_rects;
         M_REGION_OF(region).traverse(wxMGL_region_callback);
-        wxMutexGuiLeave();
         m_currentNode = m_rects.GetFirst();
     }
 }