lp://staging/~compiz-team/compiz-core/compiz-core.fix_860304

Created by Sam Spilsbury and last modified
Get this branch:
bzr branch lp://staging/~compiz-team/compiz-core/compiz-core.fix_860304
Members of Compiz Maintainers can upload to this branch. Log in for directions.

Branch merges

Related bugs

Related blueprints

Branch information

Owner:
Compiz Maintainers
Project:
Compiz Core
Status:
Merged

Recent revisions

2841. By Sam Spilsbury

Added a workaround to ensure that we don't end up with stale configure requests
causing windows to always be moved asynchronously (slow)

2840. By Sam Spilsbury

Fix typoes

2839. By Sam Spilsbury

  Since we are the only one to make ConfigureWindow requests on toplevels which the
  server will actually obey, it is possible track outgoing ConfigureWindow requests
  and match them to incoming ConfigureNotify events, assuming that priv->geometry
  and priv->serverGeometry ONLY represent what was last sent to the server and what
  was last received. Which allows us to effectively fix the race conditions
  which made positioning and stacking unpredictable at times.

  As such, any plugins past this commit, need to be careful not to modify w->geometry
  or w->serverGeometry directly. Unfortunately, the move plugin is a serial offender in
  this area and will update w->serverGeometry directly after doing w->move, which causes
  race conditions when other plugins try to configure a window through the server first.

  This change ensures that when there are pending ConfigureNotify events, no synchronous
  updates of the window geometry are allowed. For plugins that do touch w->serverGeometry
  for whatever reason, a lock_geometry call is sent through handleCompizEvent whenever
  there are pending ConfigureNotify events for plugins not to do that. This will remain
  in place until we can break ABI/API and prevent plugins from doing that.

2838. By Sam Spilsbury

Revert unreviewed changes

2837. By Sam Spilsbury

Merge lp:compiz-core

2836. By Sam Spilsbury

Notify plugins of unreparent after we have invalidated the frame and wrapper
reference otherwise they could call through to configureXWindow and request
movement of the client to 0,0 within the frame, when in fact that frame is
destroyed and the client is a child of the root window.

2835. By Sam Spilsbury

Also update serverFrameGeometry and frameGeometry whenever an unreparented
window is configured to ensure that it will not be out of date when
the window is later reparented.

2834. By Sam Spilsbury

Track ConfigureWindow requests and match them to ConfigureNotify events.

By doing this we are able to see what the pending requests are on a window
at any given time, and can transform new requests to suit these pending
ones. Currently, this only works for windows that we reparent and are
not override redirect since those are the only windows where we can guaruntee
that all ConfigureNotify events will be generated by us.

This isn't exposed to plugins at the moment, but it may be useful later on.

Incidentally, this allows us to fix a stacking corner case which was the
following situation:

Windows A, B and C map (placed on top), and must stack relative to each other

Window A gets stacked beneath D (which is a panel),
Window B should be stacked above A,
Window C should be stacked above B,

What happened was that updateAttributes would be called and
request to put window B above A, which it was already above in
CompScreen::windows, so that stacking request becomes a no-op. In this case
we check if the window is pending a restack and then request to put it
above the same window it was already a sibling to if findSiblingBelow found
that to be the case.

This fixes problems with, eg GIMP and Libreoffice, which make heavy use
of transient windows when mapping their windows and may also restack
their own windows when there is no window manager running

Branch metadata

Branch format:
Branch format 7
Repository format:
Bazaar repository format 2a (needs bzr 1.16 or later)
Stacked on:
lp://staging/compiz-core/0.9.5
This branch contains Public information 
Everyone can see this information.