Another patch to add comments regarding the changes to window restacking
(this is a separate patch to be added ontop of the others).

-----

>From 3de0e9bf85faa975aa18426eff0eaed9d7f97575 Mon Sep 17 00:00:00 2001
From: Joel Bosveld <[email protected]>
Date: Thu, 7 May 2009 20:45:52 +0800
Subject: [PATCH] Add comments for changes to window restacking

---
 src/window.cpp |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/src/window.cpp b/src/window.cpp
index 614bedd..916bfac 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -2257,6 +2257,11 @@ PrivateWindow::reconfigureXWindow (unsigned int
valueMask,
     if (valueMask & CWBorderWidth)
     serverGeometry.setBorder (xwc->border_width);

+    /* Compiz's window list is immediately restacked on reconfigureXWindow
+       in order to ensure correct operation of the raise, lower and
restacking
+       functions. This function should only recieve stack_mode == Above
+       but warn incase something else does get through, to make the cause
+       of any potential misbehaviour obvious. */
     if (valueMask & (CWSibling | CWStackMode))
     {
     if (xwc->stack_mode == Above)
@@ -2402,6 +2407,13 @@ CompWindow::configureXWindow (unsigned int valueMask,
     CompWindowList transients;
     CompWindowList ancestors;

+    /* Since the window list is being reordered in reconfigureXWindow
+       the list of windows which need to be restacked must be stored
+       first. The windows are stacked in the opposite order than they
+       were previously stacked, in order that they are above xwc->sibling
+       so that when compiz gets the ConfigureNotify event it doesn't
+       have to restack all the windows again. */
+
     /* transient children above */
     if (PrivateWindow::stackTransients (this, NULL, xwc, transients))
     {
@@ -2899,6 +2911,10 @@ PrivateWindow::addWindowStackChanges (XWindowChanges
*xwc,
         XLowerWindow (screen->dpy (), id);
         if (frame)
             XLowerWindow (screen->dpy (), frame);
+
+        /* Restacking of compiz's window list happens
+           immediately and since this path doesn't call
+           reconfigureXWindow, restack must be called here. */
         restack (0);
         }
         else if (sibling->priv->id != window->prev->priv->id)
-- 
1.6.0.3



On Thu, Apr 30, 2009 at 10:13 PM, Joel Bosveld <[email protected]>wrote:

> New patches which fixed a problem with the old ones, which would occur if a
> window didn't have a frame. So I needed to use ROOTPARENT (w), instead of
> w->frame.
>
> From a6bfed5f6326609c13bde0429d4877b76adef898 Mon Sep 17 00:00:00 2001
> From: Joel Bosveld <[email protected]>
> Date: Tue, 7 Apr 2009 07:33:42 +0800
> Subject: [PATCH] Restack window list immediately when calling
> reconfigureXWindow
>
> Previously, trying to restack multiple windows wouldn't work as expected,
> as the window list wasn't restacked until the configureNotify was recieved,
> which lead to it stacking the window above the wrong window
> ---
>  src/privatewindow.h |    7 +++++--
>  src/window.cpp      |   47 +++++++++++++++++++++++++++++++++--------------
>  2 files changed, 38 insertions(+), 16 deletions(-)
>
> diff --git a/src/privatewindow.h b/src/privatewindow.h
> index e54c096..1f2c600 100644
> --- a/src/privatewindow.h
> +++ b/src/privatewindow.h
> @@ -84,9 +84,12 @@ class PrivateWindow {
>
>      static bool stackTransients (CompWindow     *w,
>                       CompWindow     *avoid,
> -                     XWindowChanges *xwc);
> +                     XWindowChanges *xwc,
> +                     CompWindowList &updateList);
>
> -    static void stackAncestors (CompWindow *w, XWindowChanges *xwc);
> +    static void stackAncestors (CompWindow *w,
> +                    XWindowChanges *xwc,
> +                    CompWindowList &updateList);
>
>      static bool isAncestorTo (CompWindow *transient,
>                    CompWindow *ancestor);
> diff --git a/src/window.cpp b/src/window.cpp
> index 132a68d..de5ab76 100644
> --- a/src/window.cpp
> +++ b/src/window.cpp
> @@ -2257,6 +2257,14 @@ PrivateWindow::reconfigureXWindow (unsigned int
> valueMask,
>      if (valueMask & CWBorderWidth)
>      serverGeometry.setBorder (xwc->border_width);
>
> +    if (valueMask & (CWSibling | CWStackMode))
> +    {
> +    if (xwc->stack_mode == Above)
> +        restack (xwc->sibling);
> +    else
> +        compLogMessage ("core", CompLogLevelWarn, "restack_mode not
> Above");
> +    }
> +
>      if (frame)
>      {
>      XWindowChanges wc = *xwc;
> @@ -2283,7 +2291,8 @@ PrivateWindow::reconfigureXWindow (unsigned int
> valueMask,
>  bool
>  PrivateWindow::stackTransients (CompWindow    *w,
>                  CompWindow    *avoid,
> -                XWindowChanges *xwc)
> +                XWindowChanges *xwc,
> +                CompWindowList &updateList)
>  {
>      CompWindow *t;
>      Window     clientLeader = w->priv->clientLeader;
> @@ -2303,7 +2312,7 @@ PrivateWindow::stackTransients (CompWindow    *w,
>          if (!(t->priv->type & CompWindowTypeDockMask))
>              return false;
>
> -        if (!stackTransients (t, avoid, xwc))
> +        if (!stackTransients (t, avoid, xwc, updateList))
>          return false;
>
>          if (xwc->sibling == t->priv->id ||
> @@ -2311,7 +2320,7 @@ PrivateWindow::stackTransients (CompWindow    *w,
>          return false;
>
>          if (t->priv->mapNum || t->priv->pendingMaps)
> -        t->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +        updateList.push_back (t);
>      }
>      }
>
> @@ -2320,7 +2329,8 @@ PrivateWindow::stackTransients (CompWindow    *w,
>
>  void
>  PrivateWindow::stackAncestors (CompWindow     *w,
> -                   XWindowChanges *xwc)
> +                   XWindowChanges *xwc,
> +                   CompWindowList &updateList)
>  {
>      CompWindow *transient = NULL;
>
> @@ -2336,7 +2346,7 @@ PrivateWindow::stackAncestors (CompWindow     *w,
>      ancestor = screen->findWindow (w->priv->transientFor);
>      if (ancestor)
>      {
> -        if (!stackTransients (ancestor, w, xwc))
> +        if (!stackTransients (ancestor, w, xwc, updateList))
>          return;
>
>          if (ancestor->priv->type & CompWindowTypeDesktopMask)
> @@ -2347,10 +2357,9 @@ PrivateWindow::stackAncestors (CompWindow     *w,
>              return;
>
>          if (ancestor->priv->mapNum || ancestor->priv->pendingMaps)
> -        ancestor->priv->reconfigureXWindow (CWSibling | CWStackMode,
> -                            xwc);
> +        updateList.push_back (ancestor);
>
> -        stackAncestors (ancestor, xwc);
> +        stackAncestors (ancestor, xwc, updateList);
>      }
>      }
>      else if (w->priv->isGroupTransient (w->priv->clientLeader))
> @@ -2367,7 +2376,7 @@ PrivateWindow::stackAncestors (CompWindow     *w,
>              (a->priv->frame && xwc->sibling == a->priv->frame))
>              break;
>
> -        if (!stackTransients (a, w, xwc))
> +        if (!stackTransients (a, w, xwc, updateList))
>              break;
>
>          if (a->priv->type & CompWindowTypeDesktopMask)
> @@ -2378,7 +2387,7 @@ PrivateWindow::stackAncestors (CompWindow     *w,
>              break;
>
>          if (a->priv->mapNum || a->priv->pendingMaps)
> -            a->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +            updateList.push_back (a);
>          }
>      }
>      }
> @@ -2390,13 +2399,22 @@ CompWindow::configureXWindow (unsigned int
> valueMask,
>  {
>      if (priv->managed && (valueMask & (CWSibling | CWStackMode)))
>      {
> +    CompWindowList transients;
> +    CompWindowList ancestors;
> +
>      /* transient children above */
> -    if (PrivateWindow::stackTransients (this, NULL, xwc))
> +    if (PrivateWindow::stackTransients (this, NULL, xwc, transients))
>      {
> -        priv->reconfigureXWindow (valueMask, xwc);
> -
>          /* ancestors, siblings and sibling transients below */
> -        PrivateWindow::stackAncestors (this, xwc);
> +        PrivateWindow::stackAncestors (this, xwc, ancestors);
> +
> +        foreach (CompWindow *w, transients)
> +        w->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +
> +        this->priv->reconfigureXWindow (valueMask, xwc);
> +
> +        foreach (CompWindow *w, ancestors)
> +        w->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
>      }
>      }
>      else
> @@ -2872,6 +2890,7 @@ PrivateWindow::addWindowStackChanges (XWindowChanges
> *xwc,
>          XLowerWindow (screen->dpy (), id);
>          if (frame)
>              XLowerWindow (screen->dpy (), frame);
> +        restack (0);
>          }
>          else if (sibling->priv->id != window->prev->priv->id)
>          {
> --
> 1.6.0.3
>
>
> From ad9f33011c23143b46fb164a31006cb7944e6c15 Mon Sep 17 00:00:00 2001
> From: Joel Bosveld <[email protected]>
> Date: Tue, 7 Apr 2009 08:02:50 +0800
> Subject: [PATCH] Restack windows in reverse, and stack above correct
> window.
>
> Previously this worked due to the order that the events arived in, however,
> now we want it to be stacked above correct window straight away so that we
> do not restack it again when configureNotify event comes through
> ---
>  src/window.cpp |   17 +++++++++++++----
>  1 files changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/src/window.cpp b/src/window.cpp
> index de5ab76..614bedd 100644
> --- a/src/window.cpp
> +++ b/src/window.cpp
> @@ -2408,13 +2408,22 @@ CompWindow::configureXWindow (unsigned int
> valueMask,
>          /* ancestors, siblings and sibling transients below */
>          PrivateWindow::stackAncestors (this, xwc, ancestors);
>
> -        foreach (CompWindow *w, transients)
> -        w->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +        for (CompWindowList::reverse_iterator w = ancestors.rbegin ();
> +         w != ancestors.rend (); w++)
> +        {
> +        (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +        xwc->sibling = ROOTPARENT (*w);
> +        }
>
>          this->priv->reconfigureXWindow (valueMask, xwc);
> +        xwc->sibling = ROOTPARENT (this);
>
> -        foreach (CompWindow *w, ancestors)
> -        w->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +        for (CompWindowList::reverse_iterator w = transients.rbegin ();
> +         w != transients.rend (); w++)
> +        {
> +        (*w)->priv->reconfigureXWindow (CWSibling | CWStackMode, xwc);
> +        xwc->sibling = ROOTPARENT (*w);
> +        }
>      }
>      }
>      else
> --
> 1.6.0.3
>
>
>
From 3de0e9bf85faa975aa18426eff0eaed9d7f97575 Mon Sep 17 00:00:00 2001
From: Joel Bosveld <[email protected]>
Date: Thu, 7 May 2009 20:45:52 +0800
Subject: [PATCH] Add comments for changes to window restacking

---
 src/window.cpp |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/src/window.cpp b/src/window.cpp
index 614bedd..916bfac 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -2257,6 +2257,11 @@ PrivateWindow::reconfigureXWindow (unsigned int   valueMask,
     if (valueMask & CWBorderWidth)
 	serverGeometry.setBorder (xwc->border_width);
 
+    /* Compiz's window list is immediately restacked on reconfigureXWindow
+       in order to ensure correct operation of the raise, lower and restacking
+       functions. This function should only recieve stack_mode == Above
+       but warn incase something else does get through, to make the cause
+       of any potential misbehaviour obvious. */
     if (valueMask & (CWSibling | CWStackMode))
     {
 	if (xwc->stack_mode == Above)
@@ -2402,6 +2407,13 @@ CompWindow::configureXWindow (unsigned int valueMask,
 	CompWindowList transients;
 	CompWindowList ancestors;
 
+	/* Since the window list is being reordered in reconfigureXWindow
+	   the list of windows which need to be restacked must be stored
+	   first. The windows are stacked in the opposite order than they
+	   were previously stacked, in order that they are above xwc->sibling
+	   so that when compiz gets the ConfigureNotify event it doesn't
+	   have to restack all the windows again. */
+
 	/* transient children above */
 	if (PrivateWindow::stackTransients (this, NULL, xwc, transients))
 	{
@@ -2899,6 +2911,10 @@ PrivateWindow::addWindowStackChanges (XWindowChanges *xwc,
 		XLowerWindow (screen->dpy (), id);
 		if (frame)
 		    XLowerWindow (screen->dpy (), frame);
+
+		/* Restacking of compiz's window list happens
+		   immediately and since this path doesn't call
+		   reconfigureXWindow, restack must be called here. */
 		restack (0);
 	    }
 	    else if (sibling->priv->id != window->prev->priv->id)
-- 
1.6.0.3

_______________________________________________
Dev mailing list
[email protected]
http://lists.compiz-fusion.org/mailman/listinfo/dev

Reply via email to