summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarja Sundqvist <tarja.sundqvist@qt.io>2023-09-18 08:20:14 +0200
committerTarja Sundqvist <tarja.sundqvist@qt.io>2023-09-18 08:20:14 +0200
commit2b34a2b035f3fbdd7d255a88f8b91b7a9a17c7d8 (patch)
treeb7a959724a35c863c77a2f960cabbbffe17efbd3
parentce27b0a5567740398d273648f4537d11cb25e2f1 (diff)
parent5bf5704c36330d27a872329ff3b773c5ef991fcc (diff)
Merge "Merge remote-tracking branch 'origin/tqtc/lts-6.2.6' into tqtc/lts-6.2-opensource"
-rw-r--r--.cmake.conf2
-rw-r--r--cmake/QtAppManBuildConfig.cmake28
-rw-r--r--examples/applicationmanager/intents/CMakeLists.txt2
-rw-r--r--examples/applicationmanager/intents/intents.pro2
-rw-r--r--qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes11
-rw-r--r--qmltypes/QtApplicationManager/plugins.qmltypes3
-rw-r--r--src/common-lib/crashhandler.cpp2
-rw-r--r--src/intent-client-lib/intentclient.cpp15
-rw-r--r--src/intent-client-lib/intentclient.h4
-rw-r--r--src/launcher-lib/dbusapplicationinterface.cpp31
-rw-r--r--src/main-lib/main.cpp5
-rw-r--r--src/manager-lib/intentaminterface.cpp3
-rw-r--r--src/monitor-lib/CMakeLists.txt2
-rw-r--r--src/tools/dumpqmltypes/CMakeLists.txt24
-rw-r--r--src/tools/testrunner/testrunner.cpp1
-rw-r--r--tests/auto/CMakeLists.txt6
16 files changed, 94 insertions, 47 deletions
diff --git a/.cmake.conf b/.cmake.conf
index c66a2eb6..b9c40d18 100644
--- a/.cmake.conf
+++ b/.cmake.conf
@@ -1 +1 @@
-set(QT_REPO_MODULE_VERSION "6.2.5")
+set(QT_REPO_MODULE_VERSION "6.2.6")
diff --git a/cmake/QtAppManBuildConfig.cmake b/cmake/QtAppManBuildConfig.cmake
index 7facc2cc..b111c2df 100644
--- a/cmake/QtAppManBuildConfig.cmake
+++ b/cmake/QtAppManBuildConfig.cmake
@@ -6,19 +6,23 @@ function(qtam_internal_add_build_config target)
endif()
# get the git version, if available
- file(READ ${CMAKE_SOURCE_DIR}/.tag GIT_VERSION)
- STRING(REGEX REPLACE "\n" "" GIT_VERSION "${GIT_VERSION}")
- if(GIT_VERSION STREQUAL "\$Format:%H\$")
- set(GIT_VERSION "unknown")
- if(EXISTS ${CMAKE_SOURCE_DIR}/.git)
- execute_process(
- COMMAND git describe --tags --always --dirty
- WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
- OUTPUT_VARIABLE GIT_VERSION
- OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_QUIET
- )
+ if(EXISTS "${PROJECT_SOURCE_DIR}/.tag")
+ file(READ ${PROJECT_SOURCE_DIR}/.tag GIT_VERSION)
+ STRING(REGEX REPLACE "\n" "" GIT_VERSION "${GIT_VERSION}")
+ if(GIT_VERSION STREQUAL "\$Format:%H\$")
+ set(GIT_VERSION "unknown")
+ if(EXISTS ${CMAKE_SOURCE_DIR}/.git)
+ execute_process(
+ COMMAND git describe --tags --always --dirty
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE GIT_VERSION
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ endif()
endif()
+ else()
+ set(GIT_VERSION "")
endif()
# generate the necessary strings to be backward compatible with qmake
diff --git a/examples/applicationmanager/intents/CMakeLists.txt b/examples/applicationmanager/intents/CMakeLists.txt
index 78a6124e..218de802 100644
--- a/examples/applicationmanager/intents/CMakeLists.txt
+++ b/examples/applicationmanager/intents/CMakeLists.txt
@@ -21,5 +21,5 @@ find_package(Qt6 COMPONENTS AppManMainPrivate)
qt6_am_add_systemui_wrapper(intents
MAIN_QML_FILE system-ui.qml
EXTRA_FILES apps shared
- EXTRA_ARGS --builtin-apps-manifest-dir apps
+ EXTRA_ARGS --builtin-apps-manifest-dir apps -o \"ui: { style: Material }\"
)
diff --git a/examples/applicationmanager/intents/intents.pro b/examples/applicationmanager/intents/intents.pro
index eaa0e964..af1c0238 100644
--- a/examples/applicationmanager/intents/intents.pro
+++ b/examples/applicationmanager/intents/intents.pro
@@ -25,7 +25,7 @@ AM_COPY_FILES += system-ui.qml
prefix_build:tpath = $$target.path
else:tpath = $$_PRO_FILE_PWD_
-AM_DEFAULT_ARGS = --builtin-apps-manifest-dir $$tpath/apps -o \"ui: { style: material }\" $$tpath/system-ui.qml
+AM_DEFAULT_ARGS = --builtin-apps-manifest-dir $$tpath/apps -o \"ui: { style: Material }\" $$tpath/system-ui.qml
example_sources.path = $$target.path
example_sources.files = $$AM_COPY_FILES $$AM_COPY_DIRECTORIES
diff --git a/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes b/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes
index 89bc3d52..4f642255 100644
--- a/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes
+++ b/qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes
@@ -230,13 +230,16 @@ Module {
Signal {
name: "objectFollowsItemSizeChanged"
}
+ Signal {
+ name: "contentItemDataChanged"
+ }
Method {
name: "makePrimary"
}
}
Component {
name: "Window"
- exports: [ "QtApplicationManager.SystemUI/Window 2.0" ]
+ exports: [ "QtApplicationManager.SystemUI/WindowObject 2.0" ]
exportMetaObjectRevisions: [ 0 ]
prototype: "QObject"
isCreatable: false
@@ -432,6 +435,10 @@ Module {
name: "applicationChanged"
Parameter { name: "newApplication"; type: "Application"; isPointer: true; }
}
+ Signal {
+ name: "controlGroupChanged"
+ Parameter { name: "controlGroup"; type: "string"; }
+ }
}
Component {
name: "AbstractRuntime"
@@ -451,7 +458,7 @@ Module {
}
Signal {
name: "inProcessSurfaceItemReady"
- Parameter { name: "window"; type: "QSharedPointer<InProcessSurfaceItem>"; }
+ Parameter { name: "window"; type: "InProcessSurfaceItem>"; }
}
}
Component {
diff --git a/qmltypes/QtApplicationManager/plugins.qmltypes b/qmltypes/QtApplicationManager/plugins.qmltypes
index 924d8c27..28ad1058 100644
--- a/qmltypes/QtApplicationManager/plugins.qmltypes
+++ b/qmltypes/QtApplicationManager/plugins.qmltypes
@@ -30,6 +30,9 @@ Module {
Signal {
name: "maximumCountChanged"
}
+ Signal {
+ name: "dataSourcesChanged"
+ }
Method {
name: "clear"
}
diff --git a/src/common-lib/crashhandler.cpp b/src/common-lib/crashhandler.cpp
index 2fc0cc15..df1e96e4 100644
--- a/src/common-lib/crashhandler.cpp
+++ b/src/common-lib/crashhandler.cpp
@@ -311,7 +311,7 @@ QT_END_NAMESPACE_AM
QT_BEGIN_NAMESPACE_AM
-static Q_NORETURN void crashHandler(const char *why, int stackFramesToIgnore);
+Q_NORETURN static void crashHandler(const char *why, int stackFramesToIgnore);
static void initBacktraceUnix()
{
diff --git a/src/intent-client-lib/intentclient.cpp b/src/intent-client-lib/intentclient.cpp
index 1793d481..f76bb2a3 100644
--- a/src/intent-client-lib/intentclient.cpp
+++ b/src/intent-client-lib/intentclient.cpp
@@ -111,6 +111,7 @@ IntentClient::IntentClient(IntentClientSystemInterface *systemInterface, QObject
: QObject(parent)
, m_systemInterface(systemInterface)
{
+ m_lastWaitingCleanup.start();
m_systemInterface->setParent(this);
}
@@ -141,9 +142,7 @@ void IntentClient::registerHandler(IntentHandler *handler)
void IntentClient::unregisterHandler(IntentHandler *handler)
{
- m_handlers.erase(std::remove_if(m_handlers.begin(), m_handlers.end(),
- [handler](const auto &h) { return h == handler; }),
- m_handlers.end());
+ m_handlers.removeIf([handler](auto it) { return it.value() == handler; });
}
/*! \qmlmethod IntentRequest IntentClient::sendIntentRequest(string intentId, var parameters)
@@ -222,8 +221,8 @@ void IntentClient::replyFromSystem(const QUuid &requestId, bool error, const QVa
{
IntentClientRequest *icr = nullptr;
auto it = std::find_if(m_waiting.cbegin(), m_waiting.cend(),
- [requestId](IntentClientRequest *ir) -> bool {
- return (ir->requestId() == requestId);
+ [requestId](const QPointer<IntentClientRequest> &ir) -> bool {
+ return ir && (ir->requestId() == requestId);
});
if (it == m_waiting.cend()) {
@@ -235,6 +234,12 @@ void IntentClient::replyFromSystem(const QUuid &requestId, bool error, const QVa
icr = *it;
m_waiting.erase(it);
+ // make sure to periodically remove all requests that were gc'ed before a reply was received
+ if (m_lastWaitingCleanup.elapsed() > 1000) {
+ m_waiting.removeAll({ });
+ m_lastWaitingCleanup.start();
+ }
+
if (error)
icr->setErrorMessage(result.value(qSL("errorMessage")).toString());
else
diff --git a/src/intent-client-lib/intentclient.h b/src/intent-client-lib/intentclient.h
index 59128c6d..dac1733b 100644
--- a/src/intent-client-lib/intentclient.h
+++ b/src/intent-client-lib/intentclient.h
@@ -37,6 +37,7 @@
#include <QList>
#include <QMap>
#include <QPair>
+#include <QElapsedTimer>
#include <QtAppManCommon/global.h>
@@ -88,7 +89,8 @@ private:
Q_DISABLE_COPY(IntentClient)
static IntentClient *s_instance;
- QList<IntentClientRequest *> m_waiting;
+ QList<QPointer<IntentClientRequest>> m_waiting;
+ QElapsedTimer m_lastWaitingCleanup;
QMap<QPair<QString, QString>, IntentHandler *> m_handlers; // intentId + appId -> handler
// no timeouts by default -- these have to be set at runtime
diff --git a/src/launcher-lib/dbusapplicationinterface.cpp b/src/launcher-lib/dbusapplicationinterface.cpp
index 735a92d4..c4b27528 100644
--- a/src/launcher-lib/dbusapplicationinterface.cpp
+++ b/src/launcher-lib/dbusapplicationinterface.cpp
@@ -30,6 +30,7 @@
****************************************************************************/
#include <QDBusConnection>
+#include <QDBusConnectionInterface>
#include <QDBusInterface>
#include <QDBusMessage>
#include <QDBusReply>
@@ -38,6 +39,7 @@
#include <QPointer>
#include <QCoreApplication>
#include <QThread>
+#include <QElapsedTimer>
#include "global.h"
#include "dbusapplicationinterface.h"
@@ -48,6 +50,10 @@
#include "intentclientrequest.h"
#include "intentclientdbusimplementation.h"
+#ifdef interface // in case windows.h got included somehow
+# undef interface
+#endif
+
QT_BEGIN_NAMESPACE_AM
DBusApplicationInterface *DBusApplicationInterface::s_instance = nullptr;
@@ -72,7 +78,16 @@ bool DBusApplicationInterface::initialize(bool hasRuntime)
auto tryConnect = [](const QString &service, const QString &path, const QString &interfaceName,
const QDBusConnection &conn, QObject *parent) -> QDBusInterface * {
- for (int i = 0; i < 100; ++i) {
+ if (!service.isEmpty() && conn.interface()) {
+ if (!conn.interface()->isServiceRegistered(service))
+ return nullptr;
+ }
+
+ QElapsedTimer timer;
+ timer.start();
+
+ while (timer.elapsed() < (100 * timeout)) { // 100msec base line
+ // this constructor can block up to 25sec (!), if the service is not registered!
QDBusInterface *iface = new QDBusInterface(service, path, interfaceName, conn, parent);
if (!iface->lastError().isValid())
return iface;
@@ -86,7 +101,7 @@ bool DBusApplicationInterface::initialize(bool hasRuntime)
qSL("io.qt.ApplicationManager.ApplicationInterface"), m_connection, this);
if (!m_applicationIf) {
- qCritical("ERROR: could not connect to the ApplicationInterface on the P2P D-Bus");
+ qCritical("ERROR: could not connect to the ApplicationInterface signals on the P2P D-Bus");
return false;
}
@@ -115,7 +130,7 @@ bool DBusApplicationInterface::initialize(bool hasRuntime)
ok = connect(m_runtimeIf, SIGNAL(startApplication(QString,QString,QString,QString,QVariantMap,QVariantMap)),
this, SIGNAL(startApplication(QString,QString,QString,QString,QVariantMap,QVariantMap)));
if (!ok) {
- qCritical("ERROR: could not connect the RuntimeInterface via D-Bus: %s",
+ qCritical("ERROR: could not connect the RuntimeInterface signals via D-Bus: %s",
qPrintable(m_runtimeIf->lastError().name()));
}
}
@@ -138,11 +153,15 @@ bool DBusApplicationInterface::initialize(bool hasRuntime)
ok = ok && connect(m_notifyIf, SIGNAL(ActionInvoked(uint,QString)),
this, SLOT(notificationActionTriggered(uint,QString)));
- if (!ok)
- qCritical("ERROR: could not connect the org.freedesktop.Notifications interface via D-Bus: %s",
+ if (!ok) {
+ qCritical("ERROR: could not connect the org.freedesktop.Notifications signals via D-Bus: %s",
qPrintable(m_notifyIf->lastError().name()));
+
+ delete m_notifyIf;
+ m_notifyIf = nullptr;
+ }
} else {
- qCritical("ERROR: could not create the org.freedesktop.Notifications interface on D-Bus");
+ qCritical("ERROR: could not connect to the org.freedesktop.Notifications interface via D-Bus");
}
}
diff --git a/src/main-lib/main.cpp b/src/main-lib/main.cpp
index ea003066..5b15aa15 100644
--- a/src/main-lib/main.cpp
+++ b/src/main-lib/main.cpp
@@ -852,7 +852,10 @@ void Main::registerDBusObject(QDBusAbstractAdaptor *adaptor, QString dbusName, c
conn = QDBusConnection::sessionBus();
} else if (dbusName == qL1S("auto")) {
dbusAddress = QString::fromLocal8Bit(qgetenv("DBUS_SESSION_BUS_ADDRESS"));
- conn = QDBusConnection::sessionBus();
+ // we cannot be using QDBusConnection::sessionBus() here, because some plugin
+ // might have called that function before we could spawn our own session bus. In
+ // this case, Qt has cached the bus name and we would get the old one back.
+ conn = QDBusConnection::connectToBus(dbusAddress, qSL("qtam_session"));
if (!conn.isConnected())
return;
dbusName = qL1S("session");
diff --git a/src/manager-lib/intentaminterface.cpp b/src/manager-lib/intentaminterface.cpp
index 7932d3e5..f4510e8d 100644
--- a/src/manager-lib/intentaminterface.cpp
+++ b/src/manager-lib/intentaminterface.cpp
@@ -300,6 +300,9 @@ void IntentClientAMImplementation::requestToSystem(QPointer<IntentClientRequest>
// on app startup and (b) have consistent behavior in single- and multi-process mode
QMetaObject::invokeMethod(m_ic, [icr, this]() {
+ if (!icr)
+ return;
+
IntentServerRequest *isr = m_issi->requestToSystem(icr->requestingApplicationId(), icr->intentId(),
icr->applicationId(), icr->parameters());
QUuid requestId = isr ? isr->requestId() : QUuid();
diff --git a/src/monitor-lib/CMakeLists.txt b/src/monitor-lib/CMakeLists.txt
index 212bf1c1..03f2ee5f 100644
--- a/src/monitor-lib/CMakeLists.txt
+++ b/src/monitor-lib/CMakeLists.txt
@@ -17,7 +17,7 @@ qt_internal_add_module(AppManMonitorPrivate
Qt::Gui
)
-qt_internal_extend_target(AppManMonitorPrivate CONDITION LINUX
+qt_internal_extend_target(AppManMonitorPrivate CONDITION (LINUX OR ANDROID)
SOURCES
sysfsreader.cpp sysfsreader.h
)
diff --git a/src/tools/dumpqmltypes/CMakeLists.txt b/src/tools/dumpqmltypes/CMakeLists.txt
index 2dd452b5..b76c763f 100644
--- a/src/tools/dumpqmltypes/CMakeLists.txt
+++ b/src/tools/dumpqmltypes/CMakeLists.txt
@@ -19,19 +19,19 @@ qt_internal_add_tool(${target_name}
Qt::AppManWindowPrivate
)
-if(TARGET ${target_name} AND NOT QT_FEATURE_cross_compile)
- set(qml_install_dir "${INSTALL_QMLDIR}")
- qt_path_join(qml_install_dir ${QT_INSTALL_DIR} ${qml_install_dir})
+set(qml_install_dir "${INSTALL_QMLDIR}")
+qt_path_join(qml_install_dir ${QT_INSTALL_DIR} ${qml_install_dir})
- if(QT_WILL_INSTALL)
- qt_install(
- DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/qmltypes/QtApplicationManager"
- DESTINATION "${qml_install_dir}"
- )
- else()
- set(COPY_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/qmltypes" "${qml_install_dir}")
- endif()
+if(QT_WILL_INSTALL)
+ qt_install(
+ DIRECTORY "${CMAKE_SOURCE_DIR}/qmltypes/QtApplicationManager"
+ DESTINATION "${qml_install_dir}"
+ )
+else()
+ set(COPY_COMMAND COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/qmltypes" "${qml_install_dir}")
+endif()
+if(TARGET ${target_name} AND NOT QT_FEATURE_cross_compile)
qt_internal_collect_command_environment(env_path env_plugin_path)
# We have to set the env to get the PATH set to find the Qt libraries
@@ -49,7 +49,7 @@ if(TARGET ${target_name} AND NOT QT_FEATURE_cross_compile)
POST_BUILD
BYPRODUCTS "qmltypes"
COMMAND "${CMAKE_COMMAND}" -E env "PATH=${env_path}${QT_PATH_SEPARATOR}$ENV{PATH}"
- "${tool_path}" "${CMAKE_CURRENT_BINARY_DIR}/qmltypes"
+ "${tool_path}" "${CMAKE_SOURCE_DIR}/qmltypes"
${COPY_COMMAND}
DEPENDS "${tool_path}"
COMMENT "Generating qmltypes using ${tool_path}"
diff --git a/src/tools/testrunner/testrunner.cpp b/src/tools/testrunner/testrunner.cpp
index f2a5d6e7..60ba0e67 100644
--- a/src/tools/testrunner/testrunner.cpp
+++ b/src/tools/testrunner/testrunner.cpp
@@ -101,7 +101,6 @@ int TestRunner::exec(QQmlEngine *qmlEngine)
int typeId = qmlTypeId("QtTest", 1, 2, "QTestRootObject");
QTestRootObject* inst = qmlEngine->singletonInstance<QTestRootObject*>(typeId);
- inst->init();
inst->setWindowShown(true);
diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt
index 66d5d849..ca646a23 100644
--- a/tests/auto/CMakeLists.txt
+++ b/tests/auto/CMakeLists.txt
@@ -10,13 +10,15 @@ add_subdirectory(main)
add_subdirectory(packagecreator)
add_subdirectory(packageextractor)
add_subdirectory(packager-tool)
-add_subdirectory(qml)
+if (NOT ANDROID)
+ add_subdirectory(qml)
+endif()
add_subdirectory(runtime)
add_subdirectory(signature)
add_subdirectory(utilities)
add_subdirectory(yaml)
-if(LINUX)
+if (LINUX)
add_subdirectory(systemreader)
add_subdirectory(processreader)
add_subdirectory(sudo)