]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/scrolwin.cpp
Unicodified wxSplitPath
[wxWidgets.git] / src / generic / scrolwin.cpp
index 4bb0b3a77c716a0cf15dcd4f2af94f806466b552..139f45ed39c9b19343dedca259e1dffb903e8e48 100644 (file)
 #include "wx/utils.h"
 #include "wx/dcclient.h"
 
 #include "wx/utils.h"
 #include "wx/dcclient.h"
 
-#ifdef __WXMSW__
-#include "windows.h"
-#endif
-
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
@@ -40,6 +36,15 @@ END_EVENT_TABLE()
 IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow)
 #endif
 
 IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow)
 #endif
 
+#ifdef __WXMSW__
+#include "windows.h"
+#endif
+
+#ifdef __WXMOTIF__
+// For wxRETAINED implementation
+#include <Xm/Xm.h>
+#endif
+
 wxScrolledWindow::wxScrolledWindow(void)
 {
     m_xScrollPixelsPerLine = 0;
 wxScrolledWindow::wxScrolledWindow(void)
 {
     m_xScrollPixelsPerLine = 0;
@@ -104,12 +109,46 @@ void wxScrolledWindow::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
     m_yScrollPosition = yPos;
     m_xScrollLines = noUnitsX;
     m_yScrollLines = noUnitsY;
     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();
    
 #ifdef __WXMSW__
       
     AdjustScrollbars();
    
    if (do_refresh && !noRefresh) Refresh();
    
 #ifdef __WXMSW__
+   // Necessary?
     UpdateWindow ((HWND) GetHWND());
 #endif
 }
     UpdateWindow ((HWND) GetHWND());
 #endif
 }
@@ -420,6 +459,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos )
     Refresh();
     
 #ifdef __WXMSW__
     Refresh();
     
 #ifdef __WXMSW__
+    // Necessary?
     ::UpdateWindow ((HWND) GetHWND());
 #endif
 }
     ::UpdateWindow ((HWND) GetHWND());
 #endif
 }