kwin/bridge.cpp

300 lines
7.6 KiB
C++
Raw Normal View History

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2003 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 "bridge.h"
#include "client.h"
#include "options.h"
#include <kconfiggroup.h>
namespace KWin
{
2011-01-30 14:34:42 +00:00
Bridge::Bridge(Client* cl)
: c(cl)
{
}
#define BRIDGE_HELPER( rettype, prototype, args1, args2, cst ) \
2011-01-30 14:34:42 +00:00
rettype Bridge::prototype ( args1 ) cst \
{ \
2011-01-30 14:34:42 +00:00
return c->prototype( args2 ); \
}
BRIDGE_HELPER(bool, isActive, , , const)
BRIDGE_HELPER(bool, isCloseable, , , const)
BRIDGE_HELPER(bool, isMaximizable, , , const)
BRIDGE_HELPER(Bridge::MaximizeMode, maximizeMode, , , const)
BRIDGE_HELPER(bool, isMinimizable, , , const)
BRIDGE_HELPER(bool, providesContextHelp, , , const)
BRIDGE_HELPER(int, desktop, , , const)
BRIDGE_HELPER(bool, isModal, , , const)
BRIDGE_HELPER(bool, isShadeable, , , const)
BRIDGE_HELPER(bool, isShade, , , const)
BRIDGE_HELPER(bool, keepAbove, , , const)
BRIDGE_HELPER(bool, keepBelow, , , const)
BRIDGE_HELPER(bool, isMovable, , , const)
BRIDGE_HELPER(bool, isResizable, , , const)
BRIDGE_HELPER(QString, caption, , , const)
BRIDGE_HELPER(void, processMousePressEvent, QMouseEvent* e, e,)
BRIDGE_HELPER(QRect, geometry, , , const)
BRIDGE_HELPER(void, closeWindow, , ,)
BRIDGE_HELPER(void, maximize, MaximizeMode m, m,)
BRIDGE_HELPER(void, minimize, , ,)
BRIDGE_HELPER(void, showContextHelp, , ,)
BRIDGE_HELPER(void, setDesktop, int desktop, desktop,)
void Bridge::setKeepAbove(bool set)
{
if (c->keepAbove() != set)
c->workspace()->performWindowOperation(c, KeepAboveOp);
}
2011-01-30 14:34:42 +00:00
void Bridge::setKeepBelow(bool set)
{
if (c->keepBelow() != set)
c->workspace()->performWindowOperation(c, KeepBelowOp);
}
2011-01-30 14:34:42 +00:00
NET::WindowType Bridge::windowType(unsigned long supported_types) const
{
return c->windowType(false, supported_types);
}
QIcon Bridge::icon() const
2011-01-30 14:34:42 +00:00
{
QIcon ret(c->icon());
ret.addPixmap(c->miniIcon());
return ret;
2011-01-30 14:34:42 +00:00
}
bool Bridge::isSetShade() const
2011-01-30 14:34:42 +00:00
{
return c->shadeMode() != ShadeNone;
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
void Bridge::showWindowMenu(const QPoint &p)
{
c->workspace()->showWindowMenu(p, c);
}
2011-01-30 14:34:42 +00:00
void Bridge::showWindowMenu(const QRect &p)
{
c->workspace()->showWindowMenu(p, c);
}
2011-01-30 14:34:42 +00:00
void Bridge::performWindowOperation(WindowOperation op)
{
c->workspace()->performWindowOperation(c, op);
}
2011-01-30 14:34:42 +00:00
void Bridge::setMask(const QRegion& r, int mode)
{
c->setMask(r, mode);
}
bool Bridge::isPreview() const
2011-01-30 14:34:42 +00:00
{
return false;
2011-01-30 14:34:42 +00:00
}
QRect Bridge::iconGeometry() const
2011-01-30 14:34:42 +00:00
{
NETRect r = c->info->iconGeometry();
2011-01-30 14:34:42 +00:00
return QRect(r.pos.x, r.pos.y, r.size.width, r.size.height);
}
WId Bridge::windowId() const
2011-01-30 14:34:42 +00:00
{
return c->window();
2011-01-30 14:34:42 +00:00
}
void Bridge::titlebarDblClickOperation()
2011-01-30 14:34:42 +00:00
{
c->workspace()->performWindowOperation(c, options->operationTitlebarDblClick());
}
2011-01-30 14:34:42 +00:00
void Bridge::titlebarMouseWheelOperation(int delta)
{
c->performMouseCommand(options->operationTitlebarMouseWheel(delta), cursorPos());
}
2011-01-30 14:34:42 +00:00
void Bridge::setShade(bool set)
{
c->setShade(set ? ShadeNormal : ShadeNone);
}
int Bridge::currentDesktop() const
2011-01-30 14:34:42 +00:00
{
return c->workspace()->currentDesktop();
2011-01-30 14:34:42 +00:00
}
QWidget* Bridge::initialParentWidget() const
2011-01-30 14:34:42 +00:00
{
return NULL;
2011-01-30 14:34:42 +00:00
}
Qt::WFlags Bridge::initialWFlags() const
2011-01-30 14:34:42 +00:00
{
return 0;
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
QRegion Bridge::unobscuredRegion(const QRegion& r) const
{
QRegion reg(r);
const ClientList stacking_order = c->workspace()->stackingOrder();
2011-01-30 14:34:42 +00:00
int pos = stacking_order.indexOf(c);
++pos;
2011-01-30 14:34:42 +00:00
for (; pos < stacking_order.count(); ++pos) {
if (!stacking_order[pos]->isShown(true))
continue; // these don't obscure the window
2011-01-30 14:34:42 +00:00
if (c->isOnAllDesktops()) {
if (!stacking_order[ pos ]->isOnCurrentDesktop())
continue;
2011-01-30 14:34:42 +00:00
} else {
if (!stacking_order[ pos ]->isOnDesktop(c->desktop()))
continue;
2011-01-30 14:34:42 +00:00
}
/* the clients all have their mask-regions in local coords
so we have to translate them to a shared coord system
we choose ours */
int dx = stacking_order[ pos ]->x() - c->x();
int dy = stacking_order[ pos ]->y() - c->y();
QRegion creg = stacking_order[ pos ]->mask();
creg.translate(dx, dy);
reg -= creg;
2011-01-30 14:34:42 +00:00
if (reg.isEmpty()) {
// early out, we are completely obscured
break;
}
}
2011-01-30 14:34:42 +00:00
return reg;
}
2011-01-30 14:34:42 +00:00
void Bridge::grabXServer(bool grab)
{
if (grab)
KWin::grabXServer();
else
KWin::ungrabXServer();
2011-01-30 14:34:42 +00:00
}
bool Bridge::compositingActive() const
2011-01-30 14:34:42 +00:00
{
return c->workspace()->compositingActive();
2011-01-30 14:34:42 +00:00
}
QRect Bridge::transparentRect() const
2011-01-30 14:34:42 +00:00
{
return c->transparentRect().translated(-c->decorationRect().topLeft());
2011-01-30 14:34:42 +00:00
}
bool Bridge::isClientGroupActive()
2011-01-30 14:34:42 +00:00
{
if (c->clientGroup())
return c->clientGroup()->containsActiveClient();
return isActive();
2011-01-30 14:34:42 +00:00
}
QList< ClientGroupItem > Bridge::clientGroupItems() const
2011-01-30 14:34:42 +00:00
{
if (c->clientGroup())
return c->clientGroup()->items();
QList< ClientGroupItem > items;
2011-01-30 14:34:42 +00:00
QIcon icon(c->icon());
icon.addPixmap(c->miniIcon());
items.append(ClientGroupItem(c->caption(), icon));
return items;
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
long Bridge::itemId(int index)
{
if (!c->clientGroup())
return 0;
const ClientList list = c->clientGroup()->clients();
2011-01-30 14:34:42 +00:00
return reinterpret_cast<long>(list.at(index));
}
int Bridge::visibleClientGroupItem()
2011-01-30 14:34:42 +00:00
{
if (c->clientGroup())
return c->clientGroup()->indexOfVisibleClient();
return 0;
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
void Bridge::setVisibleClientGroupItem(int index)
{
if (c->clientGroup())
c->clientGroup()->setVisible(index);
}
2011-01-30 14:34:42 +00:00
void Bridge::moveItemInClientGroup(int index, int before)
{
if (c->clientGroup())
c->clientGroup()->move(index, before);
}
2011-01-30 14:34:42 +00:00
void Bridge::moveItemToClientGroup(long itemId, int before)
{
Client* item = reinterpret_cast<Client*>(itemId);
if (!c->workspace()->hasClient(item)) {
kWarning(1212) << "****** ARBITRARY CODE EXECUTION ATTEMPT DETECTED ******";
return;
}
2011-01-30 14:34:42 +00:00
if (item->clientGroup())
c->workspace()->moveItemToClientGroup(item->clientGroup(), item->clientGroup()->indexOfClient(item),
c->clientGroup(), before);
}
2011-01-30 14:34:42 +00:00
void Bridge::removeFromClientGroup(int index, const QRect& newGeom)
{
if (c->clientGroup())
c->clientGroup()->remove(index, newGeom);
}
2011-01-30 14:34:42 +00:00
void Bridge::closeClientGroupItem(int index)
{
if (!c->clientGroup())
return;
const ClientList list = c->clientGroup()->clients();
2011-01-30 14:34:42 +00:00
if (index >= 0 || index <= list.count())
list.at(index)->closeWindow();
}
void Bridge::closeAllInClientGroup()
2011-01-30 14:34:42 +00:00
{
if (c->clientGroup())
c->clientGroup()->closeAll();
2011-01-30 14:34:42 +00:00
}
2011-01-30 14:34:42 +00:00
void Bridge::displayClientMenu(int index, const QPoint& pos)
{
if (c->clientGroup())
c->clientGroup()->displayClientMenu(index, pos);
}
2011-01-30 14:34:42 +00:00
KDecoration::WindowOperation Bridge::buttonToWindowOperation(Qt::MouseButtons button)
{
return c->mouseButtonToWindowOperation(button);
}
} // namespace