Hi,

> > If someone can confirm this bug ...
> > Run this in an xterm with smart placement method: 
> > while true; do konsole & sleep 1; killall konsole; done
> > 
> > Look at the screen, you should randomly see the bug at konsole window
> > mapping...
> 
> The placement plugin is broken. It shouldn't place windows when they
> first appear but instead when we get the map request and before they are
> mapped.
> 
> This bug is only visible in kde apps as kde doesn't support the sync
> request protocol.

So you mean something like the attached patch?
Let me know if it's correct and it works for you - it does for me ;-)

Regards,

Danny
diff --git a/plugins/place.c b/plugins/place.c
index 29c8043..8850346 100644
--- a/plugins/place.c
+++ b/plugins/place.c
@@ -74,8 +74,6 @@ typedef struct _PlaceDisplay {
 typedef struct _PlaceScreen {
     CompOption opt[PLACE_SCREEN_OPTION_NUM];
 
-    DamageWindowRectProc damageWindowRect;
-
     PlaceMode placeMode;
 } PlaceScreen;
 
@@ -1461,45 +1459,45 @@ done_no_constraints:
     *new_y = y;
 }
 
-static Bool
-placeDamageWindowRect (CompWindow *w,
-		       Bool	  initial,
-		       BoxPtr     rect)
+static void
+placeHandleEvent (CompDisplay *d,
+		  XEvent      *event)
 {
-    Bool status;
-
-    PLACE_SCREEN (w->screen);
-
-    UNWRAP (ps, w->screen, damageWindowRect);
-    status = (*w->screen->damageWindowRect) (w, initial, rect);
-    WRAP (ps, w->screen, damageWindowRect, placeDamageWindowRect);
+    PLACE_DISPLAY (d);
 
-    if (initial && !w->attrib.override_redirect && !w->placed)
+    if (event->type == MapRequest)
     {
-	int viewportX, viewportY;
-	int newX, newY;
+	CompWindow *w;
+	w = findWindowAtDisplay (d, event->xmaprequest.window);
+	if (w && !w->placed && !w->attrib.override_redirect)
+	{
+    	    int viewportX, viewportY;
+    	    int newX, newY;
 
-	placeWindow (w, w->serverX, w->serverY, &newX, &newY);
+    	    placeWindow (w, w->serverX, w->serverY, &newX, &newY);
 
-	if (placeMatchViewport (w, &viewportX, &viewportY))
-	{
-	    viewportX = MAX (MIN (viewportX, w->screen->hsize), 0);
-	    viewportY = MAX (MIN (viewportY, w->screen->vsize), 0);
+    	    if (placeMatchViewport (w, &viewportX, &viewportY))
+    	    {
+    		viewportX = MAX (MIN (viewportX, w->screen->hsize), 0);
+    		viewportY = MAX (MIN (viewportY, w->screen->vsize), 0);
 
-	    newX += (viewportX - w->screen->x) * w->screen->width;
-	    newY += (viewportY - w->screen->y) * w->screen->height;
-	}
+    		newX += (viewportX - w->screen->x) * w->screen->width;
+    		newY += (viewportY - w->screen->y) * w->screen->height;
+    	    }
 
-	w->placed = TRUE;
+    	    w->placed = TRUE;
 
-	if (newX != w->serverX || newY != w->serverY)
-	{
-	    moveWindow (w, newX - w->attrib.x, newY - w->attrib.y, FALSE, TRUE);
-	    syncWindowPosition (w);
+    	    if (newX != w->serverX || newY != w->serverY)
+    	    {
+    		moveWindow (w, newX - w->attrib.x, newY - w->attrib.y, FALSE, TRUE);
+    		syncWindowPosition (w);
+    	    }
 	}
     }
 
-    return status;
+    UNWRAP (pd, d, handleEvent);
+    (*d->handleEvent) (d, event);
+    WRAP (pd, d, handleEvent, placeHandleEvent);
 }
 
 static Bool
@@ -1521,6 +1519,8 @@ placeInitDisplay (CompPlugin  *p,
 
     d->privates[displayPrivateIndex].ptr = pd;
 
+    WRAP (pd, d, handleEvent, placeHandleEvent);
+
     return TRUE;
 }
 
@@ -1532,6 +1532,8 @@ placeFiniDisplay (CompPlugin  *p,
 
     freeScreenPrivateIndex (d, pd->screenPrivateIndex);
 
+    UNWRAP (pd, d, handleEvent);
+
     free (pd);
 }
 
@@ -1549,8 +1551,6 @@ placeInitScreen (CompPlugin *p,
 
     placeScreenInitOptions (ps);
 
-    WRAP (ps, s, damageWindowRect, placeDamageWindowRect);
-
     s->privates[pd->screenPrivateIndex].ptr = ps;
 
     placeUpdateMode (s);
@@ -1564,8 +1564,6 @@ placeFiniScreen (CompPlugin *p,
 {
     PLACE_SCREEN (s);
 
-    UNWRAP (ps, s, damageWindowRect);
-
     free (ps);
 }
 
_______________________________________________
compiz mailing list
compiz@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to