diff options
Diffstat (limited to 'ui/qt/utils/qt_ui_utils.cpp')
-rw-r--r-- | ui/qt/utils/qt_ui_utils.cpp | 116 |
1 files changed, 64 insertions, 52 deletions
diff --git a/ui/qt/utils/qt_ui_utils.cpp b/ui/qt/utils/qt_ui_utils.cpp index 9dad9dd9..addfe208 100644 --- a/ui/qt/utils/qt_ui_utils.cpp +++ b/ui/qt/utils/qt_ui_utils.cpp @@ -17,15 +17,13 @@ #include <epan/range.h> #include <epan/to_str.h> #include <epan/value_string.h> -#include <epan/prefs.h> #include <ui/recent.h> #include <ui/util.h> #include "ui/ws_ui_util.h" #include <wsutil/str_util.h> - -#include <ui/qt/main_application.h> +#include <wsutil/file_util.h> #include <QAction> #include <QApplication> @@ -36,24 +34,31 @@ #include <QFontDatabase> #include <QProcess> #include <QUrl> -#include <QUuid> #include <QScreen> +#if defined(Q_OS_MAC) +#include <ui/macosx/cocoa_bridge.h> +#elif !defined(Q_OS_WIN) && defined(QT_DBUS_LIB) +#include <QtDBus/QDBusConnection> +#include <QtDBus/QDBusMessage> +#include <QtDBus/QDBusUnixFileDescriptor> +#endif + /* * We might want to create our own "wsstring" class with convenience * methods for handling g_malloc()ed strings, GStrings, and a shortcut * to .toUtf8().constData(). */ -gchar *qstring_strdup(QString q_string) { - return g_strdup(q_string.toUtf8().constData()); +char *qstring_strdup(QString q_string) { + return g_strdup(qUtf8Printable(q_string)); } -QString gchar_free_to_qstring(gchar *glib_string) { +QString gchar_free_to_qstring(char *glib_string) { return QString(gchar_free_to_qbytearray(glib_string)); } -QByteArray gchar_free_to_qbytearray(gchar *glib_string) +QByteArray gchar_free_to_qbytearray(char *glib_string) { QByteArray qt_bytearray(glib_string); g_free(glib_string); @@ -70,7 +75,7 @@ QByteArray gstring_free_to_qbytearray(GString *glib_gstring) QByteArray gbytearray_free_to_qbytearray(GByteArray *glib_array) { QByteArray qt_ba(reinterpret_cast<char *>(glib_array->data), glib_array->len); - g_byte_array_free(glib_array, TRUE); + g_byte_array_free(glib_array, true); return qt_ba; } @@ -101,7 +106,7 @@ const QString address_to_qstring(const _address *address, bool enclose) QString address_qstr = QString(); if (address) { if (enclose && address->type == AT_IPv6) address_qstr += "["; - gchar *address_gchar_p = address_to_str(NULL, address); + char *address_gchar_p = address_to_str(NULL, address); address_qstr += address_gchar_p; wmem_free(NULL, address_gchar_p); if (enclose && address->type == AT_IPv6) address_qstr += "]"; @@ -113,27 +118,27 @@ const QString address_to_display_qstring(const _address *address) { QString address_qstr = QString(); if (address) { - gchar *address_gchar_p = address_to_display(NULL, address); + char *address_gchar_p = address_to_display(NULL, address); address_qstr = address_gchar_p; wmem_free(NULL, address_gchar_p); } return address_qstr; } -const QString val_to_qstring(const guint32 val, const value_string *vs, const char *fmt) +const QString val_to_qstring(const uint32_t val, const value_string *vs, const char *fmt) { QString val_qstr; - gchar* gchar_p = val_to_str_wmem(NULL, val, vs, fmt); + char* gchar_p = val_to_str_wmem(NULL, val, vs, fmt); val_qstr = gchar_p; wmem_free(NULL, gchar_p); return val_qstr; } -const QString val_ext_to_qstring(const guint32 val, value_string_ext *vse, const char *fmt) +const QString val_ext_to_qstring(const uint32_t val, value_string_ext *vse, const char *fmt) { QString val_qstr; - gchar* gchar_p = val_to_str_ext_wmem(NULL, val, vse, fmt); + char* gchar_p = val_to_str_ext_wmem(NULL, val, vse, fmt); val_qstr = gchar_p; wmem_free(NULL, gchar_p); @@ -155,7 +160,7 @@ const QString bits_s_to_qstring(const double bits_s) format_size(bits_s, FORMAT_SIZE_UNIT_NONE, FORMAT_SIZE_PREFIX_SI)); } -const QString file_size_to_qstring(const gint64 size) +const QString file_size_to_qstring(const int64_t size) { return gchar_free_to_qstring( format_size(size, FORMAT_SIZE_UNIT_BYTES, FORMAT_SIZE_PREFIX_SI)); @@ -209,28 +214,55 @@ void desktop_show_in_folder(const QString file_path) // https://stackoverflow.com/questions/3490336/how-to-reveal-in-finder-or-show-in-explorer-with-qt #if defined(Q_OS_WIN) + // + // See + // + // https://stackoverflow.com/questions/13680415/how-to-open-explorer-with-a-specific-file-selected + // + // for a way to do this using Windows Shell APIs, rather than having + // to fire up a separate instance of Windows Explorer. + // QString command = "explorer.exe"; QStringList arguments; QString path = QDir::toNativeSeparators(file_path); arguments << "/select," << path + ""; success = QProcess::startDetached(command, arguments); #elif defined(Q_OS_MAC) - QStringList script_args; - QString escaped_path = file_path; - - escaped_path.replace('"', "\\\""); - script_args << "-e" - << QString("tell application \"Finder\" to reveal POSIX file \"%1\"") - .arg(escaped_path); - if (QProcess::execute("/usr/bin/osascript", script_args) == 0) { - success = true; - script_args.clear(); - script_args << "-e" - << "tell application \"Finder\" to activate"; - QProcess::execute("/usr/bin/osascript", script_args); + CocoaBridge::showInFinder(file_path.toUtf8()); + success = true; +#elif defined(QT_DBUS_LIB) + // First, try the FileManager1 DBus interface's "ShowItems" method. + // https://www.freedesktop.org/wiki/Specifications/file-manager-interface/ + QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.FileManager1"), + QLatin1String("/org/freedesktop/FileManager1"), + QLatin1String("org.freedesktop.FileManager1"), + QLatin1String("ShowItems")); + QStringList uris(QUrl::fromLocalFile(file_path).toString()); + message << uris << QString(); + + message = QDBusConnection::sessionBus().call(message); + success = message.type() == QDBusMessage::ReplyMessage; + + // If that failed, perhaps we are sandboxed. Try using Portal Services. + // https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.OpenURI.html + if (!success) { + const int fd = ws_open(QFile::encodeName(file_path), O_CLOEXEC | O_PATH, 0000); + if (fd != -1) { + QDBusUnixFileDescriptor descriptor; + descriptor.giveFileDescriptor(fd); + QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), + QLatin1String("/org/freedesktop/portal/desktop"), + QLatin1String("org.freedesktop.portal.OpenURI"), + QLatin1String("OpenDirectory")); + message << QString() << QVariant::fromValue(descriptor) << QVariantMap(); + + message = QDBusConnection::sessionBus().call(message); + success = message.type() == QDBusMessage::ReplyMessage; + ws_close(fd); + } } #else - // Is there a way to highlight the file using xdg-open? + // Any other possibilities to highlight the file before falling back to showing the folder? #endif if (!success) { QFileInfo file_info(file_path); @@ -251,7 +283,7 @@ bool rect_on_screen(const QRect &rect) void set_action_shortcuts_visible_in_context_menu(QList<QAction *> actions) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0) && QT_VERSION < QT_VERSION_CHECK(5, 13, 0) +#if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) // For QT_VERSION >= 5.13.0 we call styleHints()->setShowShortcutsInContextMenus(true) // in WiresharkApplication. // QTBUG-71471 @@ -310,27 +342,7 @@ QString openDialogInitialDir() { QString result; - switch (prefs.gui_fileopen_style) { - - case FO_STYLE_LAST_OPENED: - /* The user has specified that we should start out in the last directory - we looked in. If we've already opened a file, use its containing - directory, if we could determine it, as the directory, otherwise - use the "last opened" directory saved in the preferences file if - there was one. */ - /* This is now the default behaviour in file_selection_new() */ - result = QString(get_open_dialog_initial_dir()); - break; - - case FO_STYLE_SPECIFIED: - /* The user has specified that we should always start out in a - specified directory; if they've specified that directory, - start out by showing the files in that dir. */ - if (prefs.gui_fileopen_dir[0] != '\0') - result = QString(prefs.gui_fileopen_dir); - break; - } - + result = QString(get_open_dialog_initial_dir()); QDir ld(result); if (ld.exists()) return result; |