kwin/unmanaged.cpp

155 lines
4.1 KiB
C++
Raw Normal View History

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2006 Lubos Lunak <l.lunak@kde.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "unmanaged.h"
#include "workspace.h"
#include "effects.h"
#include "deleted.h"
#include "xcbutils.h"
#include <X11/extensions/shape.h>
namespace KWin
{
2011-01-30 14:34:42 +00:00
Unmanaged::Unmanaged(Workspace* ws)
: Toplevel(ws)
{
2011-08-17 21:51:55 +00:00
connect(this, SIGNAL(geometryShapeChanged(KWin::Toplevel*,QRect)), SIGNAL(geometryChanged()));
2011-01-30 14:34:42 +00:00
}
Unmanaged::~Unmanaged()
2011-01-30 14:34:42 +00:00
{
}
2011-01-30 14:34:42 +00:00
bool Unmanaged::track(Window w)
{
XWindowAttributes attr;
grabXServer();
2011-01-30 14:34:42 +00:00
if (!XGetWindowAttributes(display(), w, &attr) || attr.map_state != IsViewable) {
ungrabXServer();
return false;
2011-01-30 14:34:42 +00:00
}
if (attr.c_class == InputOnly) {
ungrabXServer();
return false;
2011-01-30 14:34:42 +00:00
}
setWindowHandles(w, w); // the window is also the frame
XSelectInput(display(), w, attr.your_event_mask | StructureNotifyMask | PropertyChangeMask);
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;
2011-01-30 14:34:42 +00:00
info = new NETWinInfo2(display(), w, rootWindow(), properties, 2);
getResourceClass();
getWindowRole();
getWmClientLeader();
getWmClientMachine();
if (Xcb::Extensions::self()->isShapeAvailable())
2011-01-30 14:34:42 +00:00
XShapeSelectInput(display(), w, ShapeNotifyMask);
detectShape(w);
getWmOpaqueRegion();
setupCompositing();
ungrabXServer();
2011-01-30 14:34:42 +00:00
if (effects)
static_cast<EffectsHandlerImpl*>(effects)->checkInputWindowStacking();
return true;
2011-01-30 14:34:42 +00:00
}
void Unmanaged::release(bool on_shutdown)
2011-01-30 14:34:42 +00:00
{
Deleted* del = NULL;
if (!on_shutdown) {
del = Deleted::create(this);
}
emit windowClosed(this, del);
finishCompositing();
2011-01-30 14:34:42 +00:00
if (!QWidget::find(window())) { // don't affect our own windows
if (Xcb::Extensions::self()->isShapeAvailable())
2011-01-30 14:34:42 +00:00
XShapeSelectInput(display(), window(), NoEventMask);
XSelectInput(display(), window(), NoEventMask);
}
if (!on_shutdown) {
workspace()->removeUnmanaged(this, Allowed);
addWorkspaceRepaint(del->visibleRect());
disownDataPassedToDeleted();
del->unrefWindow();
}
2011-01-30 14:34:42 +00:00
deleteUnmanaged(this, Allowed);
}
2011-01-30 14:34:42 +00:00
void Unmanaged::deleteUnmanaged(Unmanaged* c, allowed_t)
{
delete c;
2011-01-30 14:34:42 +00:00
}
int Unmanaged::desktop() const
2011-01-30 14:34:42 +00:00
{
return NET::OnAllDesktops; // TODO for some window types should be the current desktop?
2011-01-30 14:34:42 +00:00
}
QStringList Unmanaged::activities() const
2011-01-30 14:34:42 +00:00
{
return QStringList();
2011-01-30 14:34:42 +00:00
}
QPoint Unmanaged::clientPos() const
2011-01-30 14:34:42 +00:00
{
return QPoint(0, 0); // unmanaged windows don't have decorations
}
QSize Unmanaged::clientSize() const
2011-01-30 14:34:42 +00:00
{
return size();
2011-01-30 14:34:42 +00:00
}
QRect Unmanaged::transparentRect() const
2011-01-30 14:34:42 +00:00
{
return QRect(clientPos(), clientSize());
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
void Unmanaged::debug(QDebug& stream) const
{
stream << "\'ID:" << window() << "\'";
2011-01-30 14:34:42 +00:00
}
NET::WindowType Unmanaged::windowType(bool direct, int supportedTypes) const
{
// for unmanaged windows the direct does not make any difference
// as there are no rules to check and no hacks to apply
Q_UNUSED(direct)
if (supportedTypes == 0) {
supportedTypes = SUPPORTED_UNMANAGED_WINDOW_TYPES_MASK;
}
return info->windowType(supportedTypes);
}
} // namespace
#include "unmanaged.moc"