summaryrefslogtreecommitdiffstats
path: root/src/plugins/platformthemes
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platformthemes')
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3menu.cpp9
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.cpp17
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.h2
3 files changed, 24 insertions, 4 deletions
diff --git a/src/plugins/platformthemes/gtk3/qgtk3menu.cpp b/src/plugins/platformthemes/gtk3/qgtk3menu.cpp
index 0b67739095..ec4ff68e8d 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3menu.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3menu.cpp
@@ -41,6 +41,7 @@
#include <QtGui/qwindow.h>
#include <QtGui/qpa/qplatformtheme.h>
+#include <QtGui/qpa/qplatformwindow.h>
#undef signals
#include <gtk/gtk.h>
@@ -426,9 +427,11 @@ void QGtk3Menu::showPopup(const QWindow *parentWindow, const QRect &targetRect,
if (index != -1)
gtk_menu_set_active(GTK_MENU(m_menu), index);
- m_targetPos = targetRect.bottomLeft();
- if (parentWindow)
- m_targetPos = parentWindow->mapToGlobal(m_targetPos);
+ m_targetPos = QPoint(targetRect.x(), targetRect.y() + targetRect.height());
+
+ QPlatformWindow *pw = parentWindow ? parentWindow->handle() : nullptr;
+ if (pw)
+ m_targetPos = pw->mapToGlobal(m_targetPos);
gtk_menu_popup(GTK_MENU(m_menu), NULL, NULL, qt_gtk_menu_position_func, this, 0, gtk_get_current_event_time());
}
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
index 6447776f25..077955eb4e 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
@@ -153,7 +153,7 @@ bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const
case ColorDialog:
return true;
case FileDialog:
- return true;
+ return useNativeFileDialog();
case FontDialog:
return true;
default:
@@ -167,6 +167,8 @@ QPlatformDialogHelper *QGtk3Theme::createPlatformDialogHelper(DialogType type) c
case ColorDialog:
return new QGtk3ColorDialogHelper;
case FileDialog:
+ if (!useNativeFileDialog())
+ return nullptr;
return new QGtk3FileDialogHelper;
case FontDialog:
return new QGtk3FontDialogHelper;
@@ -185,4 +187,17 @@ QPlatformMenuItem* QGtk3Theme::createPlatformMenuItem() const
return new QGtk3MenuItem;
}
+bool QGtk3Theme::useNativeFileDialog()
+{
+ /* Require GTK3 >= 3.15.5 to avoid running into this bug:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=725164
+ *
+ * While this bug only occurs when using widget-based file dialogs
+ * (native GTK3 dialogs are fine) we have to disable platform file
+ * dialogs entirely since we can't avoid creation of a platform
+ * dialog helper.
+ */
+ return gtk_check_version(3, 15, 5) == 0;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.h b/src/plugins/platformthemes/gtk3/qgtk3theme.h
index 8f03b84bb6..54296d2ff1 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.h
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.h
@@ -59,6 +59,8 @@ public:
QPlatformMenuItem* createPlatformMenuItem() const override;
static const char *name;
+private:
+ static bool useNativeFileDialog();
};
QT_END_NAMESPACE