Blob Blame History Raw
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);