]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrolwin.cpp
* wxThread fixes
[wxWidgets.git] / src / generic / scrolwin.cpp
index 2a2eeb014c51fcc5192b5b2498dbc3612ead05b5..6786900ccd456d2c742adb7c7d36e7829c42a2d5 100644 (file)
@@ -28,7 +28,7 @@
 
 #if !USE_SHARED_LIBRARY
 BEGIN_EVENT_TABLE(wxScrolledWindow, wxWindow)
-    EVT_SCROLL(wxScrolledWindow::OnScroll)
+    EVT_SCROLLWIN(wxScrolledWindow::OnScroll)
     EVT_SIZE(wxScrolledWindow::OnSize)
     EVT_PAINT(wxScrolledWindow::OnPaint)
 END_EVENT_TABLE()
@@ -40,7 +40,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow)
 #include "windows.h"
 #endif
 
-wxScrolledWindow::wxScrolledWindow(void)
+#ifdef __WXMOTIF__
+// For wxRETAINED implementation
+#include <Xm/Xm.h>
+#endif
+
+wxScrolledWindow::wxScrolledWindow()
 {
     m_xScrollPixelsPerLine = 0;
     m_yScrollPixelsPerLine = 0;
@@ -89,9 +94,9 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     bool do_refresh =
     (
       (noUnitsX != 0 && m_xScrollLines == 0) ||
-      (noUnitsX < m_xScrollPosition) ||
+      (noUnitsX < m_xScrollLines) ||
       (noUnitsY != 0 && m_yScrollLines == 0) ||
-      (noUnitsY < m_yScrollPosition) ||
+      (noUnitsY < m_yScrollLines) ||
       (xPos != m_xScrollPosition) ||
       (yPos != m_yScrollPosition) ||
       (pixelsPerUnitX != m_xScrollPixelsPerLine) ||
@@ -104,10 +109,44 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     m_yScrollPosition = yPos;
     m_xScrollLines = noUnitsX;
     m_yScrollLines = noUnitsY;
+
+#ifdef __WXMOTIF__
+    // Sorry, some Motif-specific code to implement a backing pixmap
+    // for the wxRETAINED style. Implementing a backing store can't
+    // be entirely generic because it relies on the wxWindowDC implementation
+    // to duplicate X drawing calls for the backing pixmap.
+
+    if ((m_windowStyle & wxRETAINED) == wxRETAINED)
+    {
+        Display* dpy = XtDisplay((Widget) GetMainWidget());
+
+        int totalPixelWidth = m_xScrollLines * m_xScrollPixelsPerLine;
+        int totalPixelHeight = m_yScrollLines * m_yScrollPixelsPerLine;
+        if (m_backingPixmap &&
+           !((m_pixmapWidth == totalPixelWidth) &&
+             (m_pixmapHeight == totalPixelHeight)))
+        {
+            XFreePixmap (dpy, (Pixmap) m_backingPixmap);
+            m_backingPixmap = (WXPixmap) 0;
+        }
+
+        if (!m_backingPixmap &&
+           (noUnitsX != 0) && (noUnitsY != 0))
+        {
+            int depth = wxDisplayDepth();
+            m_pixmapWidth = totalPixelWidth;
+            m_pixmapHeight = totalPixelHeight;
+            m_backingPixmap = (WXPixmap) XCreatePixmap (dpy, RootWindow (dpy, DefaultScreen (dpy)),
+            m_pixmapWidth, m_pixmapHeight, depth);
+       }
+
+    }
+#endif
       
     AdjustScrollbars();
    
-   if (do_refresh && !noRefresh) Refresh();
+    if (do_refresh && !noRefresh) 
+       Refresh(); 
    
 #ifdef __WXMSW__
    // Necessary?
@@ -115,7 +154,7 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
 #endif
 }
 
-void wxScrolledWindow::OnScroll(wxScrollEvent& event)
+void wxScrolledWindow::OnScroll(wxScrollWinEvent& event)
 {
     int orient = event.GetOrientation();
 
@@ -158,7 +197,7 @@ void wxScrolledWindow::OnScroll(wxScrollEvent& event)
   }
 }
 
-int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
+int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event)
 {
   int pos = event.GetPosition();
   int orient = event.GetOrientation();
@@ -166,7 +205,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
   int nScrollInc = 0;
   switch (event.GetEventType())
   {
-    case wxEVT_SCROLL_TOP:
+    case wxEVT_SCROLLWIN_TOP:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = - m_xScrollPosition;
@@ -174,7 +213,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = - m_yScrollPosition;
       break;
     }
-    case wxEVT_SCROLL_BOTTOM:
+    case wxEVT_SCROLLWIN_BOTTOM:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = m_xScrollLines - m_xScrollPosition;
@@ -182,17 +221,17 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = m_yScrollLines - m_yScrollPosition;
       break;
     }
-    case wxEVT_SCROLL_LINEUP:
+    case wxEVT_SCROLLWIN_LINEUP:
     {
       nScrollInc = -1;
       break;
     }
-    case wxEVT_SCROLL_LINEDOWN:
+    case wxEVT_SCROLLWIN_LINEDOWN:
     {
       nScrollInc = 1;
       break;
     }
-    case wxEVT_SCROLL_PAGEUP:
+    case wxEVT_SCROLLWIN_PAGEUP:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
@@ -200,7 +239,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = -GetScrollPageSize(wxVERTICAL);
       break;
     }
-    case wxEVT_SCROLL_PAGEDOWN:
+    case wxEVT_SCROLLWIN_PAGEDOWN:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = GetScrollPageSize(wxHORIZONTAL);
@@ -208,7 +247,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollEvent& event)
         nScrollInc = GetScrollPageSize(wxVERTICAL);
       break;
     }
-    case wxEVT_SCROLL_THUMBTRACK:
+    case wxEVT_SCROLLWIN_THUMBTRACK:
     {
       if (orient == wxHORIZONTAL)
         nScrollInc = pos - m_xScrollPosition;
@@ -418,7 +457,8 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
         SetScrollPos( wxVERTICAL, m_yScrollPosition, TRUE );
     }
     
-    Refresh();
+    // BAD, BAD, can cause event loops if called from OnPaint(). KB.
+    // Refresh();
     
 #ifdef __WXMSW__
     // Necessary?