e923426930
A factory is supposed to emit this signal whenever the decorations need to be recrated. The DecorationPlugins inside KWin Core connect to the signal and recreate the decorations. This signal is supposed to replace the reset method which encoded this information in the return value and which is already ignored.
193 lines
5 KiB
C++
193 lines
5 KiB
C++
/********************************************************************
|
|
KWin - the KDE window manager
|
|
This file is part of the KDE project.
|
|
|
|
Copyright (C) 1999, 2000 Daniel M. Duley <mosfet@kde.org>
|
|
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 "decorations.h"
|
|
#include "config-kwin.h"
|
|
#include "client.h"
|
|
#include "workspace.h"
|
|
#include <kdecorationfactory.h>
|
|
|
|
#include <KDE/KLocalizedString>
|
|
#include <stdlib.h>
|
|
#include <QPixmap>
|
|
|
|
namespace KWin
|
|
{
|
|
|
|
KWIN_SINGLETON_FACTORY(DecorationPlugin)
|
|
|
|
DecorationPlugin::DecorationPlugin(QObject *parent)
|
|
: QObject(parent)
|
|
, KDecorationPlugins(KSharedConfig::openConfig())
|
|
, m_disabled(false)
|
|
{
|
|
defaultPlugin = QStringLiteral("kwin3_oxygen");
|
|
#ifndef KWIN_BUILD_OXYGEN
|
|
defaultPlugin = QStringLiteral("kwin3_aurorae");
|
|
#endif
|
|
#ifdef KWIN_BUILD_DECORATIONS
|
|
loadPlugin(QString()); // load the plugin specified in cfg file
|
|
connect(factory(), &KDecorationFactory::recreateDecorations, this, &DecorationPlugin::recreateDecorations);
|
|
#else
|
|
setDisabled(true);
|
|
#endif
|
|
}
|
|
|
|
DecorationPlugin::~DecorationPlugin()
|
|
{
|
|
s_self = NULL;
|
|
}
|
|
|
|
void DecorationPlugin::error(const QString &error_msg)
|
|
{
|
|
qWarning("%s", QString(i18n("KWin: ") + error_msg).toLocal8Bit().data());
|
|
|
|
setDisabled(true);
|
|
}
|
|
|
|
bool DecorationPlugin::provides(Requirement)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void DecorationPlugin::setDisabled(bool disabled)
|
|
{
|
|
m_disabled = disabled;
|
|
}
|
|
|
|
bool DecorationPlugin::isDisabled() const
|
|
{
|
|
return m_disabled;
|
|
}
|
|
|
|
bool DecorationPlugin::hasShadows() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityProvidesShadow);
|
|
}
|
|
|
|
bool DecorationPlugin::hasAlpha() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityUsesAlphaChannel);
|
|
}
|
|
|
|
bool DecorationPlugin::supportsAnnounceAlpha() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityAnnounceAlphaChannel);
|
|
}
|
|
|
|
bool DecorationPlugin::supportsTabbing() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityTabbing);
|
|
}
|
|
|
|
bool DecorationPlugin::supportsFrameOverlap() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityExtendIntoClientArea);
|
|
}
|
|
|
|
bool DecorationPlugin::supportsBlurBehind() const
|
|
{
|
|
if (m_disabled) {
|
|
return false;
|
|
}
|
|
return factory()->supports(AbilityUsesBlurBehind);
|
|
}
|
|
|
|
Qt::Corner DecorationPlugin::closeButtonCorner()
|
|
{
|
|
if (m_disabled) {
|
|
return Qt::TopRightCorner;
|
|
}
|
|
return factory()->closeButtonCorner();
|
|
}
|
|
|
|
void DecorationPlugin::resetCompositing()
|
|
{
|
|
if (m_disabled) {
|
|
return;
|
|
}
|
|
factory()->reset(SettingCompositing);
|
|
}
|
|
|
|
QString DecorationPlugin::supportInformation()
|
|
{
|
|
if (m_disabled) {
|
|
return QStringLiteral("Decoration Plugin disabled\n");
|
|
}
|
|
QString support;
|
|
support.append(QStringLiteral("Current Plugin: "));
|
|
support.append(currentPlugin());
|
|
support.append(QStringLiteral("\n"));
|
|
|
|
support.append(QStringLiteral("Shadows: "));
|
|
support.append(hasShadows() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
|
|
support.append(QStringLiteral("Alpha: "));
|
|
support.append(hasAlpha() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
|
|
support.append(QStringLiteral("Announces Alpha: "));
|
|
support.append(supportsAnnounceAlpha() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
|
|
support.append(QStringLiteral("Tabbing: "));
|
|
support.append(supportsTabbing() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
|
|
support.append(QStringLiteral("Frame Overlap: "));
|
|
support.append(supportsFrameOverlap() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
|
|
support.append(QStringLiteral("Blur Behind: "));
|
|
support.append(supportsBlurBehind() ? QStringLiteral("yes\n") : QStringLiteral("no\n"));
|
|
// TODO: Qt5 - read support information from Factory
|
|
return support;
|
|
}
|
|
|
|
void DecorationPlugin::recreateDecorations()
|
|
{
|
|
if (m_disabled) {
|
|
return;
|
|
}
|
|
// Decorations need to be recreated
|
|
workspace()->forEachClient([](Client *c) {
|
|
c->updateDecoration(true, true);
|
|
});
|
|
// If the new decoration doesn't supports tabs then ungroup clients
|
|
if (!supportsTabbing()) {
|
|
workspace()->forEachClient([](Client *c) {
|
|
c->untab();
|
|
});
|
|
}
|
|
}
|
|
|
|
} // namespace
|