On Tue, 12 Aug 2025 07:48:53 +0000
Axel Spoerl via Development <development@qt-project.org> wrote:

> 
> > Yes, any code wiling to raise the window in the application uses the
> > mentioned method that does setWindowState, setVisible, raise and
> > activateWindow in a row. It's convenient since you don't have to
> > think which state the window is in to raise it.
> 
> Thanks, @Ilya Fedin<mailto:fedin-ilja2...@ya.ru>.
> One reason why it happens in autotests is: Events have to be
> processed explicitly in Qt, while the XCB thread is doing its own
> business. If it the race / activation drop occurs in an application,
> that needs to be fixed. Do you have a bug report / reprocer to look
> at?
> 
> Confidential
> ________________________________
> From: Ilya Fedin <fedin-ilja2...@ya.ru>
> Sent: Tuesday, 12 August 2025 09:23
> To: Axel Spoerl via Development <development@qt-project.org>
> Cc: Axel Spoerl <axel.spo...@qt.io>
> Subject: Re: [Development] Calling QWindow::requestActivate after
> QWindow::show and before QTest::qWaitForWindowActive
> 
> On Tue, 12 Aug 2025 07:07:57 +0000
> Axel Spoerl via Development <development@qt-project.org> wrote:
> 
> > Good morning and thanks to Mitch for initiating this discussion!
> >
> > QWindow::requestActivate() returns early with a warning, if the
> > window in question doesn't accept focus. In all other cases, it
> > dispatches to virtual QPlatformWindow::requestActivateWindow(),
> > which can be overridden in each platform implementation.
> >
> >   *
> > The default implementation dispatches to
> > QWindowSystemInterface::handleFocusWindowChanged(). It causes Qt to
> > treat the given window as the focus window, without acting on
> > platform level. * XCB: Sends an NET_ACTIVE_WINDOW if the window is
> > toplevel, otherwise XCB_INPUT_FOCUS_PARENT, to its parent. QXcb
> > implementation deferres the activation if the window is unmapped.
> > That's where data races might occur. They are typically harmless in
> > an application, where the mouse is busy moving and a "forgotten
> > event" is hardly noticed. * Windows: The win APIs BringWindowToTop()
> > and SetActiveWindow() are called on the native handle after some
> > sanity checks. * MacOS: The native window is made key window and
> > first responder. * Wayland: The wayland XDG shell sends an
> > activation request to the shell, the normal wayland shell does a
> > no-op. * To my knowledge, the eglfs amd off screen implementations
> > also implement platform specific activation.
> >
> > => Whenever a window is already active, requestActivate() neither
> > hurts nor does it anything useful. It may trigger a race on XCB just
> > after show(), which causes the activation to be dropped. I have only
> > seen that in autotests. It would be interesting to examine the bug
> > that Ilya has seen. If the described scenario causes a show() and
> > requestActivate() just after each other, we indeed might have an
> > issue.
> 
> Yes, any code wiling to raise the window in the application uses the
> mentioned method that does setWindowState, setVisible, raise and
> activateWindow in a row. It's convenient since you don't have to think
> which state the window is in to raise it.
> 
> >
> > Our existing autotests implement different use cases with and
> > without QWindow::requestActivate(). A few examples:
> >
> >   *
> > tst_QWindow::positioning() expects activation after
> > QWindow::showNormal(), without calling requestActivate(). That's
> > what Mitch and I are referring to. The call isn't needed if the one
> > and only window around is shown. * tst_QWindow::activateAndClose()
> > calls showNormal() followed by requestActivate(). It has failed on
> > 35 integrations this year on Ubuntu. I can reproduce that. The test
> > always passes on XCB, when requestActivate() is removed. That's the
> > race condition Mitch and I were discussing.
> >
> > That said, IMHO
> >
> >   *
> > The usage of requestActivate() following a show() in an autotest
> > should be explained / commented. Reviewers should ask for such
> > explanation. * The calls can't be removed en masse and light hearted
> > from autotests. Removals have to be evaluated case by case. *
> > Let's remove if it fixes flakiness and doesn't hurt the test
> > otherwise.
> >
> >
> > Cheers
> > Axel
> >
> > Confidential
> > ________________________________
> > From: Development <development-boun...@qt-project.org> on behalf of
> > EXT Mitch Curtis via Development <development@qt-project.org> Sent:
> > Tuesday, 12 August 2025 07:29 To: David C. Partridge
> > <david.partri...@perdrix.co.uk>; development@qt-project.org
> > <development@qt-project.org> Subject: Re: [Development] Calling
> > QWindow::requestActivate after QWindow::show and before
> > QTest::qWaitForWindowActive
> >
> >
> > First we need to agree on whether or not this is the right thing to
> > do. If we agree that it is, then we should absolutely do that.
> > That’s what I was advocating for in my comments on the change, too.
> >
> >
> >
> >
> > Confidential
> >
> > From: David C. Partridge <david.partri...@perdrix.co.uk>
> > Date: Tuesday, 12 August 2025 at 12:15
> > To: EXT Mitch Curtis <mitch.cur...@qt.io>
> > Subject: RE: [Development] Calling QWindow::requestActivate after
> > QWindow::show and before QTest::qWaitForWindowActive
> >
> > Shouldn't some words about this be added to the user documentation
> > to tell us not to do that...
> >
> > D.
> >
> > -----Original Message-----
> > From: Development <development-boun...@qt-project.org> On Behalf Of
> > EXT Mitch Curtis via Development
> > Sent: 12 August 2025 01:53
> > To: Qt Development <development@qt-project.org>
> > Subject: [Development] Calling QWindow::requestActivate after
> > QWindow::show and before QTest::qWaitForWindowActive
> >
> > Hi,
> >
> > There's a discussion on
> > https://codereview.qt-project.org/c/qt/qtdeclarative/+/666818 about
> > whether we can standardise (by documenting in some form) that we
> > shouldn't call requestActivate before qWaitForWindowActive.
> > Essentially, existing code in tests looks like this:
> >
> >     window->show();
> >     window->requestActivate();
> >     QVERIFY(QTest::qWaitForWindowActive(window.data()));
> >
> > And would become this:
> >
> >     window->show();
> >     QVERIFY(QTest::qWaitForWindowActive(window.data()));
> >
> > As Axel has explained, this causes race conditions on XCB, and
> > apparently is redundant on all platforms:
> >
> > > To begin with, an autotest should be as close as possible to a
> > > real world
> > scenario.
> > > When the only window around is being shown, it is automatically
> > > activated.
> > The additional window->requestActivate() redundant and not a real
> > world scenario. This alone justifies its removal.
> >
> > I'd like to get agreement that this is the right thing to do on all
> > platforms before proceeding (and then removing it en masse).
> >
> > Cheers.
> >
> > Confidential
> > --
> > Development mailing list
> > Development@qt-project.org
> > https://lists.qt-project.org/listinfo/development
> 

No, as I already said, I'm unable to make a reproducer (and thus
report) due to the flaky nature of the bug.
-- 
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to