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;
};
}