X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/88150e6073673c304d285906e0d718374a5abe93..c16e5a9271ab576a76c8537b67e0f5e25f90bc67:/src/generic/scrolwin.cpp?ds=sidebyside diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp index 4bb0b3a77c..139f45ed39 100644 --- a/src/generic/scrolwin.cpp +++ b/src/generic/scrolwin.cpp @@ -20,10 +20,6 @@ #include "wx/utils.h" #include "wx/dcclient.h" -#ifdef __WXMSW__ -#include "windows.h" -#endif - #ifdef __BORLANDC__ #pragma hdrstop #endif @@ -40,6 +36,15 @@ END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxScrolledWindow, wxWindow) #endif +#ifdef __WXMSW__ +#include "windows.h" +#endif + +#ifdef __WXMOTIF__ +// For wxRETAINED implementation +#include +#endif + 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; + +#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__ + // Necessary? UpdateWindow ((HWND) GetHWND()); #endif } @@ -420,6 +459,7 @@ void wxScrolledWindow::Scroll( int x_pos, int y_pos ) Refresh(); #ifdef __WXMSW__ + // Necessary? ::UpdateWindow ((HWND) GetHWND()); #endif }