Advance Wayland and KDE package bring-up

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-14 10:51:06 +01:00
parent 51f3c21121
commit cf12defd28
15214 changed files with 20594243 additions and 269 deletions
@@ -0,0 +1,158 @@
/*
This file is part of libkdbus
SPDX-FileCopyrightText: 1999 Waldo Bastian <bastian@kde.org>
SPDX-FileCopyrightText: 2011 David Faure <faure@kde.org>
SPDX-FileCopyrightText: 2011 Kevin Ottens <ervin@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QMetaObject>
#include <QProcess>
#include <QTimer>
#include <kdbusservice.h>
#include <stdio.h>
class TestObject : public QObject
{
Q_OBJECT
public:
TestObject(KDBusService *service)
: m_proc(nullptr)
, m_callCount(0)
, m_service(service)
{
}
~TestObject() override
{
if (m_proc) {
m_proc->waitForFinished();
}
}
int callCount() const
{
return m_callCount;
}
void slotActivateRequested(const QStringList &args, const QString &workingDirectory)
{
Q_UNUSED(workingDirectory);
qDebug() << "Application executed with args" << args;
++m_callCount;
if (m_callCount == 1) {
Q_ASSERT(args.count() == 1);
Q_ASSERT(args.at(0) == QLatin1String("dummy call"));
} else if (m_callCount == 2) {
Q_ASSERT(args.count() == 2);
Q_ASSERT(args.at(1) == QLatin1String("bad call"));
m_service->setExitValue(4);
} else if (m_callCount == 3) {
Q_ASSERT(args.count() == 3);
Q_ASSERT(args.at(1) == QLatin1String("real call"));
Q_ASSERT(args.at(2) == QLatin1String("second arg"));
// OK, all done, quit
QCoreApplication::instance()->quit();
}
}
public Q_SLOTS:
void firstCall()
{
QStringList args;
args << QStringLiteral("bad call");
executeNewChild(args);
}
private Q_SLOTS:
void slotProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitStatus)
qDebug() << "Process exited with code" << exitCode;
m_proc = nullptr;
if (m_callCount == 2) {
Q_ASSERT(exitCode == 4);
secondCall();
}
}
void secondCall()
{
QStringList args;
args << QStringLiteral("real call") << QStringLiteral("second arg");
executeNewChild(args);
}
private:
void executeNewChild(const QStringList &args)
{
// Duplicated from kglobalsettingstest.cpp - make a shared helper method?
m_proc = new QProcess(this);
connect(m_proc, &QProcess::finished, this, &TestObject::slotProcessFinished);
QString appName = QStringLiteral("kdbusservicetest");
#ifdef Q_OS_WIN
appName += ".exe";
#else
if (QFile::exists(appName + ".shell")) {
appName = "./" + appName + ".shell";
} else {
Q_ASSERT(QFile::exists(appName));
appName = "./" + appName;
}
#endif
qDebug() << "about to run" << appName << args;
m_proc->start(appName, args);
}
QProcess *m_proc;
int m_callCount;
KDBusService *m_service;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QCoreApplication::setApplicationName(QStringLiteral("kdbusservicetest"));
QCoreApplication::setOrganizationDomain(QStringLiteral("kde.org"));
QDir::setCurrent(QCoreApplication::applicationDirPath());
KDBusService service(KDBusService::Unique);
TestObject testObject(&service);
QObject::connect(&service, &KDBusService::activateRequested, &testObject, &TestObject::slotActivateRequested);
// Testcase for the problem coming from the old fork-on-startup solution:
// the "Activate" D-Bus call would time out if the app took too much time
// to be ready.
// printf("Sleeping.\n");
// sleep(200);
QStringList args;
args << QStringLiteral("dummy call");
auto activateSignal = [&service, &args]() {
service.activateRequested(args, QDir::currentPath());
};
QMetaObject::invokeMethod(&service, activateSignal, Qt::QueuedConnection);
QTimer::singleShot(400, &testObject, &TestObject::firstCall);
qDebug() << "Running.";
a.exec();
qDebug() << "Terminating.";
Q_ASSERT(testObject.callCount() == 3);
const bool ok = testObject.callCount() == 3;
return ok ? 0 : 1;
}
#include "kdbusservicetest.moc"