lp://staging/~compiz-team/compiz-core/compiz-core.fix_860304
- Get this branch:
- bzr branch lp://staging/~compiz-team/compiz-core/compiz-core.fix_860304
Branch merges
- Robert Carr (community): Approve
-
Diff: 1020 lines (+538/-117)6 files modifiedplugins/move/src/move.cpp (+28/-1)
plugins/move/src/move.h (+7/-1)
src/privatewindow.h (+9/-0)
src/screen.cpp (+14/-7)
src/stackdebugger.cpp (+4/-0)
src/window.cpp (+476/-108)
Related bugs
Related blueprints
Branch information
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) - 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. - 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