diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-09-18 08:20:14 +0200 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-09-18 08:20:14 +0200 |
commit | 2b34a2b035f3fbdd7d255a88f8b91b7a9a17c7d8 (patch) | |
tree | b7a959724a35c863c77a2f960cabbbffe17efbd3 | |
parent | ce27b0a5567740398d273648f4537d11cb25e2f1 (diff) | |
parent | 5bf5704c36330d27a872329ff3b773c5ef991fcc (diff) |
Merge "Merge remote-tracking branch 'origin/tqtc/lts-6.2.6' into tqtc/lts-6.2-opensource"
-rw-r--r-- | .cmake.conf | 2 | ||||
-rw-r--r-- | cmake/QtAppManBuildConfig.cmake | 28 | ||||
-rw-r--r-- | examples/applicationmanager/intents/CMakeLists.txt | 2 | ||||
-rw-r--r-- | examples/applicationmanager/intents/intents.pro | 2 | ||||
-rw-r--r-- | qmltypes/QtApplicationManager/SystemUI/plugins.qmltypes | 11 | ||||
-rw-r--r-- | qmltypes/QtApplicationManager/plugins.qmltypes | 3 | ||||
-rw-r--r-- | src/common-lib/crashhandler.cpp | 2 | ||||
-rw-r--r-- | src/intent-client-lib/intentclient.cpp | 15 | ||||
-rw-r--r-- | src/intent-client-lib/intentclient.h | 4 | ||||
-rw-r--r-- | src/launcher-lib/dbusapplicationinterface.cpp | 31 | ||||
-rw-r--r-- | src/main-lib/main.cpp | 5 | ||||
-rw-r--r-- | src/manager-lib/intentaminterface.cpp | 3 | ||||
-rw-r--r-- | src/monitor-lib/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/tools/dumpqmltypes/CMakeLists.txt | 24 | ||||
-rw-r--r-- | src/tools/testrunner/testrunner.cpp | 1 | ||||
-rw-r--r-- | tests/auto/CMakeLists.txt | 6 |
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) |