Advance KWin Wayland port for Red Bear desktop session

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-18 17:58:57 +01:00
parent 5451f25a7a
commit 85a5ceaa3c
59 changed files with 726 additions and 509 deletions
@@ -8,7 +8,7 @@
#include "effect/quickeffect.h"
#include <KConfigPropertyMap>
#include <KDeclarative/KConfigPropertyMap>
#include <QTimer>
@@ -41,15 +41,17 @@
#include "workspace.h"
// KDE
#include <KConfigGroup>
#include <KConfigPropertyMap>
#if KWIN_BUILD_QTQUICK
#include <KDeclarative/KConfigPropertyMap>
#endif
#include <KGlobalAccel>
#include <KLocalizedContext>
#include <KLocalizedQmlContext>
#include <KPackage/PackageLoader>
// Qt
#include <QDBusConnection>
#include <QDBusPendingCallWatcher>
#include <QDebug>
#include <QFile>
#include <QFutureWatcher>
#include <QMenu>
#include <QQmlContext>
@@ -59,7 +61,6 @@
#include <QStandardPaths>
#include <QtConcurrentRun>
#include "scriptadaptor.h"
static QRect scriptValueToRect(const QJSValue &value)
{
@@ -112,8 +113,6 @@ KWin::AbstractScript::AbstractScript(int id, QString scriptName, QString pluginN
m_pluginName = scriptName;
}
new ScriptAdaptor(this);
QDBusConnection::sessionBus().registerObject(QStringLiteral("/Scripting/Script") + QString::number(scriptId()), this, QDBusConnection::ExportAdaptors);
}
KWin::AbstractScript::~AbstractScript()
@@ -566,6 +565,7 @@ QAction *KWin::Script::createMenu(const QString &title, const QJSValue &items, Q
return menu->menuAction();
}
#if KWIN_BUILD_QTQUICK
KWin::DeclarativeScript::DeclarativeScript(int id, QString scriptName, QString pluginName, QObject *parent)
: AbstractScript(id, scriptName, pluginName, parent)
, m_context(new QQmlContext(Scripting::self()->declarativeScriptSharedContext(), this))
@@ -603,8 +603,9 @@ void KWin::DeclarativeScript::createComponent()
}
setRunning(true);
}
#endif
KWin::JSEngineGlobalMethodsWrapper::JSEngineGlobalMethodsWrapper(KWin::DeclarativeScript *parent)
KWin::JSEngineGlobalMethodsWrapper::JSEngineGlobalMethodsWrapper(KWin::AbstractScript *parent)
: QObject(parent)
, m_script(parent)
{
@@ -636,7 +637,9 @@ KWin::Scripting::Scripting(QObject *parent)
, m_workspaceWrapper(new QtScriptWorkspaceWrapper(this))
{
m_qmlEngine->setProperty("_kirigamiTheme", QStringLiteral("KirigamiPlasmaStyle"));
m_qmlEngine->rootContext()->setContextObject(new KLocalizedQmlContext(m_qmlEngine));
#if KWIN_BUILD_QTQUICK
m_qmlEngine->rootContext()->setContextObject(new KLocalizedContext(m_qmlEngine));
#endif
init();
QDBusConnection::sessionBus().registerObject(QStringLiteral("/Scripting"), this, QDBusConnection::ExportScriptableContents | QDBusConnection::ExportScriptableInvokables);
connect(Workspace::self(), &Workspace::configChanged, this, &Scripting::start);
@@ -670,7 +673,9 @@ void KWin::Scripting::init()
});
qmlRegisterSingletonInstance("org.kde.kwin", 3, 0, "Options", options);
#if KWIN_BUILD_QTQUICK
qmlRegisterAnonymousType<KConfigPropertyMap>("org.kde.kwin", 3);
#endif
qmlRegisterAnonymousType<KWin::Output>("org.kde.kwin", 3);
qmlRegisterAnonymousType<KWin::Window>("org.kde.kwin", 3);
qmlRegisterAnonymousType<KWin::VirtualDesktop>("org.kde.kwin", 3);
@@ -697,7 +702,9 @@ void KWin::Scripting::start()
if (it->first) {
loadScript(it->second.first, it->second.second);
} else {
#if KWIN_BUILD_QTQUICK
loadDeclarativeScript(it->second.first, it->second.second);
#endif
}
}
@@ -764,7 +771,9 @@ void KWin::Scripting::slotScriptsQueried()
if (it->first) {
loadScript(it->second.first, it->second.second);
} else {
#if KWIN_BUILD_QTQUICK
loadDeclarativeScript(it->second.first, it->second.second);
#endif
}
}
@@ -827,6 +836,7 @@ int KWin::Scripting::loadScript(const QString &filePath, const QString &pluginNa
return id;
}
#if KWIN_BUILD_QTQUICK
int KWin::Scripting::loadDeclarativeScript(const QString &filePath, const QString &pluginName)
{
QMutexLocker locker(m_scriptsLock.get());
@@ -839,6 +849,7 @@ int KWin::Scripting::loadDeclarativeScript(const QString &filePath, const QStrin
scripts.append(script);
return id;
}
#endif
KWin::Scripting::~Scripting()
{
@@ -22,9 +22,11 @@
#include <QDBusContext>
#include <QDBusMessage>
class QQmlComponent;
class QQmlContext;
class QQmlEngine;
#if KWIN_BUILD_QTQUICK
class QQmlComponent;
#endif
class QAction;
class QMenu;
class QRecursiveMutex;
@@ -249,6 +251,7 @@ private:
QJSValueList m_userActionsMenuCallbacks;
};
#if KWIN_BUILD_QTQUICK
class DeclarativeScript : public AbstractScript
{
Q_OBJECT
@@ -266,6 +269,7 @@ private:
QQmlContext *m_context;
QQmlComponent *m_component;
};
#endif
class JSEngineGlobalMethodsWrapper : public QObject
{
@@ -293,14 +297,14 @@ public:
ScreenArea
};
Q_ENUM(ClientAreaOption)
explicit JSEngineGlobalMethodsWrapper(DeclarativeScript *parent);
explicit JSEngineGlobalMethodsWrapper(AbstractScript *parent);
~JSEngineGlobalMethodsWrapper() override;
public Q_SLOTS:
QVariant readConfig(const QString &key, QVariant defaultValue = QVariant());
private:
DeclarativeScript *m_script;
AbstractScript *m_script;
};
/**
@@ -325,7 +329,9 @@ private:
public:
~Scripting() override;
Q_SCRIPTABLE Q_INVOKABLE int loadScript(const QString &filePath, const QString &pluginName = QString());
#if KWIN_BUILD_QTQUICK
Q_SCRIPTABLE Q_INVOKABLE int loadDeclarativeScript(const QString &filePath, const QString &pluginName = QString());
#endif
Q_SCRIPTABLE Q_INVOKABLE bool isScriptLoaded(const QString &pluginName) const;
Q_SCRIPTABLE Q_INVOKABLE bool unloadScript(const QString &pluginName);
@@ -340,8 +346,10 @@ public:
QQmlEngine *qmlEngine() const;
QQmlEngine *qmlEngine();
#if KWIN_BUILD_QTQUICK
QQmlContext *declarativeScriptSharedContext() const;
QQmlContext *declarativeScriptSharedContext();
#endif
QtScriptWorkspaceWrapper *workspaceWrapper() const;
AbstractScript *findScript(const QString &pluginName) const;
@@ -375,6 +383,7 @@ inline QQmlEngine *Scripting::qmlEngine()
return m_qmlEngine;
}
#if KWIN_BUILD_QTQUICK
inline QQmlContext *Scripting::declarativeScriptSharedContext() const
{
return m_declarativeScriptSharedContext;
@@ -384,6 +393,7 @@ inline QQmlContext *Scripting::declarativeScriptSharedContext()
{
return m_declarativeScriptSharedContext;
}
#endif
inline QtScriptWorkspaceWrapper *Scripting::workspaceWrapper() const
{