Blob Blame History Raw
diff --git a/common/common.pro b/common/common.pro
index c244613..99bb9e3 100644
--- a/common/common.pro
+++ b/common/common.pro
@@ -8,7 +8,6 @@ CONFIG += c++11 \
 QT += core \
       dbus \
       theme_support-private \
-      x11extras \
       widgets
 
 PKGCONFIG += gtk+-3.0 \
diff --git a/common/gnomehintssettings.cpp b/common/gnomehintssettings.cpp
index 4cc19b2..8a3b980 100644
--- a/common/gnomehintssettings.cpp
+++ b/common/gnomehintssettings.cpp
@@ -36,8 +36,6 @@
 #include <QDBusConnection>
 #include <QDBusMessage>
 
-#include <QX11Info>
-
 Q_LOGGING_CATEGORY(QGnomePlatform, "qt.qpa.qgnomeplatform")
 
 const QDBusArgument &operator>>(const QDBusArgument &argument, QMap<QString, QVariantMap> &map)
@@ -135,7 +133,7 @@ GnomeHintsSettings::GnomeHintsSettings()
                                               QStringLiteral("SettingChanged"), this, SLOT(portalSettingChanged(QString,QString,QDBusVariant)));
     }
 
-    if (!QX11Info::isPlatformX11())
+    if (QGuiApplication::platformName() != QStringLiteral("xcb"))
         cursorSizeChanged();
 
     loadFonts();
