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,

Reply via email to