diff -ur compiz-0.8.2-kde43/kde/window-decorator-kde4/window.cpp compiz-0.8.2-kde4-initialsize/kde/window-decorator-kde4/window.cpp
--- compiz-0.8.2-kde43/kde/window-decorator-kde4/window.cpp 2010-02-13 17:56:17.000000000 +0100
+++ compiz-0.8.2-kde4-initialsize/kde/window-decorator-kde4/window.cpp 2010-02-13 18:38:56.000000000 +0100
@@ -768,6 +768,8 @@
mDecor = decor;
+ mDecor->widget ()->installEventFilter (this);
+
mPaintRedirector = new KWin::PaintRedirector (mDecor->widget ());
connect (mPaintRedirector, SIGNAL (paintPending()),
this, SLOT (decorRepaintPending ()));
@@ -1749,3 +1751,38 @@
return p + QPoint (mPadding.left, mPadding.right);
return childAt (p.x (), p.y ())->mapFrom (decorWidget (), p + QPoint (mPadding.left, mPadding.right));
}
+
+bool
+KWD::Window::eventFilter (QObject *o,
+ QEvent *e)
+{
+ if (!mDecor || o != mDecor->widget ())
+ return false;
+ if (e->type() == QEvent::Resize)
+ {
+ QResizeEvent* ev = static_cast<QResizeEvent*> (e);
+ // Filter out resize events that inform about size different than frame size.
+ // This will ensure that mDecor->width() etc. and mDecor->widget()->width() will be in sync.
+ // These events only seem to be delayed events from initial resizing before show() was called
+ // on the decoration widget.
+ if (ev->size () != (mGeometry.size () + QSize (mExtents.left + mExtents.right,
+ mExtents.top + mExtents.bottom)))
+ {
+ int w = mGeometry.width () + mExtents.left + mExtents.right;
+ int h = mGeometry.height () + mExtents.top + mExtents.bottom;
+
+ mDecor->resize (QSize (w, h));
+ return true;
+ }
+ // HACK: Avoid decoration redraw delays. On resize Qt sets WA_WStateConfigPending
+ // which delays all painting until a matching ConfigureNotify event comes.
+ // But this process itself is the window manager, so it's not needed
+ // to wait for that event, the geometry is known.
+ // Note that if Qt in the future changes how this flag is handled and what it
+ // triggers then this may potentionally break things. See mainly QETWidget::translateConfigEvent().
+ mDecor->widget()->setAttribute( Qt::WA_WState_ConfigPending, false );
+ mDecor->widget()->update();
+ return false;
+ }
+ return false;
+}
diff -ur compiz-0.8.2-kde43/kde/window-decorator-kde4/window.h compiz-0.8.2-kde4-initialsize/kde/window-decorator-kde4/window.h
--- compiz-0.8.2-kde43/kde/window-decorator-kde4/window.h 2010-02-13 17:36:27.000000000 +0100
+++ compiz-0.8.2-kde4-initialsize/kde/window-decorator-kde4/window.h 2010-02-13 18:37:30.000000000 +0100
@@ -176,6 +176,7 @@
return mFakeRelease;
}
+ virtual bool eventFilter (QObject *o, QEvent *e);
private:
void createDecoration (void);