@@ -172,7 +170,7 @@ void GnomeHintsSettings::gsettingPropertyChanged(GSettings *settings, gchar *key
     } else if (changedProperty == QStringLiteral("monospace-font-name")) {
         gnomeHintsSettings->fontChanged();
     } else if (changedProperty == QStringLiteral("cursor-size")) {
-        if (!QX11Info::isPlatformX11())
+        if (QGuiApplication::platformName() != QStringLiteral("xcb"))
             gnomeHintsSettings->cursorSizeChanged();
     // Org.gnome.wm.preferences
     } else if (changedProperty == QStringLiteral("titlebar-font")) {
@@ -359,7 +357,7 @@ void GnomeHintsSettings::loadFonts()
             bool bold = false;
             int fontSize;
             QString name;
-            QRegExp re("(.+)[ \t]+([0-9]+)");
+            QRegExp re("^([^,]+)[, \t]+([0-9]+)$");
             if (re.indexIn(fontName) == 0) {
                 fontSize = re.cap(2).toInt();
                 name = re.cap(1);
diff --git a/common/gnomehintssettings.h b/common/gnomehintssettings.h
index 46580ff..2bce415 100644
--- a/common/gnomehintssettings.h
+++ b/common/gnomehintssettings.h
@@ -24,8 +24,10 @@
 #include <QFont>
 #include <QFlags>
 #include <QObject>
+#include <QPalette>
 #include <QVariant>
 
+#include <cmath>
 #include <memory>
 
 #undef signals
@@ -36,7 +38,6 @@
 
 #include <qpa/qplatformtheme.h>
 
-
 class GnomeHintsSettings : public QObject
 {
     Q_OBJECT
@@ -56,6 +57,73 @@ public:
     explicit GnomeHintsSettings();
     virtual ~GnomeHintsSettings();
 
+    // Borrowed from the KColorUtils code
+    static QColor mix(const QColor &c1, const QColor &c2, qreal bias = 0.5)
+    {
+        auto mixQreal = [](qreal a, qreal b, qreal bias) {
+            return a + (b - a) * bias;
+        };
+
+        if (bias <= 0.0)
+            return c1;
+        if (bias >= 1.0)
+            return c2;
+        if (std::isnan(bias))
+            return c1;
+
+        qreal r = mixQreal(c1.redF(),   c2.redF(),   bias);
+        qreal g = mixQreal(c1.greenF(), c2.greenF(), bias);
+        qreal b = mixQreal(c1.blueF(),  c2.blueF(),  bias);
+        qreal a = mixQreal(c1.alphaF(), c2.alphaF(), bias);
+
+        return QColor::fromRgbF(r, g, b, a);
+    }
+
+    static QColor lighten(const QColor &color, qreal amount = 0.1)
+    {
+        qreal h, s, l, a;
+        color.getHslF(&h, &s, &l, &a);
+
+        qreal lightness = l + amount;
+        if (lightness > 1)
+            lightness = 1;
+        return QColor::fromHslF(h, s, lightness, a);
+    }
+
+    static QColor darken(const QColor &color, qreal amount = 0.1)
+    {
+        qreal h, s, l, a;
+        color.getHslF(&h, &s, &l, &a);
+
+        qreal lightness = l - amount;
+        if (lightness < 0)
+            lightness = 0;
+
+        return QColor::fromHslF(h, s, lightness, a);
+    }
+
+    static QColor desaturate(const QColor &color, qreal amount = 0.1)
+    {
+        qreal h, s, l, a;
+        color.getHslF(&h, &s, &l, &a);
+
+        qreal saturation = s - amount;
+        if (saturation < 0)
+            saturation = 0;
+        return QColor::fromHslF(h, saturation, l, a);
+    }
+
+    static QColor transparentize(const QColor &color, qreal amount = 0.1)
+    {
+        qreal h, s, l, a;
+        color.getHslF(&h, &s, &l, &a);
+
+        qreal alpha = a - amount;
+        if (alpha < 0)
+            alpha = 0;
+        return QColor::fromHslF(h, s, l, alpha);
+    }
+
     inline QFont * font(QPlatformTheme::Font type) const
     {
         if (m_fonts.contains(type)) {
@@ -68,6 +136,198 @@ public:
         }
     }
 
+    inline QPalette * palette() const
+    {
+        QPalette *palette = new QPalette;
+
+        if (m_gtkThemeDarkVariant) {
+            // Colors defined in GTK adwaita style in _colors.scss
+            QColor base_color = lighten(desaturate(QColor("#241f31"), 1.0), 0.02);
+            QColor text_color = QColor("white");
+            QColor bg_color = darken(desaturate(QColor("#3d3846"), 1.0), 0.04);
+            QColor fg_color = QColor("#eeeeec");
+            QColor selected_bg_color = darken(QColor("#3584e4"), 0.2);
+            QColor selected_fg_color = QColor("white");
+            QColor osd_text_color = QColor("white");
+            QColor osd_bg_color = QColor("black");
+            QColor shadow = transparentize(QColor("black"), 0.9);
+
+            QColor backdrop_fg_color = mix(fg_color, bg_color);
+            QColor backdrop_base_color = lighten(base_color, 0.01);
+            QColor backdrop_selected_fg_color = mix(text_color, backdrop_base_color, 0.2);
+
+            // This is the color we use as initial color for the gradient in normal state
+            // Defined in _drawing.scss button(normal)
+            QColor button_base_color = darken(bg_color, 0.01);
+
+            QColor link_color = lighten(selected_bg_color, 0.2);
+            QColor link_visited_color = lighten(selected_bg_color, 0.1);
+
+            palette->setColor(QPalette::All,      QPalette::Window,          bg_color);
+            palette->setColor(QPalette::All,      QPalette::WindowText,      fg_color);
+            palette->setColor(QPalette::All,      QPalette::Base,            base_color);
+            palette->setColor(QPalette::All,      QPalette::AlternateBase,   base_color);
+            palette->setColor(QPalette::All,      QPalette::ToolTipBase,     osd_bg_color);
+            palette->setColor(QPalette::All,      QPalette::ToolTipText,     osd_text_color);
+            palette->setColor(QPalette::All,      QPalette::Text,            fg_color);
+            palette->setColor(QPalette::All,      QPalette::Button,          button_base_color);
+            palette->setColor(QPalette::All,      QPalette::ButtonText,      fg_color);
+            palette->setColor(QPalette::All,      QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::All,      QPalette::Light,           lighten(button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Midlight,        mix(lighten(button_base_color), button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Mid,             mix(darken(button_base_color), button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Dark,            darken(button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::All,      QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::All,      QPalette::HighlightedText, selected_fg_color);
+
+            palette->setColor(QPalette::All,      QPalette::Link,            link_color);
+            palette->setColor(QPalette::All,      QPalette::LinkVisited,     link_visited_color);
+
+
+            QColor insensitive_fg_color = mix(fg_color, bg_color);
+            QColor insensitive_bg_color = mix(bg_color, base_color, 0.4);
+
+            palette->setColor(QPalette::Disabled, QPalette::Window,          insensitive_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::WindowText,      insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::Base,            base_color);
+            palette->setColor(QPalette::Disabled, QPalette::AlternateBase,   base_color);
+            palette->setColor(QPalette::Disabled, QPalette::Text,            insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::Button,          insensitive_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::ButtonText,      insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::Disabled, QPalette::Light,           lighten(insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Midlight,        mix(lighten(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Mid,             mix(darken(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Dark,            darken(insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::Disabled, QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::HighlightedText, selected_fg_color);
+
+            palette->setColor(QPalette::Disabled, QPalette::Link,            link_color);
+            palette->setColor(QPalette::Disabled, QPalette::LinkVisited,     link_visited_color);
+
+
+            palette->setColor(QPalette::Inactive, QPalette::Window,          bg_color);
+            palette->setColor(QPalette::Inactive, QPalette::WindowText,      backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::Base,            backdrop_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::AlternateBase,   backdrop_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::Text,            backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::Button,          button_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::ButtonText,      backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::Inactive, QPalette::Light,           lighten(insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Midlight,        mix(lighten(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Mid,             mix(darken(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Dark,            darken(insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::Inactive, QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::Inactive, QPalette::HighlightedText, backdrop_selected_fg_color);
+
+            palette->setColor(QPalette::Inactive, QPalette::Link,            link_color);
+            palette->setColor(QPalette::Inactive, QPalette::LinkVisited,     link_visited_color);
+        } else {
+            // Colors defined in GTK adwaita style in _colors.scss
+            QColor base_color = QColor("white");
+            QColor text_color = QColor("black");
+            QColor bg_color = QColor("#f6f5f4");
+            QColor fg_color = QColor("#2e3436");
+            QColor selected_bg_color = QColor("#3584e4");
+            QColor selected_fg_color = QColor("white");
+            QColor osd_text_color = QColor("white");
+            QColor osd_bg_color = QColor("black");
+            QColor shadow = transparentize(QColor("black"), 0.9);
+
+            QColor backdrop_fg_color = mix(fg_color, bg_color);
+            QColor backdrop_base_color = darken(base_color, 0.01);
+            QColor backdrop_selected_fg_color = backdrop_base_color;
+
+            // This is the color we use as initial color for the gradient in normal state
+            // Defined in _drawing.scss button(normal)
+            QColor button_base_color = darken(bg_color, 0.04);
+
+            QColor link_color = darken(selected_bg_color, 0.1);
+            QColor link_visited_color = darken(selected_bg_color, 0.2);
+
+            palette->setColor(QPalette::All,      QPalette::Window,          bg_color);
+            palette->setColor(QPalette::All,      QPalette::WindowText,      fg_color);
+            palette->setColor(QPalette::All,      QPalette::Base,            base_color);
+            palette->setColor(QPalette::All,      QPalette::AlternateBase,   base_color);
+            palette->setColor(QPalette::All,      QPalette::ToolTipBase,     osd_bg_color);
+            palette->setColor(QPalette::All,      QPalette::ToolTipText,     osd_text_color);
+            palette->setColor(QPalette::All,      QPalette::Text,            fg_color);
+            palette->setColor(QPalette::All,      QPalette::Button,          button_base_color);
+            palette->setColor(QPalette::All,      QPalette::ButtonText,      fg_color);
+            palette->setColor(QPalette::All,      QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::All,      QPalette::Light,           lighten(button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Midlight,        mix(lighten(button_base_color), button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Mid,             mix(darken(button_base_color), button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Dark,            darken(button_base_color));
+            palette->setColor(QPalette::All,      QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::All,      QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::All,      QPalette::HighlightedText, selected_fg_color);
+
+            palette->setColor(QPalette::All,      QPalette::Link,            link_color);
+            palette->setColor(QPalette::All,      QPalette::LinkVisited,     link_visited_color);
+
+            QColor insensitive_fg_color = mix(fg_color, bg_color);
+            QColor insensitive_bg_color = mix(bg_color, base_color, 0.4);
+
+            palette->setColor(QPalette::Disabled, QPalette::Window,          insensitive_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::WindowText,      insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::Base,            base_color);
+            palette->setColor(QPalette::Disabled, QPalette::AlternateBase,   base_color);
+            palette->setColor(QPalette::Disabled, QPalette::Text,            insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::Button,          insensitive_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::ButtonText,      insensitive_fg_color);
+            palette->setColor(QPalette::Disabled, QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::Disabled, QPalette::Light,           lighten(insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Midlight,        mix(lighten(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Mid,             mix(darken(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Dark,            darken(insensitive_bg_color));
+            palette->setColor(QPalette::Disabled, QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::Disabled, QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::Disabled, QPalette::HighlightedText, selected_fg_color);
+
+            palette->setColor(QPalette::Disabled, QPalette::Link,            link_color);
+            palette->setColor(QPalette::Disabled, QPalette::LinkVisited,     link_visited_color);
+
+
+            palette->setColor(QPalette::Inactive, QPalette::Window,          bg_color);
+            palette->setColor(QPalette::Inactive, QPalette::WindowText,      backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::Base,            backdrop_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::AlternateBase,   backdrop_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::Text,            backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::Button,          button_base_color);
+            palette->setColor(QPalette::Inactive, QPalette::ButtonText,      backdrop_fg_color);
+            palette->setColor(QPalette::Inactive, QPalette::BrightText,      text_color);
+
+            palette->setColor(QPalette::Inactive, QPalette::Light,           lighten(insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Midlight,        mix(lighten(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Mid,             mix(darken(insensitive_bg_color), insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Dark,            darken(insensitive_bg_color));
+            palette->setColor(QPalette::Inactive, QPalette::Shadow,          shadow);
+
+            palette->setColor(QPalette::Inactive, QPalette::Highlight,       selected_bg_color);
+            palette->setColor(QPalette::Inactive, QPalette::HighlightedText, backdrop_selected_fg_color);
+
+            palette->setColor(QPalette::Inactive, QPalette::Link,            link_color);
+            palette->setColor(QPalette::Inactive, QPalette::LinkVisited,     link_visited_color);
+        }
+
+        return palette;
+    }
+
     inline bool gtkThemeDarkVariant() const
     {
         return m_gtkThemeDarkVariant;
diff --git a/common/qgtk3dialoghelpers.cpp b/common/qgtk3dialoghelpers.cpp
index f4bf372..a33d0d1 100644
--- a/common/qgtk3dialoghelpers.cpp
+++ b/common/qgtk3dialoghelpers.cpp
@@ -87,24 +87,18 @@ Q_SIGNALS:
 
 protected:
     static void onResponse(QGtk3Dialog *dialog, int response);
-    static void onUpdatePreview(QGtk3Dialog *dialog);
 
 private slots:
     void onParentWindowDestroyed();
 
 private:
     GtkWidget *gtkWidget;
-    GtkWidget *previewWidget;
 };
 
 QGtk3Dialog::QGtk3Dialog(GtkWidget *gtkWidget) : gtkWidget(gtkWidget)
 {
     g_signal_connect_swapped(G_OBJECT(gtkWidget), "response", G_CALLBACK(onResponse), this);
     g_signal_connect(G_OBJECT(gtkWidget), "delete-event", G_CALLBACK(gtk_widget_hide_on_delete), NULL);
-
-    previewWidget = gtk_image_new();
-    g_signal_connect_swapped(G_OBJECT(gtkWidget), "update-preview", G_CALLBACK(onUpdatePreview), this);
-    gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(gtkWidget), previewWidget);
 }
 
 QGtk3Dialog::~QGtk3Dialog()
@@ -180,32 +174,6 @@ void QGtk3Dialog::onResponse(QGtk3Dialog *dialog, int response)
         emit dialog->reject();
 }
 
-void QGtk3Dialog::onUpdatePreview(QGtk3Dialog *dialog) {
-    gchar *filename = gtk_file_chooser_get_preview_filename(GTK_FILE_CHOOSER(dialog->gtkWidget));
-    if (!filename) {
-        gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog->gtkWidget), false);
-        return;
-    }
-
-    // Don't attempt to open anything which isn't a regular file. If a named pipe,
-    // this may hang. See https://crbug.com/534754.
-    QFileInfo fileinfo(filename);
-    if (!fileinfo.exists() || !fileinfo.isFile()) {
-        g_free(filename);
-        gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog->gtkWidget), false);
-        return;
-    }
-
-    // This will preserve the image's aspect ratio.
-    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size(filename, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0);
-    g_free(filename);
-    if (pixbuf) {
-        gtk_image_set_from_pixbuf(GTK_IMAGE(dialog->previewWidget), pixbuf);
-        g_object_unref(pixbuf);
-    }
-    gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog->gtkWidget), pixbuf ? true : false);
-}
-
 void QGtk3Dialog::onParentWindowDestroyed()
 {
     // The QGtk3*DialogHelper classes own this object. Make sure the parent doesn't delete it.
@@ -293,12 +261,21 @@ QGtk3FileDialogHelper::QGtk3FileDialogHelper()
 
     g_signal_connect(GTK_FILE_CHOOSER(d->gtkDialog()), "selection-changed", G_CALLBACK(onSelectionChanged), this);
     g_signal_connect_swapped(GTK_FILE_CHOOSER(d->gtkDialog()), "current-folder-changed", G_CALLBACK(onCurrentFolderChanged), this);
+
+    previewWidget = gtk_image_new();
+    g_signal_connect(G_OBJECT(d->gtkDialog()), "update-preview", G_CALLBACK(onUpdatePreview), this);
+    gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(d->gtkDialog()), previewWidget);
 }
 
 QGtk3FileDialogHelper::~QGtk3FileDialogHelper()
 {
 }
 
+GtkImage *QGtk3FileDialogHelper::previewImage() const
+{
+    return GTK_IMAGE(previewWidget);
+}
+
 bool QGtk3FileDialogHelper::show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent)
 {
     _dir.clear();
@@ -435,6 +412,33 @@ void QGtk3FileDialogHelper::onCurrentFolderChanged(QGtk3FileDialogHelper *dialog
     emit dialog->directoryEntered(dialog->directory());
 }
 
+void QGtk3FileDialogHelper::onUpdatePreview(GtkDialog *gtkDialog, QGtk3FileDialogHelper *helper)
+{
+    gchar *filename = gtk_file_chooser_get_preview_filename(GTK_FILE_CHOOSER(gtkDialog));
+    if (!filename) {
+        gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(gtkDialog), false);
+        return;
+    }
+
+    // Don't attempt to open anything which isn't a regular file. If a named pipe,
+    // this may hang. See https://crbug.com/534754.
+    QFileInfo fileinfo(filename);
+    if (!fileinfo.exists() || !fileinfo.isFile()) {
+        g_free(filename);
+        gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(gtkDialog), false);
+        return;
+    }
+
+    // This will preserve the image's aspect ratio.
+    GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size(filename, PREVIEW_WIDTH, PREVIEW_HEIGHT, 0);
+    g_free(filename);
+    if (pixbuf) {
+        gtk_image_set_from_pixbuf(helper->previewImage(), pixbuf);
+        g_object_unref(pixbuf);
+    }
+    gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(gtkDialog), pixbuf ? true : false);
+}
+
 static GtkFileChooserAction gtkFileChooserAction(const QSharedPointer<QFileDialogOptions> &options)
 {
     switch (options->fileMode()) {
diff --git a/common/qgtk3dialoghelpers.h b/common/qgtk3dialoghelpers.h
index c852fd0..d483a64 100644
--- a/common/qgtk3dialoghelpers.h
+++ b/common/qgtk3dialoghelpers.h
@@ -47,6 +47,8 @@
 #include <QtCore/qstring.h>
 #include <qpa/qplatformdialoghelper.h>
 
+typedef struct _GtkWidget GtkWidget;
+typedef struct _GtkImage GtkImage;
 typedef struct _GtkDialog GtkDialog;
 typedef struct _GtkFileFilter GtkFileFilter;
 
@@ -88,6 +90,8 @@ public:
     QGtk3FileDialogHelper();
     ~QGtk3FileDialogHelper();
 
+    GtkImage *previewImage() const;
+
     bool show(Qt::WindowFlags flags, Qt::WindowModality modality, QWindow *parent) Q_DECL_OVERRIDE;
     void exec() Q_DECL_OVERRIDE;
     void hide() Q_DECL_OVERRIDE;
@@ -107,6 +111,7 @@ private Q_SLOTS:
 private:
     static void onSelectionChanged(GtkDialog *dialog, QGtk3FileDialogHelper *helper);
     static void onCurrentFolderChanged(QGtk3FileDialogHelper *helper);
+    static void onUpdatePreview(GtkDialog *dialog, QGtk3FileDialogHelper *helper);
     void applyOptions();
     void setNameFilters(const QStringList &filters);
 
@@ -115,6 +120,7 @@ private:
     QHash<QString, GtkFileFilter*> _filters;
     QHash<GtkFileFilter*, QString> _filterNames;
     QScopedPointer<QGtk3Dialog> d;
+    GtkWidget *previewWidget;
 };
 
 class QGtk3FontDialogHelper : public QPlatformFontDialogHelper
diff --git a/decoration/decoration.pro b/decoration/decoration.pro
index 8f7f039..6c3bb05 100644
--- a/decoration/decoration.pro
+++ b/decoration/decoration.pro
@@ -12,8 +12,7 @@ CONFIG += plugin \
 QT += core \
       gui \
       waylandclient-private \
-      widgets \
-      x11extras
+      widgets
 
 LIBS += -lcommon
 
diff --git a/decoration/qgnomeplatformdecoration.cpp b/decoration/qgnomeplatformdecoration.cpp
index 61c2af9..c8b381c 100644
--- a/decoration/qgnomeplatformdecoration.cpp
+++ b/decoration/qgnomeplatformdecoration.cpp
@@ -46,6 +46,7 @@
 #include <QtGui/QCursor>
 #include <QtGui/QLinearGradient>
 #include <QtGui/QPainter>
+#include <QtGui/QPainterPath>
 #include <QtGui/QPalette>
 #include <QtGui/QPixmap>
 
diff --git a/theme/qgnomeplatformtheme.cpp b/theme/qgnomeplatformtheme.cpp
index 70dbf65..3394b3d 100644
--- a/theme/qgnomeplatformtheme.cpp
+++ b/theme/qgnomeplatformtheme.cpp
@@ -23,8 +23,8 @@
 #include "qgtk3dialoghelpers.h"
 
 #include <QApplication>
+#include <QGuiApplication>
 #include <QStyleFactory>
-#include <QX11Info>
 
 #if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
 #include <private/qdbustrayicon_p.h>
@@ -32,7 +32,7 @@
 
 QGnomePlatformTheme::QGnomePlatformTheme()
 {
-    if (!QX11Info::isPlatformX11()) {
+    if (QGuiApplication::platformName() != QStringLiteral("xcb")) {
         if (!qEnvironmentVariableIsSet("QT_WAYLAND_DECORATION"))
             qputenv("QT_WAYLAND_DECORATION", "gnome");
     }
@@ -68,7 +68,9 @@ const QFont *QGnomePlatformTheme::font(Font type) const
 
 const QPalette *QGnomePlatformTheme::palette(Palette type) const
 {
-    return QPlatformTheme::palette(type);
+    Q_UNUSED(type);
+
+    return m_hints->palette();
 }
 
 bool QGnomePlatformTheme::usePlatformNativeDialog(QPlatformTheme::DialogType type) const
diff --git a/theme/theme.pro b/theme/theme.pro
index a33d3af..8a1cba7 100644
--- a/theme/theme.pro
+++ b/theme/theme.pro
@@ -13,7 +13,6 @@ QT += core-private \
       dbus \
       gui-private \
       theme_support-private \
-      x11extras \
       widgets
 
 LIBS += -lcommon