Ensure we quickly show/hide the systray window on startup

This is quick enough that no flickering should appear in practice.

We end up doing this because for some reason on Windows (I dug up deep
into the Windows QPA without nailing it down) not showing that systray
window at least once prevents the app object to return from exec() when
the session ends.

It's as if that window would be in some limbo state (neither opened nor
closed) which would prevent quitting. Clearly what we're doing here is a
workaround...

Signed-off-by: Kevin Ottens <kevin.ottens@nextcloud.com>
This commit is contained in:
Kevin Ottens 2020-10-22 12:39:40 +02:00 committed by Camila (Rebase PR Action)
parent 802d27ed0f
commit 24964e2b9b
3 changed files with 12 additions and 0 deletions

View file

@ -206,6 +206,15 @@ void Systray::positionWindow(QQuickWindow *window) const
window->setPosition(position);
}
void Systray::forceWindowInit(QQuickWindow *window) const
{
// HACK: At least on Windows, if the systray window is not shown at least once
// it can prevent session handling to carry on properly, so we show/hide it here
// this shouldn't flicker
window->show();
window->hide();
}
QScreen *Systray::currentScreen() const
{
const auto screens = QGuiApplication::screens();

View file

@ -57,6 +57,7 @@ public:
Q_INVOKABLE void setOpened();
Q_INVOKABLE void setClosed();
Q_INVOKABLE void positionWindow(QQuickWindow *window) const;
Q_INVOKABLE void forceWindowInit(QQuickWindow *window) const;
signals:
void currentUserChanged();

View file

@ -24,6 +24,8 @@ Window {
Accessible.role: Accessible.Application
Accessible.name: qsTr("Nextcloud desktop main dialog")
Component.onCompleted: Systray.forceWindowInit(trayWindow)
// Close tray window when focus is lost (e.g. click somewhere else on the screen)
onActiveChanged: {
if(!active) {