kwin/unmanaged.cpp
Luboš Luňák ff6f889ffc Add support for showing effects for windows which have already been deleted.
Add a fade-out effect.


svn path=/branches/work/kwin_composite/; revision=623872
2007-01-15 18:03:04 +00:00

119 lines
2.9 KiB
C++

/*****************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
You can Freely distribute this program under the GNU General Public
License. See the file "COPYING" for the exact licensing terms.
******************************************************************/
#include "unmanaged.h"
#include "workspace.h"
#include "effects.h"
#include <X11/extensions/shape.h>
namespace KWinInternal
{
Unmanaged::Unmanaged( Workspace* ws )
: Toplevel( ws )
, info( NULL )
{
}
Unmanaged::~Unmanaged()
{
delete info;
}
bool Unmanaged::track( Window w )
{
XWindowAttributes attr;
grabXServer();
if( !XGetWindowAttributes(display(), w, &attr) || attr.map_state != IsViewable )
{
ungrabXServer();
return false;
}
if( attr.c_class == InputOnly )
{
ungrabXServer();
return false;
}
setHandle( w );
XSelectInput( display(), w, StructureNotifyMask );
geom = QRect( attr.x, attr.y, attr.width, attr.height );
vis = attr.visual;
bit_depth = attr.depth;
unsigned long properties[ 2 ];
properties[ NETWinInfo::PROTOCOLS ] =
NET::WMWindowType |
NET::WMPid |
0;
properties[ NETWinInfo::PROTOCOLS2 ] =
NET::WM2Opacity |
0;
info = new NETWinInfo( display(), w, rootWindow(), properties, 2 );
if( Extensions::shapeAvailable())
XShapeSelectInput( display(), w, ShapeNotifyMask );
detectShape( w );
setupCompositing();
ungrabXServer();
if( effects )
effects->checkInputWindowStacking();
return true;
}
void Unmanaged::release()
{
assert( !deleting());
delete_refcount = 1;
if( effects )
effects->windowClosed( this );
finishCompositing( false ); // don't discard pixmap
workspace()->removeUnmanaged( this, Allowed );
if( Extensions::shapeAvailable())
XShapeSelectInput( display(), handle(), NoEventMask );
XSelectInput( display(), handle(), NoEventMask );
unrefWindow(); // will delete if recount is == 0
}
void Unmanaged::unrefWindow()
{
if( --delete_refcount > 0 )
return;
discardWindowPixmap();
workspace()->removeDeleted( this );
workspace()->addDamage( geometry());
deleteUnmanaged( this, Allowed );
}
void Unmanaged::deleteUnmanaged( Unmanaged* c, allowed_t )
{
delete c;
}
NET::WindowType Unmanaged::windowType( bool, int supported_types ) const
{
return info->windowType( supported_types );
}
double Unmanaged::opacity() const
{
if( info->opacity() == 0xffffffff )
return 1.0;
return info->opacity() * 1.0 / 0xffffffff;
}
void Unmanaged::debug( kdbgstream& stream ) const
{
stream << "\'ID:" << handle() << "\'";
}
} // namespace
#include "unmanaged.moc"