From f011c84ce83b9bd69002e9679484a558f284152b Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 23 Jun 2021 03:20:40 +0400 Subject: [PATCH] Make Linux file dialog API better --- .../platform/linux/file_utilities_linux.cpp | 22 ++++++++++--------- .../platform/linux/linux_gtk_file_dialog.cpp | 21 ++++++++---------- .../platform/linux/linux_gtk_file_dialog.h | 7 ++---- .../platform/linux/linux_gtk_integration.cpp | 8 ++----- .../platform/linux/linux_gtk_integration.h | 7 ++---- .../linux/linux_gtk_integration_dummy.cpp | 10 +++------ .../platform/linux/linux_xdp_file_dialog.cpp | 12 +++++----- .../platform/linux/linux_xdp_file_dialog.h | 5 +---- 8 files changed, 38 insertions(+), 54 deletions(-) diff --git a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp index 7f272b9ca..f052228cb 100644 --- a/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp +++ b/Telegram/SourceFiles/platform/linux/file_utilities_linux.cpp @@ -171,7 +171,7 @@ bool Get( parent = parent->window(); } #ifndef DESKTOP_APP_DISABLE_DBUS_INTEGRATION - if (XDP::Use(type)) { + { const auto result = XDP::Get( parent, files, @@ -187,15 +187,17 @@ bool Get( } #endif // !DESKTOP_APP_DISABLE_DBUS_INTEGRATION if (const auto integration = GtkIntegration::Instance()) { - if (integration->useFileDialog(type)) { - return integration->getFileDialog( - parent, - files, - remoteContent, - caption, - filter, - type, - startFile); + const auto result = integration->getFileDialog( + parent, + files, + remoteContent, + caption, + filter, + type, + startFile); + + if (result.has_value()) { + return *result; } } // avoid situation when portals don't work diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.cpp b/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.cpp index 1c0039365..a49811edc 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.cpp @@ -22,10 +22,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace Platform { namespace FileDialog { namespace Gtk { +namespace { using namespace Platform::Gtk; - -namespace { +using Type = ::FileDialog::internal::Type; // GTK file chooser image preview: thanks to Chromium @@ -640,16 +640,7 @@ void GtkFileDialog::setNameFilters(const QStringList &filters) { } // namespace -bool Use(Type type) { - if (!Supported()) { - return false; - } - - return qEnvironmentVariableIsSet("TDESKTOP_USE_GTK_FILE_DIALOG") - || DesktopEnvironment::IsGtkBased(); -} - -bool Get( +std::optional Get( QPointer parent, QStringList &files, QByteArray &remoteContent, @@ -657,6 +648,12 @@ bool Get( const QString &filter, Type type, QString startFile) { + if (!Supported() + || (!qEnvironmentVariableIsSet("TDESKTOP_USE_GTK_FILE_DIALOG") + && !DesktopEnvironment::IsGtkBased())) { + return std::nullopt; + } + if (cDialogLastPath().isEmpty()) { InitLastPath(); } diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.h b/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.h index 070bfd74a..b12c7f415 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.h +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_file_dialog.h @@ -13,16 +13,13 @@ namespace Platform { namespace FileDialog { namespace Gtk { -using Type = ::FileDialog::internal::Type; - -bool Use(Type type = Type::ReadFile); -bool Get( +std::optional Get( QPointer parent, QStringList &files, QByteArray &remoteContent, const QString &caption, const QString &filter, - Type type, + ::FileDialog::internal::Type type, QString startFile); } // namespace Gtk diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp index 00b67e152..8fb76c3ac 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp @@ -158,17 +158,13 @@ std::optional GtkIntegration::scaleFactor() const { return gdk_monitor_get_scale_factor(monitor); } -bool GtkIntegration::useFileDialog(FileDialogType type) const { - return FileDialog::Gtk::Use(type); -} - -bool GtkIntegration::getFileDialog( +std::optional GtkIntegration::getFileDialog( QPointer parent, QStringList &files, QByteArray &remoteContent, const QString &caption, const QString &filter, - FileDialogType type, + ::FileDialog::internal::Type type, QString startFile) const { return FileDialog::Gtk::Get( parent, diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.h b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.h index 623db1498..e1ff44e63 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.h +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.h @@ -20,16 +20,13 @@ public: [[nodiscard]] std::optional scaleFactor() const; - using FileDialogType = ::FileDialog::internal::Type; - [[nodiscard]] bool useFileDialog( - FileDialogType type = FileDialogType::ReadFile) const; - [[nodiscard]] bool getFileDialog( + [[nodiscard]] std::optional getFileDialog( QPointer parent, QStringList &files, QByteArray &remoteContent, const QString &caption, const QString &filter, - FileDialogType type, + ::FileDialog::internal::Type type, QString startFile) const; [[nodiscard]] bool showOpenWithDialog(const QString &filepath) const; diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration_dummy.cpp b/Telegram/SourceFiles/platform/linux/linux_gtk_integration_dummy.cpp index f5b5695e6..a0dfb2ba0 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration_dummy.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration_dummy.cpp @@ -24,19 +24,15 @@ std::optional GtkIntegration::scaleFactor() const { return std::nullopt; } -bool GtkIntegration::useFileDialog(FileDialogType type) const { - return false; -} - -bool GtkIntegration::getFileDialog( +std::optional GtkIntegration::getFileDialog( QPointer parent, QStringList &files, QByteArray &remoteContent, const QString &caption, const QString &filter, - FileDialogType type, + ::FileDialog::internal::Type type, QString startFile) const { - return false; + return std::nullopt; } bool GtkIntegration::showOpenWithDialog(const QString &filepath) const { diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp index 543908f24..dba19e1ad 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.cpp @@ -28,6 +28,8 @@ namespace FileDialog { namespace XDP { namespace { +using Type = ::FileDialog::internal::Type; + constexpr auto kXDGDesktopPortalService = "org.freedesktop.portal.Desktop"_cs; constexpr auto kXDGDesktopPortalObjectPath = "/org/freedesktop/portal/desktop"_cs; constexpr auto kXDGDesktopPortalFileChooserInterface = "org.freedesktop.portal.FileChooser"_cs; @@ -703,11 +705,6 @@ void Start() { ComputeFileChooserPortalVersion(); } -bool Use(Type type) { - return FileChooserPortalVersion.has_value() - && (type != Type::ReadFolder || *FileChooserPortalVersion >= 3); -} - std::optional Get( QPointer parent, QStringList &files, @@ -716,6 +713,11 @@ std::optional Get( const QString &filter, Type type, QString startFile) { + if (!FileChooserPortalVersion.has_value() + || (type == Type::ReadFolder && *FileChooserPortalVersion < 3)) { + return std::nullopt; + } + static const auto docRegExp = QRegularExpression("^/run/user/\\d+/doc"); if (cDialogLastPath().isEmpty() || cDialogLastPath().contains(docRegExp)) { diff --git a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h index f1ca9603a..369fc8fea 100644 --- a/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h +++ b/Telegram/SourceFiles/platform/linux/linux_xdp_file_dialog.h @@ -13,17 +13,14 @@ namespace Platform { namespace FileDialog { namespace XDP { -using Type = ::FileDialog::internal::Type; - void Start(); -bool Use(Type type = Type::ReadFile); std::optional Get( QPointer parent, QStringList &files, QByteArray &remoteContent, const QString &caption, const QString &filter, - Type type, + ::FileDialog::internal::Type type, QString startFile); } // namespace XDP