From 1297fe6daa3f162b75d7a9be8fed51322c108a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Thu, 12 Feb 2009 10:01:40 +0000 Subject: [PATCH] Fix position of gravitated windows after a crash. http://lists.kde.org/?l=kwin&m=123149700221501&w=2 svn path=/trunk/KDE/kdebase/workspace/; revision=925062 --- geometry.cpp | 11 +++++++++++ workspace.cpp | 6 ++++++ workspace.h | 1 + 3 files changed, 18 insertions(+) diff --git a/geometry.cpp b/geometry.cpp index ad5ac12a58..a03f9e559b 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -793,6 +793,17 @@ void Workspace::updateTopMenuGeometry( Client* c ) updateTopMenuGeometry( *it ); } +// When kwin crashes, windows will not be gravitated back to their original position +// and will remain offset by the size of the decoration. So when restarting, fix this +// (the property with the size of the frame remains on the window after the crash). +void Workspace::fixPositionAfterCrash( Window w, const XWindowAttributes& attr ) + { + NETWinInfo i( display(), w, rootWindow(), NET::WMFrameExtents ); + NETStrut frame = i.frameExtents(); + if( frame.left != 0 || frame.top != 0 ) + XMoveWindow( display(), w, attr.x - frame.left, attr.y - frame.top ); + } + //******************************************** // Client //******************************************** diff --git a/workspace.cpp b/workspace.cpp index f6972e2f29..20f068ab90 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -40,6 +40,7 @@ along with this program. If not, see . #include #include #include +#include #include #include "client.h" @@ -388,6 +389,7 @@ void Workspace::init() Window root_return, parent_return; Window* wins; XQueryTree( display(), rootWindow(), &root_return, &parent_return, &wins, &nwins ); + bool fixoffset = KCmdLineArgs::parsedArgs()->getOption( "crashes" ).toInt() > 0; for( i = 0; i < nwins; i++ ) { XWindowAttributes attr; @@ -400,7 +402,11 @@ void Workspace::init() if( topmenu_space && topmenu_space->winId() == wins[i] ) continue; if( attr.map_state != IsUnmapped ) + { + if( fixoffset ) + fixPositionAfterCrash( wins[ i ], attr ); createClient( wins[i], true ); + } } if( wins ) XFree( (void*)( wins )); diff --git a/workspace.h b/workspace.h index 7fdf6a32d5..c77610cb3d 100644 --- a/workspace.h +++ b/workspace.h @@ -569,6 +569,7 @@ class Workspace : public QObject, public KDecorationDefines void setupTopMenuHandling(); void updateTopMenuGeometry( Client* c = NULL ); void updateToolWindows( bool also_hide ); + void fixPositionAfterCrash( Window w, const XWindowAttributes& attr ); /// This is the right way to create a new client Client* createClient( Window w, bool is_mapped );