diff --git a/clients/aurorae/src/CMakeLists.txt b/clients/aurorae/src/CMakeLists.txt index 095580a886..830ecb7e0b 100644 --- a/clients/aurorae/src/CMakeLists.txt +++ b/clients/aurorae/src/CMakeLists.txt @@ -7,6 +7,7 @@ include_directories( set(kwin3_aurorae_PART_SRCS aurorae.cpp + decorationoptions.cpp lib/auroraetheme.cpp lib/themeconfig.cpp ) diff --git a/clients/aurorae/src/aurorae.cpp b/clients/aurorae/src/aurorae.cpp index 6913129822..df3adaf6c2 100644 --- a/clients/aurorae/src/aurorae.cpp +++ b/clients/aurorae/src/aurorae.cpp @@ -18,9 +18,13 @@ along with this program. If not, see . #include "aurorae.h" #include "auroraetheme.h" #include "config-kwin.h" +// qml imports +#include "decorationoptions.h" #include #include +#include +#include #include #include #include @@ -64,6 +68,33 @@ void AuroraeFactory::init() { qRegisterMetaType("Qt::MouseButtons"); + // we need to first load our decoration plugin + // once it's loaded we can provide the Borders and access them from C++ side + // so let's try to locate our plugin: + QString pluginPath; + for (const QString &path : m_engine->importPathList()) { + QDirIterator it(path, QDirIterator::Subdirectories); + while (it.hasNext()) { + it.next(); + QFileInfo fileInfo = it.fileInfo(); + if (!fileInfo.isFile()) { + continue; + } + if (!fileInfo.path().endsWith(QLatin1String("/org/kde/kwin/decoration"))) { + continue; + } + if (fileInfo.fileName() == QLatin1String("libdecorationplugin.so")) { + pluginPath = fileInfo.absoluteFilePath(); + break; + } + } + if (!pluginPath.isEmpty()) { + break; + } + } + m_engine->importPlugin(pluginPath, "org.kde.kwin.decoration", nullptr); + qmlRegisterType("org.kde.kwin.decoration", 0, 1, "Borders"); + KConfig conf(QStringLiteral("auroraerc")); KConfigGroup group(&conf, "Engine"); if (!group.hasKey("EngineType") && !group.hasKey("ThemeName")) { @@ -250,6 +281,10 @@ AuroraeClient::AuroraeClient(KDecorationBridge *bridge, KDecorationFactory *fact : KDecoration(bridge, factory) , m_view(nullptr) , m_item(AuroraeFactory::instance()->createQmlDecoration(this)) + , m_borders(nullptr) + , m_maximizedBorders(nullptr) + , m_extendedBorders(nullptr) + , m_padding(nullptr) { connect(AuroraeFactory::instance(), SIGNAL(buttonsChanged()), SIGNAL(buttonsChanged())); connect(AuroraeFactory::instance(), SIGNAL(configChanged()), SIGNAL(configChanged())); @@ -295,6 +330,7 @@ void AuroraeClient::init() if (m_item) { m_item->setParentItem(m_view->contentItem()); m_item->setParent(m_view); + setupBorders(); } slotAlphaChanged(); @@ -333,18 +369,18 @@ void AuroraeClient::borders(int &left, int &right, int &top, int &bottom) const left = right = top = bottom = 0; return; } - QObject *borders = nullptr; + KWin::Borders *borders = nullptr; if (maximizeMode() == MaximizeFull) { - borders = m_item->findChild(QStringLiteral("maximizedBorders")); + borders = m_maximizedBorders; } else { - borders = m_item->findChild(QStringLiteral("borders")); + borders = m_borders; } sizesFromBorders(borders, left, right, top, bottom); } void AuroraeClient::padding(int &left, int &right, int &top, int &bottom) const { - if (!m_item) { + if (!m_padding) { left = right = top = bottom = 0; return; } @@ -352,18 +388,19 @@ void AuroraeClient::padding(int &left, int &right, int &top, int &bottom) const left = right = top = bottom = 0; return; } - sizesFromBorders(m_item->findChild(QStringLiteral("padding")), left, right, top, bottom); + sizesFromBorders(m_padding, left, right, top, bottom); } -void AuroraeClient::sizesFromBorders(const QObject *borders, int &left, int &right, int &top, int &bottom) const +void AuroraeClient::sizesFromBorders(const KWin::Borders *borders, int &left, int &right, int &top, int &bottom) const { if (!borders) { + left = right = top = bottom = 0; return; } - left = borders->property("left").toInt(); - right = borders->property("right").toInt(); - top = borders->property("top").toInt(); - bottom = borders->property("bottom").toInt(); + left = borders->left(); + right = borders->right(); + top = borders->top(); + bottom = borders->bottom(); } QSize AuroraeClient::minimumSize() const @@ -461,11 +498,16 @@ void AuroraeClient::themeChanged() m_item->deleteLater(); m_item = AuroraeFactory::instance()->createQmlDecoration(this); if (!m_item) { + m_borders = nullptr; + m_extendedBorders = nullptr; + m_maximizedBorders = nullptr; + m_padding = nullptr; return; } m_item->setParentItem(m_view->contentItem()); m_item->setParent(m_view); + setupBorders(); connect(m_item, SIGNAL(alphaChanged()), SLOT(slotAlphaChanged())); slotAlphaChanged(); } @@ -548,7 +590,7 @@ QRegion AuroraeClient::region(KDecorationDefines::Region r) } int left, right, top, bottom; left = right = top = bottom = 0; - sizesFromBorders(m_item->findChild(QStringLiteral("extendedBorders")), left, right, top, bottom); + sizesFromBorders(m_extendedBorders, left, right, top, bottom); if (top == 0 && right == 0 && bottom == 0 && left == 0) { // no extended borders return QRegion(); @@ -576,6 +618,17 @@ void AuroraeClient::render(QPaintDevice *device, const QRegion &sourceRegion) painter.drawImage(QPoint(0, 0), m_buffer); } +void AuroraeClient::setupBorders() +{ + if (!m_item) { + return; + } + m_borders = m_item->findChild(QStringLiteral("borders")); + m_maximizedBorders = m_item->findChild(QStringLiteral("maximizedBorders")); + m_extendedBorders = m_item->findChild(QStringLiteral("extendedBorders")); + m_padding = m_item->findChild(QStringLiteral("padding")); +} + } // namespace Aurorae #include "aurorae.moc" diff --git a/clients/aurorae/src/aurorae.h b/clients/aurorae/src/aurorae.h index 646ff3f7e1..8fa835ff68 100644 --- a/clients/aurorae/src/aurorae.h +++ b/clients/aurorae/src/aurorae.h @@ -32,6 +32,11 @@ class QQuickWindow; class KConfig; class KConfigGroup; +namespace KWin +{ +class Borders; +} + namespace Aurorae { class AuroraeTheme; @@ -162,11 +167,16 @@ private Q_SLOTS: void slotAlphaChanged(); private: - void sizesFromBorders(const QObject *borders, int &left, int &right, int &top, int &bottom) const; + void sizesFromBorders(const KWin::Borders *borders, int &left, int &right, int &top, int &bottom) const; + void setupBorders(); QQuickWindow *m_view; QQuickItem *m_item; QScopedPointer m_fbo; QImage m_buffer; + KWin::Borders *m_borders; + KWin::Borders *m_maximizedBorders; + KWin::Borders *m_extendedBorders; + KWin::Borders *m_padding; }; }