aports/testing/qtmir/107.patch
Luca Weiss 9f53c590f3 testing/qtmir: upgrade to 0.7.2_git20260108
Drop upstreamed patches and add patch to fix crash on screen scale
https://gitlab.com/ubports/development/core/qtmir/-/merge_requests/107
2026-02-26 02:27:23 +00:00

171 lines
7.1 KiB
Diff

From 9f6fcfa699885652adec42c0feb0fe26ffb0333d Mon Sep 17 00:00:00 2001
From: Azkali Manad <a.ffcc7@gmail.com>
Date: Sun, 8 Feb 2026 14:00:48 +0700
Subject: [PATCH 1/4] src: platforms: fix anonymous call for C++20
---
src/platforms/mirserver/qmirserver_p.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/platforms/mirserver/qmirserver_p.cpp b/src/platforms/mirserver/qmirserver_p.cpp
index b2843d65..126cff89 100644
--- a/src/platforms/mirserver/qmirserver_p.cpp
+++ b/src/platforms/mirserver/qmirserver_p.cpp
@@ -269,7 +269,7 @@ void QMirServerPrivate::run(const std::function<void()> &startCallback)
std::shared_ptr<QtCompositor> qtCompsitor = std::dynamic_pointer_cast<QtCompositor>(compositor);
qCDebug(QTMIR_MIR_MESSAGES) << "Initializing screens model";
#if MIR_SERVER_VERSION >= MIR_VERSION_NUMBER(2, 20, 0)
- auto callback = [=](std::shared_ptr<mir::graphics::GLRenderingProvider> provider) {
+ auto callback = [=, this](std::shared_ptr<mir::graphics::GLRenderingProvider> provider) {
this->renderingProvider = provider;
qCDebug(QTMIR_MIR_MESSAGES) << "renderingProvider set";
};
--
GitLab
From 45467728bd5ee5e0f24b605680eefdebdeb548f2 Mon Sep 17 00:00:00 2001
From: Azkali Manad <a.ffcc7@gmail.com>
Date: Sun, 8 Feb 2026 14:02:43 +0700
Subject: [PATCH 2/4] src: platforms: Fix synchronization bug with Mir2
crashing Mir (run on same thread)
---
src/platforms/mirserver/screensmodel.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/platforms/mirserver/screensmodel.cpp b/src/platforms/mirserver/screensmodel.cpp
index 8998d06d..ab0b78c3 100644
--- a/src/platforms/mirserver/screensmodel.cpp
+++ b/src/platforms/mirserver/screensmodel.cpp
@@ -77,7 +77,7 @@ void ScreensModel::init(
// Queued connections work because the thread affinity of this class is with the Qt GUI thread.
auto qtCompositor = compositor.get();
connect(qtCompositor, &QtCompositor::starting,
- this, &ScreensModel::onCompositorStarting);
+ this, &ScreensModel::onCompositorStarting, Qt::DirectConnection);
connect(qtCompositor, &QtCompositor::stopping,
this, &ScreensModel::onCompositorStopping, Qt::BlockingQueuedConnection);
--
GitLab
From 58a62d2f9df559cb084a3243aafbd52098e78210 Mon Sep 17 00:00:00 2001
From: Azkali Manad <a.ffcc7@gmail.com>
Date: Sun, 8 Feb 2026 14:20:37 +0700
Subject: [PATCH 3/4] src: platforms: Do not composite again on running
compositor also compare scaled logical size with physical size as sometime
the logical size is not correctly mapped during init
---
src/platforms/mirserver/screensmodel.cpp | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/src/platforms/mirserver/screensmodel.cpp b/src/platforms/mirserver/screensmodel.cpp
index ab0b78c3..b5ab1256 100644
--- a/src/platforms/mirserver/screensmodel.cpp
+++ b/src/platforms/mirserver/screensmodel.cpp
@@ -125,6 +125,11 @@ void ScreensModel::updateInternal()
{
DEBUG_MSG << "()";
+ if (m_compositing) {
+ DEBUG_MSG << "updateInternal() ignored while compositing";
+ return;
+ }
+
const bool wasCompositing = m_compositing;
auto display = m_display.lock();
@@ -204,7 +209,21 @@ void ScreensModel::updateInternal()
sink.view_area().size.height.as_int());
Q_FOREACH (auto screen, m_screenList) {
- if (dbGeom == screen->geometry()) {
+ QSize logical = screen->geometry().size();
+ qreal scale = screen->scale();
+
+ QRect physical(
+ screen->geometry().x(),
+ screen->geometry().y(),
+ logical.width() / scale,
+ logical.height() / scale
+ );
+
+ qCDebug(QTMIR_SCREENS) << "Comparing sink physical geom" << dbGeom
+ << "to screen physical geom" << physical;
+
+ if (dbGeom == physical)
+ {
// Find suitable glProvider
std::pair<mg::probe::Result, std::shared_ptr<mg::GLRenderingProvider>> best_provider = std::make_pair(mg::probe::unsupported, nullptr);
--
GitLab
From ba38a00b3eba6822b0c27c0f05729f44dfb10f33 Mon Sep 17 00:00:00 2001
From: Azkali <a.ffcc7@gmail.com>
Date: Mon, 16 Feb 2026 09:14:39 +0700
Subject: [PATCH 4/4] src: platforms: Remove guard producing dead code; use
caching instead
---
src/platforms/mirserver/platformscreen.cpp | 9 +++++++--
src/platforms/mirserver/platformscreen.h | 1 +
src/platforms/mirserver/screensmodel.cpp | 5 -----
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/platforms/mirserver/platformscreen.cpp b/src/platforms/mirserver/platformscreen.cpp
index d27ce391..eb73aa08 100644
--- a/src/platforms/mirserver/platformscreen.cpp
+++ b/src/platforms/mirserver/platformscreen.cpp
@@ -490,8 +490,13 @@ void PlatformScreen::removeWindow(ScreenPlatformWindow *window)
#if MIR_SERVER_VERSION >= MIR_VERSION_NUMBER(2, 20, 0)
void PlatformScreen::setMirDisplaySink(mir::graphics::GLRenderingProvider &glProvider, mir::graphics::DisplaySink *sink, mir::graphics::DisplaySyncGroup *group)
{
- m_outputSurface = glProvider.surface_for_sink(*sink, MirGLConfig{});
- DEBUG_MSG_SCREENS << "(outputSurface=" << m_outputSurface.get() << ", outputSink=" << sink << ", displayGroup=" << group << ")";
+ if (sink != m_lastDisplaySink) {
+ m_outputSurface = glProvider.surface_for_sink(*sink, MirGLConfig{});
+ m_lastDisplaySink = sink;
+ DEBUG_MSG_SCREENS << "(outputSurface=" << m_outputSurface.get() << ", outputSink=" << sink << ", displayGroup=" << group << ") [new sink]";
+ } else {
+ DEBUG_MSG_SCREENS << "(outputSurface=" << m_outputSurface.get() << ", outputSink=" << sink << ", displayGroup=" << group << ") [cached sink]";
+ }
// This operation should only be performed while rendering is stopped
m_displaySink = sink;
m_displayGroup = group;
diff --git a/src/platforms/mirserver/platformscreen.h b/src/platforms/mirserver/platformscreen.h
index be78e68e..66657d16 100644
--- a/src/platforms/mirserver/platformscreen.h
+++ b/src/platforms/mirserver/platformscreen.h
@@ -174,6 +174,7 @@ private:
#if MIR_SERVER_VERSION >= MIR_VERSION_NUMBER(2, 20, 0)
std::unique_ptr<mir::graphics::gl::OutputSurface> m_outputSurface;
mir::graphics::DisplaySink *m_displaySink;
+ mir::graphics::DisplaySink *m_lastDisplaySink = nullptr;
#else
mir::renderer::gl::RenderTarget *m_renderTarget;
#endif
diff --git a/src/platforms/mirserver/screensmodel.cpp b/src/platforms/mirserver/screensmodel.cpp
index b5ab1256..7f8962c6 100644
--- a/src/platforms/mirserver/screensmodel.cpp
+++ b/src/platforms/mirserver/screensmodel.cpp
@@ -125,11 +125,6 @@ void ScreensModel::updateInternal()
{
DEBUG_MSG << "()";
- if (m_compositing) {
- DEBUG_MSG << "updateInternal() ignored while compositing";
- return;
- }
-
const bool wasCompositing = m_compositing;
auto display = m_display.lock();
--
GitLab