From a721540e6c8a4a57045ca147eeb102c3f1149b3a Mon Sep 17 00:00:00 2001 From: Isak05 <51046377+Isak05@users.noreply.github.com> Date: Sun, 27 Apr 2025 09:02:52 +0200 Subject: [PATCH] Fix preview not opening on Wayland Deferring the opening of the preview slightly gives the preview select dialog time to close and for focus to shift back to the main window. PR #22608. Closes #22607. --------- Co-authored-by: Vladimir Golovnev --- src/gui/transferlistwidget.cpp | 20 ++++++++++++-------- src/gui/transferlistwidget.h | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/gui/transferlistwidget.cpp b/src/gui/transferlistwidget.cpp index cd6b44653..f553f5c6b 100644 --- a/src/gui/transferlistwidget.cpp +++ b/src/gui/transferlistwidget.cpp @@ -311,10 +311,7 @@ void TransferListWidget::torrentDoubleClicked() case PREVIEW_FILE: if (torrentContainsPreviewableFiles(torrent)) { - auto *dialog = new PreviewSelectDialog(this, torrent); - dialog->setAttribute(Qt::WA_DeleteOnClose); - connect(dialog, &PreviewSelectDialog::readyToPreviewFile, this, &TransferListWidget::previewFile); - dialog->show(); + openPreviewSelectDialog(torrent); } else { @@ -616,10 +613,7 @@ void TransferListWidget::previewSelectedTorrents() { if (torrentContainsPreviewableFiles(torrent)) { - auto *dialog = new PreviewSelectDialog(this, torrent); - dialog->setAttribute(Qt::WA_DeleteOnClose); - connect(dialog, &PreviewSelectDialog::readyToPreviewFile, this, &TransferListWidget::previewFile); - dialog->show(); + openPreviewSelectDialog(torrent); } else { @@ -1448,3 +1442,13 @@ void TransferListWidget::wheelEvent(QWheelEvent *event) QTreeView::wheelEvent(event); // event delegated to base class } + +void TransferListWidget::openPreviewSelectDialog(const BitTorrent::Torrent *torrent) +{ + auto *dialog = new PreviewSelectDialog(this, torrent); + dialog->setAttribute(Qt::WA_DeleteOnClose); + // Qt::QueuedConnection is required to prevent a bug on wayland compositors where the preview won't open. + // It occurs when the window focus shifts immediately after TransferListWidget::previewFile has been called. + connect(dialog, &PreviewSelectDialog::readyToPreviewFile, this, &TransferListWidget::previewFile, Qt::QueuedConnection); + dialog->show(); +} diff --git a/src/gui/transferlistwidget.h b/src/gui/transferlistwidget.h index c5b24ba24..097dd809a 100644 --- a/src/gui/transferlistwidget.h +++ b/src/gui/transferlistwidget.h @@ -123,6 +123,7 @@ private: void dragMoveEvent(QDragMoveEvent *event) override; void dropEvent(QDropEvent *event) override; void wheelEvent(QWheelEvent *event) override; + void openPreviewSelectDialog(const BitTorrent::Torrent *torrent); QModelIndex mapToSource(const QModelIndex &index) const; QModelIndexList mapToSource(const QModelIndexList &indexes) const; QModelIndex mapFromSource(const QModelIndex &index) const;