From 5e2618cff12d71edbdb66d523db0bb451f44ffa4 Mon Sep 17 00:00:00 2001
From: Zack Rusin <zack@kde.org>
Date: Fri, 9 Nov 2007 18:24:15 -0500
Subject: [PATCH] Fix scrolling with composite enabled

obscure problem in which scrolling creates terrible artifacts
with visuals with alphaMask
---
 src/gui/painting/qcolormap_x11.cpp      |    2 +-
 src/gui/painting/qwindowsurface_x11.cpp |   18 ++++++++++++++----
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/gui/painting/qcolormap_x11.cpp b/src/gui/painting/qcolormap_x11.cpp
index 927d351..01699a1 100644
--- a/src/gui/painting/qcolormap_x11.cpp
+++ b/src/gui/painting/qcolormap_x11.cpp
@@ -396,7 +396,7 @@ void QColormap::initialize()
                                                                         xvi[idx].visual);
                     if (format->type == PictTypeDirect && format->direct.alphaMask) {
                         d->visual = xvi[idx].visual;
-                        d->depth = 32;
+                        d->depth = xvi[idx].depth;
                         d->defaultVisual = false;
                         foundArgbVisual = true;
                         break;
diff --git a/src/gui/painting/qwindowsurface_x11.cpp b/src/gui/painting/qwindowsurface_x11.cpp
index 39ad60f..e39140f 100644
--- a/src/gui/painting/qwindowsurface_x11.cpp
+++ b/src/gui/painting/qwindowsurface_x11.cpp
@@ -82,7 +82,7 @@ void QX11WindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint
     GC gc = XCreateGC(X11->display, d_ptr->device.handle(), GCSubwindowMode, &values);
 #endif
     XSetGraphicsExposures(X11->display, gc, False);
-//         XFillRectangle(X11->display, widget->handle(), gc, 0, 0, widget->width(), widget->height());
+    //XFillRectangle(X11->display, widget->handle(), gc, 0, 0, widget->width(), widget->height());
 #ifndef Q_FLATTEN_EXPOSE
     XCopyArea(X11->display, d_ptr->device.handle(), widget->handle(), gc,
               br.x() + offset.x(), br.y() + offset.y(), br.width(), br.height(), wbr.x(), wbr.y());
@@ -113,9 +113,19 @@ bool QX11WindowSurface::scroll(const QRegion &area, int dx, int dy)
         return false;
 
     GC gc = XCreateGC(X11->display, d_ptr->device.handle(), 0, 0);
-    XCopyArea(X11->display, d_ptr->device.handle(), d_ptr->device.handle(), gc,
-              rect.x(), rect.y(), rect.width(), rect.height(),
-              rect.x()+dx, rect.y()+dy);
+    if (dy > 0) {
+        QPixmap px(d_ptr->device.size());
+        XCopyArea(X11->display, d_ptr->device.handle(), px.handle(), gc,
+                  0, 0, d_ptr->device.width(), d_ptr->device.height(),
+                  0, 0);
+        XCopyArea(X11->display, px.handle(), d_ptr->device.handle(), gc,
+                  rect.x(), rect.y(), rect.width(), rect.height(),
+                  rect.x()+dx, rect.y()+dy);
+    } else {
+        XCopyArea(X11->display, d_ptr->device.handle(), d_ptr->device.handle(), gc,
+                  rect.x(), rect.y(), rect.width(), rect.height(),
+                  rect.x()+dx, rect.y()+dy);
+    }
     XFreeGC(X11->display, gc);
 
     return true;
-- 
1.5.3.5

