2015-03-05 09:21:03 +00:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2015 Martin Gräßlin <mgraesslin@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 "abstract_client.h"
|
2015-03-12 14:21:07 +00:00
|
|
|
#ifdef KWIN_BUILD_TABBOX
|
|
|
|
#include "tabbox.h"
|
|
|
|
#endif
|
2015-03-12 15:08:19 +00:00
|
|
|
#include "workspace.h"
|
2015-03-05 09:21:03 +00:00
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
|
|
|
|
|
|
|
AbstractClient::AbstractClient()
|
|
|
|
: Toplevel()
|
2015-03-12 14:21:07 +00:00
|
|
|
#ifdef KWIN_BUILD_TABBOX
|
|
|
|
, m_tabBoxClient(QSharedPointer<TabBox::TabBoxClientImpl>(new TabBox::TabBoxClientImpl(this)))
|
|
|
|
#endif
|
2015-03-05 09:21:03 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
AbstractClient::~AbstractClient() = default;
|
|
|
|
|
|
|
|
void AbstractClient::updateMouseGrab()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AbstractClient::belongToSameApplication(const AbstractClient *c1, const AbstractClient *c2, bool active_hack)
|
|
|
|
{
|
|
|
|
return c1->belongsToSameApplication(c2, active_hack);
|
|
|
|
}
|
|
|
|
|
2015-03-05 12:35:54 +00:00
|
|
|
bool AbstractClient::isTransient() const
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-03-06 09:05:40 +00:00
|
|
|
TabGroup *AbstractClient::tabGroup() const
|
|
|
|
{
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AbstractClient::untab(const QRect &toGeometry, bool clientRemoved)
|
|
|
|
{
|
|
|
|
Q_UNUSED(toGeometry)
|
|
|
|
Q_UNUSED(clientRemoved)
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-03-12 09:43:46 +00:00
|
|
|
bool AbstractClient::isCurrentTab() const
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-03-12 09:24:38 +00:00
|
|
|
void AbstractClient::growHorizontal()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::growVertical()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::shrinkHorizontal()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::shrinkVertical()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-03-12 10:02:09 +00:00
|
|
|
void AbstractClient::packTo(int left, int top)
|
|
|
|
{
|
|
|
|
Q_UNUSED(left)
|
|
|
|
Q_UNUSED(top)
|
|
|
|
}
|
|
|
|
|
2015-03-12 10:24:27 +00:00
|
|
|
xcb_timestamp_t AbstractClient::userTime() const
|
|
|
|
{
|
|
|
|
return XCB_TIME_CURRENT_TIME;
|
|
|
|
}
|
|
|
|
|
2015-03-12 14:35:36 +00:00
|
|
|
void AbstractClient::setSkipSwitcher(bool set)
|
|
|
|
{
|
|
|
|
set = rules()->checkSkipSwitcher(set);
|
|
|
|
if (set == skipSwitcher())
|
|
|
|
return;
|
|
|
|
m_skipSwitcher = set;
|
|
|
|
updateWindowRules(Rules::SkipSwitcher);
|
|
|
|
emit skipSwitcherChanged();
|
|
|
|
}
|
|
|
|
|
2015-03-12 14:44:39 +00:00
|
|
|
void AbstractClient::setIcon(const QIcon &icon)
|
|
|
|
{
|
|
|
|
m_icon = icon;
|
|
|
|
emit iconChanged();
|
|
|
|
}
|
|
|
|
|
2015-03-12 15:08:19 +00:00
|
|
|
void AbstractClient::setActive(bool act)
|
|
|
|
{
|
|
|
|
if (m_active == act) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
m_active = act;
|
|
|
|
const int ruledOpacity = m_active
|
|
|
|
? rules()->checkOpacityActive(qRound(opacity() * 100.0))
|
|
|
|
: rules()->checkOpacityInactive(qRound(opacity() * 100.0));
|
|
|
|
setOpacity(ruledOpacity / 100.0);
|
|
|
|
workspace()->setActiveClient(act ? this : NULL);
|
|
|
|
|
|
|
|
if (!m_active)
|
|
|
|
cancelAutoRaise();
|
|
|
|
|
|
|
|
if (!m_active && shadeMode() == ShadeActivated)
|
|
|
|
setShade(ShadeNormal);
|
|
|
|
|
|
|
|
doSetActive();
|
|
|
|
emit activeChanged();
|
|
|
|
updateMouseGrab();
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::doSetActive()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-03-13 08:26:09 +00:00
|
|
|
void AbstractClient::updateLayer()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-03-13 08:36:43 +00:00
|
|
|
void AbstractClient::setKeepAbove(bool b)
|
|
|
|
{
|
|
|
|
b = rules()->checkKeepAbove(b);
|
|
|
|
if (b && !rules()->checkKeepBelow(false))
|
|
|
|
setKeepBelow(false);
|
|
|
|
if (b == keepAbove()) {
|
|
|
|
// force hint change if different
|
|
|
|
if (info && bool(info->state() & NET::KeepAbove) != keepAbove())
|
|
|
|
info->setState(keepAbove() ? NET::KeepAbove : NET::States(0), NET::KeepAbove);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
m_keepAbove = b;
|
|
|
|
if (info) {
|
|
|
|
info->setState(keepAbove() ? NET::KeepAbove : NET::States(0), NET::KeepAbove);
|
|
|
|
}
|
|
|
|
workspace()->updateClientLayer(this);
|
|
|
|
updateWindowRules(Rules::Above);
|
|
|
|
|
|
|
|
doSetKeepAbove();
|
|
|
|
emit keepAboveChanged(m_keepAbove);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::doSetKeepAbove()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::setKeepBelow(bool b)
|
|
|
|
{
|
|
|
|
b = rules()->checkKeepBelow(b);
|
|
|
|
if (b && !rules()->checkKeepAbove(false))
|
|
|
|
setKeepAbove(false);
|
|
|
|
if (b == keepBelow()) {
|
|
|
|
// force hint change if different
|
|
|
|
if (info && bool(info->state() & NET::KeepBelow) != keepBelow())
|
|
|
|
info->setState(keepBelow() ? NET::KeepBelow : NET::States(0), NET::KeepBelow);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
m_keepBelow = b;
|
|
|
|
if (info) {
|
|
|
|
info->setState(keepBelow() ? NET::KeepBelow : NET::States(0), NET::KeepBelow);
|
|
|
|
}
|
|
|
|
workspace()->updateClientLayer(this);
|
|
|
|
updateWindowRules(Rules::Below);
|
|
|
|
|
|
|
|
doSetKeepBelow();
|
|
|
|
emit keepBelowChanged(m_keepBelow);
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::doSetKeepBelow()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2015-03-13 09:26:10 +00:00
|
|
|
void AbstractClient::startAutoRaise()
|
|
|
|
{
|
|
|
|
delete m_autoRaiseTimer;
|
|
|
|
m_autoRaiseTimer = new QTimer(this);
|
|
|
|
connect(m_autoRaiseTimer, &QTimer::timeout, this, &AbstractClient::autoRaise);
|
|
|
|
m_autoRaiseTimer->setSingleShot(true);
|
|
|
|
m_autoRaiseTimer->start(options->autoRaiseInterval());
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::cancelAutoRaise()
|
|
|
|
{
|
|
|
|
delete m_autoRaiseTimer;
|
|
|
|
m_autoRaiseTimer = nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AbstractClient::autoRaise()
|
|
|
|
{
|
|
|
|
workspace()->raiseClient(this);
|
|
|
|
cancelAutoRaise();
|
|
|
|
}
|
|
|
|
|
2015-03-05 09:21:03 +00:00
|
|
|
}
|