Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package qt6-wayland for openSUSE:Factory checked in at 2025-06-05 20:32:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/qt6-wayland (Old) and /work/SRC/openSUSE:Factory/.qt6-wayland.new.19631 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "qt6-wayland" Thu Jun 5 20:32:39 2025 rev:48 rq:1282586 version:6.9.1 Changes: -------- --- /work/SRC/openSUSE:Factory/qt6-wayland/qt6-wayland.changes 2025-04-20 20:08:44.251050010 +0200 +++ /work/SRC/openSUSE:Factory/.qt6-wayland.new.19631/qt6-wayland.changes 2025-06-05 20:33:16.018618347 +0200 @@ -1,0 +2,8 @@ +Tue Jun 3 07:49:34 UTC 2025 - Christophe Marin <christo...@krop.fr> + +- Update to 6.9.1: + * https://www.qt.io/blog/qt-6.9.1-released +- Drop patch, merged upstream: + * 0001-Client-Reset-mFrameCallbackTimedOut-when-showing-a-w.patch + +------------------------------------------------------------------- Old: ---- 0001-Client-Reset-mFrameCallbackTimedOut-when-showing-a-w.patch qtwayland-everywhere-src-6.9.0.tar.xz New: ---- qtwayland-everywhere-src-6.9.1.tar.xz BETA DEBUG BEGIN: Old:- Drop patch, merged upstream: * 0001-Client-Reset-mFrameCallbackTimedOut-when-showing-a-w.patch BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ qt6-wayland.spec ++++++ --- /var/tmp/diff_new_pack.CfapPF/_old 2025-06-05 20:33:16.698646622 +0200 +++ /var/tmp/diff_new_pack.CfapPF/_new 2025-06-05 20:33:16.702646789 +0200 @@ -16,7 +16,7 @@ # -%define real_version 6.9.0 +%define real_version 6.9.1 %define short_version 6.9 %define tar_name qtwayland-everywhere-src %define tar_suffix %{nil} @@ -33,7 +33,7 @@ %global with_opengl 1 %endif Name: qt6-wayland%{?pkg_suffix} -Version: 6.9.0 +Version: 6.9.1 Release: 0 Summary: Qt 6 Wayland libraries and tools # The wayland compositor files are GPL-3.0-or-later @@ -41,8 +41,6 @@ URL: https://www.qt.io Source0: https://download.qt.io/official_releases/qt/%{short_version}/%{real_version}%{tar_suffix}/submodules/%{tar_name}-%{real_version}%{tar_suffix}.tar.xz Source99: qt6-wayland-rpmlintrc -# PATCH-FIX-UPSTREAM -Patch0: 0001-Client-Reset-mFrameCallbackTimedOut-when-showing-a-w.patch BuildRequires: pkgconfig BuildRequires: qt6-platformsupport-private-devel BuildRequires: cmake(Qt6Core) = %{real_version} ++++++ qtwayland-everywhere-src-6.9.0.tar.xz -> qtwayland-everywhere-src-6.9.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/.cmake.conf new/qtwayland-everywhere-src-6.9.1/.cmake.conf --- old/qtwayland-everywhere-src-6.9.0/.cmake.conf 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/.cmake.conf 2025-05-29 02:19:49.000000000 +0200 @@ -1,4 +1,4 @@ -set(QT_REPO_MODULE_VERSION "6.9.0") +set(QT_REPO_MODULE_VERSION "6.9.1") set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1") set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_AS_CONST=1") list(APPEND QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_NO_FOREACH=1") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/.gitreview new/qtwayland-everywhere-src-6.9.1/.gitreview --- old/qtwayland-everywhere-src-6.9.0/.gitreview 1970-01-01 01:00:00.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/.gitreview 2025-05-29 02:19:49.000000000 +0200 @@ -0,0 +1,4 @@ +[gerrit] +host=codereview.qt-project.org +project=qt/qtwayland +defaultbranch=dev diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/.tag new/qtwayland-everywhere-src-6.9.1/.tag --- old/qtwayland-everywhere-src-6.9.0/.tag 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/.tag 2025-05-29 02:19:49.000000000 +0200 @@ -1 +1 @@ -9a9a0416e7c8c5a8c6eb59207714af197966cdc5 +b54d446eb64ef23a5e365d5b6ff6116c3a5b6051 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/REUSE.toml new/qtwayland-everywhere-src-6.9.1/REUSE.toml --- old/qtwayland-everywhere-src-6.9.0/REUSE.toml 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/REUSE.toml 2025-05-29 02:19:49.000000000 +0200 @@ -40,18 +40,19 @@ [[annotations]] path = ["**.pro", "**.qrc", "**CMakeLists.txt", ".cmake.conf", "**.yaml", - "**.cfg", "**.pri", "**/qt_cmdline.cmake", "**.prf", "coin/**.json"] + "**.cfg", "**.pri", "**/qt_cmdline.cmake", "**.prf", "coin/**.json", + ".tag"] precedence = "closest" comment = "build system" SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." SPDX-License-Identifier = "BSD-3-Clause" [[annotations]] -path = [".tag", "**/.gitattributes", "**.gitignore"] +path = ["**/.gitattributes", "**.gitignore", "**.gitreview"] precedence = "closest" -comment = "version control system. Licensed as build system" +comment = "version control system. Infrastructure" SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." -SPDX-License-Identifier = "BSD-3-Clause" +SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause" [[annotations]] path = ["examples/**"] @@ -69,10 +70,10 @@ [[annotations]] path = ["**.toml", "licenseRule.json"] -comment = "documentation" +comment = "infrastructure" precedence = "override" SPDX-FileCopyrightText = "Copyright (C) 2024 The Qt Company Ltd." -SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only" +SPDX-License-Identifier = "LicenseRef-Qt-Commercial OR BSD-3-Clause" [[annotations]] path = ["**/qt_attribution.json"] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/coin/module_config.yaml new/qtwayland-everywhere-src-6.9.1/coin/module_config.yaml --- old/qtwayland-everywhere-src-6.9.0/coin/module_config.yaml 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/coin/module_config.yaml 2025-05-29 02:19:49.000000000 +0200 @@ -6,7 +6,6 @@ instructions: Build: - # to be turned on when the module source SBOM pass the license check - type: EnvironmentVariable variableName: VERIFY_SOURCE_SBOM variableValue: "ON" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/dependencies.yaml new/qtwayland-everywhere-src-6.9.1/dependencies.yaml --- old/qtwayland-everywhere-src-6.9.0/dependencies.yaml 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/dependencies.yaml 2025-05-29 02:19:49.000000000 +0200 @@ -1,10 +1,10 @@ dependencies: ../qtbase: - ref: 25986746947798e1a22d0830d3bcb11a55fcd3ae + ref: 2ad23cd72d5f122f88ce95792a4323d639c27d25 required: true ../qtdeclarative: - ref: 47ecb4fa226253c1ac85be8130ba905f95318f36 + ref: 1e6adc3d5f1f4cbbb77b41911395782dff43cccd required: false ../qtsvg: - ref: 0d6c7fd8159b7307f53403a4eba21848ecb4dc5c + ref: eac4588150968e3cdfcee06a4ccfa5aec4c4b938 required: false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/examples/wayland/ivi-compositor/main.cpp new/qtwayland-everywhere-src-6.9.1/examples/wayland/ivi-compositor/main.cpp --- old/qtwayland-everywhere-src-6.9.0/examples/wayland/ivi-compositor/main.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/examples/wayland/ivi-compositor/main.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -10,6 +10,9 @@ int main(int argc, char *argv[]) { + // ShareOpenGLContexts is needed for using the threaded renderer + // on Nvidia EGLStreams + QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); QGuiApplication app(argc, argv); QQmlApplicationEngine appEngine(QUrl("qrc:///main.qml")); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/examples/wayland/qtshell/CMakeLists.txt new/qtwayland-everywhere-src-6.9.1/examples/wayland/qtshell/CMakeLists.txt --- old/qtwayland-everywhere-src-6.9.0/examples/wayland/qtshell/CMakeLists.txt 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/examples/wayland/qtshell/CMakeLists.txt 2025-05-29 02:19:49.000000000 +0200 @@ -6,6 +6,12 @@ set(CMAKE_AUTOMOC ON) +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/qtshell") + find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml) qt_add_executable(qtshell @@ -37,3 +43,9 @@ FILES ${qtshell_resource_files} ) + +install(TARGETS qtshell + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/licenseRule.json new/qtwayland-everywhere-src-6.9.1/licenseRule.json --- old/qtwayland-everywhere-src-6.9.0/licenseRule.json 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/licenseRule.json 2025-05-29 02:19:49.000000000 +0200 @@ -1,6 +1,6 @@ [ { - "comment" : ["file_pattern_ending: strings matched against the end of a file name.", + "comment": ["file_pattern_ending: strings matched against the end of a file name.", "location keys: regular expression matched against the beginning of", "the file path (relative to the git submodule root).", "spdx: list of SPDX-License-Expression's allowed in the matching files.", @@ -9,138 +9,150 @@ "unless they are examples", "Files with other endings can also be build system files" ], - "file_pattern_ending" : ["CMakeLists.txt", ".cmake", ".pro", ".pri", ".prf", + "file_pattern_ending": ["CMakeLists.txt", ".cmake", ".pro", ".pri", ".prf", "configure", "configure.bat", "cmake.in", "plist.in", "CMakeLists.txt.in", - ".cmake.conf", ".gitattributes", ".gitignore", ".tag", "ci_config_linux.json", + ".cmake.conf", ".tag", "ci_config_linux.json", ".yaml", "BLACKLIST", ".cfg", "coin/qt-installer-package-config.json", ".qrc"], - "location" : { - "" : { - "comment" : "Default", - "file type" : "build system", - "spdx" : ["BSD-3-Clause"] - }, - "(.*)(examples/|snippets/)" : { - "comment" : "Example takes precedence", - "file type" : "examples and snippets", - "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] + "location": { + "": { + "comment": "Default", + "file type": "build system", + "spdx": ["BSD-3-Clause"] + }, + "(.*)(examples/|snippets/)": { + "comment": "Example takes precedence", + "file type": "examples and snippets", + "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] } } }, { - "comments" : ["Files with the following endings are Tool licensed,", + "comments": ["Files with the following endings are infrastructure licensed"], + "file_pattern_ending": [".gitattributes", ".gitignore", ".gitmodules", ".gitreview", + "clang-format", "licenseRule.json", "REUSE.toml"], + "location":{ + "": { + "comment": "Default", + "file type": "infrastructure", + "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] + } + } + }, + { + "comments": ["Files with the following endings are Tool licensed,", "unless they are examples.", "Files with other endings can also be tool files."], - "file_pattern_ending" : [".sh", ".py", ".pl", ".bat", ".ps1"], - "location" :{ - "" : { - "comment" : "Default", - "file type" : "tools and utils", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"] - }, - "(.*)(examples/|snippets/)" : { - "comment" : "Example takes precedence", - "file type" : "examples and snippets", - "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] + "file_pattern_ending": [".sh", ".py", ".pl", ".bat", ".ps1"], + "location":{ + "": { + "comment": "Default", + "file type": "tools and utils", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"] + }, + "(.*)(examples/|snippets/)": { + "comment": "Example takes precedence", + "file type": "examples and snippets", + "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] } } }, { - "comment" : "Files with the following endings are Documentation licensed.", - "file_pattern_ending" : [".qdoc", ".qdocinc" , ".qdocconf", "README", "qt_attribution.json", - "REUSE.toml", "licenseRule.json", "README.md"], - "location" :{ - "" : { - "comment" : "", - "file type" : "documentation", - "spdx" : ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] + "comment": "Files with the following endings are Documentation licensed.", + "file_pattern_ending": [".qdoc", ".qdocinc" , ".qdocconf", "README", "qt_attribution.json", + "README.md"], + "location":{ + "": { + "comment": "", + "file type": "documentation", + "spdx": ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] } } }, { - "comment" : ["All other files", + "comment": ["All other files", "The licensing is defined only by the file location in the Qt module repository.", "NO <file_pattern_ending> key for this case!", "This needs to be the last entry of the file."], - "location" : { - "" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] - }, - "dist/" : { - "comment" : "Default", - "file type" : "documentation", - "spdx" : ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] - }, - "src/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] - }, - "src/plugins/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] - }, - "src/plugins/hardwareintegration/compositor/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] - }, - "src/shared/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] - }, - "src/imports/texture-sharing" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] - }, - "src/qtwaylandscanner/qtwaylandscanner\\.cpp" : { - "comment" : "Default", - "file type" : "tools and utils", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"] - }, - "src/client/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] - }, - "src/hardwareintegration/client/" : { - "comment" : "Default", - "file type" : "module and plugin", - "spdx" : ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] - }, - "tests/" : { - "comment" : "Default", - "file type" : "test", - "spdx" : ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] - }, - "(.*)(examples/|snippets/)" : { - "comment" : "Default", - "file type" : "examples and snippets", - "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] - }, - "(.*|examples).*doc/images/" : { - "comment" : "Default", - "file type" : "documentation", - "spdx" : ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] - }, - "config\\.tests/" : { - "comment" : "Default", - "file type" : "build system", - "spdx" : ["BSD-3-Clause"] - }, - "src/extensions/.*.xml" : { - "comment" : "protocol extensions", - "file type" : "examples and snippets", - "spdx" : ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] - }, - "src/extensions/qt-text-input-method-unstable-v1.xml" : { - "comment" : "", - "file type" : "3rd party", - "spdx" : ["MIT"] + "location": { + "": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] + }, + "dist/": { + "comment": "Default", + "file type": "documentation", + "spdx": ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] + }, + "src/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] + }, + "src/plugins/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] + }, + "src/plugins/hardwareintegration/compositor/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] + }, + "src/shared/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] + }, + "src/imports/texture-sharing": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] + }, + "src/qtwaylandscanner/qtwaylandscanner\\.cpp": { + "comment": "Default", + "file type": "tools and utils", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0"] + }, + "src/client/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] + }, + "src/hardwareintegration/client/": { + "comment": "Default", + "file type": "module and plugin", + "spdx": ["LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only"] + }, + "tests/": { + "comment": "Default", + "file type": "test", + "spdx": ["LicenseRef-Qt-Commercial OR GPL-3.0-only"] + }, + "(.*)(examples/|snippets/)": { + "comment": "Default", + "file type": "examples and snippets", + "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] + }, + "(.*|examples).*doc/images/": { + "comment": "Default", + "file type": "documentation", + "spdx": ["LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only"] + }, + "config\\.tests/": { + "comment": "Default", + "file type": "build system", + "spdx": ["BSD-3-Clause"] + }, + "src/extensions/.*.xml": { + "comment": "protocol extensions", + "file type": "examples and snippets", + "spdx": ["LicenseRef-Qt-Commercial OR BSD-3-Clause"] + }, + "src/extensions/qt-text-input-method-unstable-v1.xml": { + "comment": "", + "file type": "3rd party", + "spdx": ["MIT"] } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylanddatacontrolv1.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylanddatacontrolv1.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylanddatacontrolv1.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylanddatacontrolv1.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -10,6 +10,9 @@ #include <qpa/qplatformclipboard.h> +#include <signal.h> +#include <unistd.h> + QT_BEGIN_NAMESPACE namespace QtWaylandClient { @@ -61,7 +64,7 @@ return; m_selectionOffer.reset(); - QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Selection); + QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Clipboard); } void QWaylandDataControlDeviceV1::setSelectionSource(QWaylandDataControlSourceV1 *source) @@ -102,14 +105,14 @@ // The selection event may be sent before platfrmIntegration is set. if (auto* integration = QGuiApplicationPrivate::platformIntegration()) - integration->clipboard()->emitChanged(QClipboard::Selection); + integration->clipboard()->emitChanged(QClipboard::Clipboard); } void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_finished() { m_selectionOffer.reset(); m_primarySelectionOffer.reset(); - QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Selection); + QGuiApplicationPrivate::platformIntegration()->clipboard()->emitChanged(QClipboard::Clipboard); } void QWaylandDataControlDeviceV1::zwlr_data_control_device_v1_primary_selection(struct ::zwlr_data_control_offer_v1 *id) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylanddisplay.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylanddisplay.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylanddisplay.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylanddisplay.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -106,13 +106,13 @@ * not only the one issued from event thread's waitForReading(), which means functions * called from dispatch_pending() can safely spin an event loop. */ - if (m_quitting) + if (m_quitting.loadRelaxed()) return; for (;;) { if (dispatchQueuePending() < 0) { Q_EMIT waylandError(); - m_quitting = true; + m_quitting.storeRelaxed(true); return; } @@ -139,11 +139,8 @@ if (m_pipefd[1] != -1 && write(m_pipefd[1], "\0", 1) == -1) qWarning("Failed to write to the pipe: %s.", strerror(errno)); - { - QMutexLocker l(&m_mutex); - m_quitting = true; - m_cond.wakeOne(); - } + m_quitting.storeRelaxed(true); + m_cond.wakeOne(); wait(); } @@ -216,11 +213,11 @@ QMutexLocker lock(&m_mutex); // m_reading might be set from our emit or some other invocation of // readAndDispatchEvents(). - while (!m_reading.loadRelaxed() && !m_quitting) + while (!m_reading.loadRelaxed() && !m_quitting.loadRelaxed()) m_cond.wait(&m_mutex); } - return !m_quitting; + return !m_quitting.loadRelaxed(); } int dispatchQueuePending() @@ -255,7 +252,7 @@ */ QAtomicInteger<bool> m_reading; - bool m_quitting; + QAtomicInteger<bool> m_quitting; QMutex m_mutex; QWaitCondition m_cond; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandinputdevice.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandinputdevice.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandinputdevice.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandinputdevice.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -246,7 +246,8 @@ return; // Set from shape using theme - uint time = seat()->mCursor.animationTimer.elapsed(); + const QElapsedTimer &timer = seat()->mCursor.animationTimer; + const uint time = timer.isValid() ? timer.elapsed() : 0; if (struct ::wl_cursor *waylandCursor = mCursor.theme->cursor(shape)) { uint duration = 0; @@ -641,8 +642,10 @@ if (mPointer) mPointer->updateCursor(); +#if QT_CONFIG(tabletevent) if (mTabletSeat) mTabletSeat->updateCursor(); +#endif } #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandprimaryselectionv1.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandprimaryselectionv1.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandprimaryselectionv1.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandprimaryselectionv1.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -10,6 +10,9 @@ #include <qpa/qplatformclipboard.h> +#include <signal.h> +#include <unistd.h> + QT_BEGIN_NAMESPACE namespace QtWaylandClient { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandshmbackingstore.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandshmbackingstore.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandshmbackingstore.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandshmbackingstore.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -316,13 +316,8 @@ QPainter painter(targetImage); painter.setCompositionMode(QPainter::CompositionMode_Source); - - const qreal sourceDevicePixelRatio = sourceImage->devicePixelRatio(); - for (const QRect &rect : buffer->dirtyRegion()) { - QRectF sourceRect(QPointF(rect.topLeft()) * sourceDevicePixelRatio, - QSizeF(rect.size()) * sourceDevicePixelRatio); - painter.drawImage(rect, *sourceImage, sourceRect); - } + painter.setClipRegion(buffer->dirtyRegion()); + painter.drawImage(QRectF(QPointF(), targetImage->deviceIndependentSize()), *sourceImage, sourceImage->rect()); } mBackBuffer = buffer; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtabletv2.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtabletv2.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtabletv2.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtabletv2.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -113,7 +113,8 @@ return; // Set from shape using theme - uint time = m_tabletSeat->seat()->mCursor.animationTimer.elapsed(); + QElapsedTimer &timer = m_tabletSeat->seat()->mCursor.animationTimer; + const uint time = timer.isValid() ? timer.elapsed() : 0; if (struct ::wl_cursor *waylandCursor = mCursor.theme->cursor(shape)) { uint duration = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtextinputv2.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtextinputv2.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtextinputv2.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtextinputv2.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -49,8 +49,30 @@ destroy(); } +void QWaylandTextInputv2::showInputPanel() +{ + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO; + show_input_panel(); +} +void QWaylandTextInputv2::hideInputPanel() +{ + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO; + hide_input_panel(); +} +void QWaylandTextInputv2::enableSurface(::wl_surface *surface) +{ + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO << surface; + enable(surface); +} +void QWaylandTextInputv2::disableSurface(::wl_surface *surface) +{ + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO << surface; + disable(surface); +} + void QWaylandTextInputv2::reset() { + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO; m_builder.reset(); m_preeditCommit = QString(); updateState(Qt::ImQueryAll, QtWayland::zwp_text_input_v2::update_state_reset); @@ -58,6 +80,7 @@ void QWaylandTextInputv2::commit() { + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO; if (QObject *o = QGuiApplication::focusObject()) { if (!m_preeditCommit.isEmpty()) { @@ -88,6 +111,7 @@ void QWaylandTextInputv2::updateState(Qt::InputMethodQueries queries, uint32_t flags) { + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO << queries << flags; if (!QGuiApplication::focusObject()) return; @@ -181,6 +205,7 @@ void QWaylandTextInputv2::zwp_text_input_v2_enter(uint32_t serial, ::wl_surface *surface) { + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO << serial << surface; m_serial = serial; m_surface = surface; @@ -189,6 +214,7 @@ void QWaylandTextInputv2::zwp_text_input_v2_leave(uint32_t serial, ::wl_surface *surface) { + qCDebug(qLcQpaInputMethods()) << Q_FUNC_INFO << serial << surface; m_serial = serial; if (m_surface != surface) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtextinputv2_p.h new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtextinputv2_p.h --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandtextinputv2_p.h 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandtextinputv2_p.h 2025-05-29 02:19:49.000000000 +0200 @@ -47,22 +47,10 @@ QLocale locale() const override; Qt::LayoutDirection inputDirection() const override; - void showInputPanel() override - { - show_input_panel(); - } - void hideInputPanel() override - { - hide_input_panel(); - } - void enableSurface(::wl_surface *surface) override - { - enable(surface); - } - void disableSurface(::wl_surface *surface) override - { - disable(surface); - } + void showInputPanel() override; + void hideInputPanel() override; + void enableSurface(::wl_surface *surface) override; + void disableSurface(::wl_surface *surface) override; protected: void zwp_text_input_v2_enter(uint32_t serial, struct ::wl_surface *surface) override; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandwindow.cpp new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandwindow.cpp --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandwindow.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandwindow.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -106,6 +106,7 @@ */ mSurface->attach(nullptr, 0, 0); mSurface->commit(); + resetFrameCallback(); if (window()->type() == Qt::Desktop) return; @@ -325,6 +326,15 @@ delete std::exchange(mShellSurface, nullptr); delete std::exchange(mSubSurfaceWindow, nullptr); emit surfaceRoleDestroyed(); + + resetFrameCallback(); + mInFrameRender = false; + mWaitingToApplyConfigure = false; + mExposed = false; +} + +void QWaylandWindow::resetFrameCallback() +{ { QMutexLocker lock(&mFrameSyncMutex); if (mFrameCallback) { @@ -338,10 +348,7 @@ killTimer(mFrameCallbackCheckIntervalTimerId); mFrameCallbackCheckIntervalTimerId = -1; } - mInFrameRender = false; mFrameCallbackTimedOut = false; - mWaitingToApplyConfigure = false; - mExposed = false; } QWaylandWindow *QWaylandWindow::fromWlSurface(::wl_surface *surface) @@ -1646,12 +1653,13 @@ { QMutexLocker lock(&mFrameSyncMutex); - bool callbackTimerExpired = mFrameCallbackElapsedTimer.hasExpired(mFrameCallbackTimeout); - if (!mFrameCallbackElapsedTimer.isValid() || callbackTimerExpired ) { + const bool callbackTimerValid = mFrameCallbackElapsedTimer.isValid(); + const bool callbackTimerExpired = callbackTimerValid && mFrameCallbackElapsedTimer.hasExpired(mFrameCallbackTimeout); + if (!callbackTimerValid || callbackTimerExpired) { killTimer(mFrameCallbackCheckIntervalTimerId); mFrameCallbackCheckIntervalTimerId = -1; } - if (!mFrameCallbackElapsedTimer.isValid() || !callbackTimerExpired) { + if (!callbackTimerValid || !callbackTimerExpired) { return; } mFrameCallbackElapsedTimer.invalidate(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandwindow_p.h new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandwindow_p.h --- old/qtwayland-everywhere-src-6.9.0/src/client/qwaylandwindow_p.h 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/client/qwaylandwindow_p.h 2025-05-29 02:19:49.000000000 +0200 @@ -296,7 +296,7 @@ GestureState mGestureState = GestureNotActive; #endif - bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out + std::atomic_bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out int mFrameCallbackCheckIntervalTimerId = -1; QAtomicInt mWaitingForUpdateDelivery = false; @@ -307,7 +307,7 @@ QWaitCondition mFrameSyncWait; // True when we have called deliverRequestUpdate, but the client has not yet attached a new buffer - bool mWaitingForUpdate = false; + std::atomic_bool mWaitingForUpdate = false; bool mExposed = false; // written from the main thread, read by the render thread @@ -351,6 +351,7 @@ bool shouldCreateShellSurface() const; bool shouldCreateSubSurface() const; void resetSurfaceRole(); + void resetFrameCallback(); QPlatformScreen *calculateScreenFromSurfaceEvents() const; void setOpaqueArea(const QRegion &opaqueArea); bool isOpaque() const; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp new/qtwayland-everywhere-src-6.9.1/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp --- old/qtwayland-everywhere-src-6.9.0/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/src/plugins/shellintegration/xdg-shell/qwaylandxdgshell.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -313,10 +313,20 @@ Qt::WindowType type = window->window()->type(); auto *transientParent = window->transientParent(); - if (type == Qt::ToolTip && transientParent) { - setPopup(transientParent); - } else if (type == Qt::Popup && transientParent && display->lastInputDevice()) { - setGrabPopup(transientParent, display->lastInputDevice(), display->lastInputSerial()); + if (type == Qt::ToolTip) { + if (transientParent) { + setPopup(transientParent); + } else { + qCWarning(lcQpaWayland) << "Failed to create popup. Ensure popup " << window->window() << "has a transientParent set."; + QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::AsynchronousDelivery>(m_window->window()); + } + } else if (type == Qt::Popup ) { + if (transientParent && display->lastInputDevice()) { + setGrabPopup(transientParent, display->lastInputDevice(), display->lastInputSerial()); + } else { + qCWarning(lcQpaWayland) << "Failed to create grabbing popup. Ensure popup " << window->window() << "has a transientParent set and that parent window has received input."; + QWindowSystemInterface::handleCloseEvent<QWindowSystemInterface::AsynchronousDelivery>(m_window->window()); + } } else { setToplevel(); } @@ -567,16 +577,18 @@ if (const auto xdgSurface = qobject_cast<QWaylandXdgSurface *>(wlWindow->shellSurface())) appId = xdgSurface->m_appId; - if (const auto seat = wlWindow->display()->lastInputDevice()) { - const auto tokenProvider = activation->requestXdgActivationToken( - wlWindow->display(), wlWindow->wlSurface(), seat->serial(), appId); - connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, this, - [this](const QString &token) { - m_shell->activation()->activate(token, window()->wlSurface()); - }); - connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, tokenProvider, &QObject::deleteLater); - return true; - } + std::optional<uint32_t> serial; + if (const auto seat = wlWindow->display()->lastInputDevice()) + serial = seat->serial(); + + const auto tokenProvider = activation->requestXdgActivationToken( + wlWindow->display(), wlWindow->wlSurface(), serial, appId); + connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, this, + [this](const QString &token) { + m_shell->activation()->activate(token, window()->wlSurface()); + }); + connect(tokenProvider, &QWaylandXdgActivationTokenV1::done, tokenProvider, &QObject::deleteLater); + return true; } } return false; @@ -678,6 +690,7 @@ m_popup->m_waitingForRepositionSerial++; m_popup->reposition(positioner->object(), m_popup->m_waitingForRepositionSerial); m_popup->m_waitingForReposition = true; + window()->updateExposure(); } std::unique_ptr<QWaylandXdgSurface::Positioner> QWaylandXdgSurface::createPositioner(QWaylandWindow *parent) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/tests/auto/client/reconnect/tst_reconnect.cpp new/qtwayland-everywhere-src-6.9.1/tests/auto/client/reconnect/tst_reconnect.cpp --- old/qtwayland-everywhere-src-6.9.0/tests/auto/client/reconnect/tst_reconnect.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/tests/auto/client/reconnect/tst_reconnect.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -22,6 +22,8 @@ #include "wl-socket.h" +#include <unistd.h> + using namespace MockCompositor; class TestWindow : public QRasterWindow diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qtwayland-everywhere-src-6.9.0/tests/auto/client/xdgshell/tst_xdgshell.cpp new/qtwayland-everywhere-src-6.9.1/tests/auto/client/xdgshell/tst_xdgshell.cpp --- old/qtwayland-everywhere-src-6.9.0/tests/auto/client/xdgshell/tst_xdgshell.cpp 2025-03-29 00:18:46.000000000 +0100 +++ new/qtwayland-everywhere-src-6.9.1/tests/auto/client/xdgshell/tst_xdgshell.cpp 2025-05-29 02:19:49.000000000 +0200 @@ -26,6 +26,7 @@ void tooltipAndSiblingPopup(); void switchPopups(); void hidePopupParent(); + void popupsWithoutParent(); void pongs(); void minMaxSize_data(); void minMaxSize(); @@ -607,6 +608,45 @@ QCOMPOSITOR_TRY_VERIFY(!xdgToplevel()); } +void tst_xdgshell::popupsWithoutParent() +{ + QRasterWindow popup; + QSignalSpy popupDoneSpy(&popup, &QWindow::visibilityChanged); + popup.setFlags(Qt::Popup); + popup.resize(100, 100); + popup.show(); + QVERIFY(popup.isVisible()); + + // popup cannot be created within the spec, so it gets auto-dismissed + QVERIFY(popupDoneSpy.wait()); + QVERIFY(!popup.isVisible()); + + QCOMPOSITOR_VERIFY(!xdgToplevel()); + + // now make a normal window with an input event + QRasterWindow window; + window.setTitle("main window"); + window.resize(200, 200); + window.show(); + + QCOMPOSITOR_TRY_VERIFY(xdgToplevel()); + exec([&] { xdgToplevel()->sendCompleteConfigure(); }); + QCOMPOSITOR_TRY_VERIFY(xdgToplevel()->m_xdgSurface->m_committedConfigureSerial); + exec([&] { + keyboard()->sendEnter(xdgToplevel()->surface()); + keyboard()->sendKey(client(), 72, Keyboard::key_state_pressed); // related with native scan code + keyboard()->sendKey(client(), 72, Keyboard::key_state_released); // related with native scan code + }); + QTRY_COMPARE(qGuiApp->focusWindow(), &window); + + // now re-show our popup, it should be able to guess a transient this time + // and correctly show as a popup + popup.show(); + QCOMPOSITOR_TRY_VERIFY(xdgPopup()); + exec([&] { xdgPopup()->sendCompleteConfigure(QRect(100, 100, 100, 100)); }); + QCOMPOSITOR_TRY_VERIFY(xdgPopup()->m_xdgSurface->m_committedConfigureSerial); +} + void tst_xdgshell::pongs() { // Create and show a window to trigger shell integration initialzation,