diff mbox series

package/qt6/qt6base: Restore DirectFB support

Message ID 20240411145559.1183064-2-ben.hutchings@mind.be
State New
Headers show
Series package/qt6/qt6base: Restore DirectFB support | expand

Commit Message

Ben Hutchings April 11, 2024, 2:55 p.m. UTC
Apply a patch from upstream to make Qt 6 support DirectFB again.

Implement a config option for this, similar to what we do for Qt 5.

Signed-off-by: Ben Hutchings <ben.hutchings@mind.be>
---
 package/qt6/qt6base/Config.in                 |   8 +
 .../qt6base-directfb-Fix-compilation.patch    | 288 ++++++++++++++++++
 package/qt6/qt6base/qt6base.mk                |   7 +
 3 files changed, 303 insertions(+)
 create mode 100644 package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch

Comments

Yann E. MORIN April 11, 2024, 6:48 p.m. UTC | #1
Ben, All,

On 2024-04-11 16:55 +0200, Ben Hutchings via buildroot spake thusly:
> Apply a patch from upstream to make Qt 6 support DirectFB again.
> 
> Implement a config option for this, similar to what we do for Qt 5.
> 
> Signed-off-by: Ben Hutchings <ben.hutchings@mind.be>
> ---
>  package/qt6/qt6base/Config.in                 |   8 +
>  .../qt6base-directfb-Fix-compilation.patch    | 288 ++++++++++++++++++
>  package/qt6/qt6base/qt6base.mk                |   7 +

    $ ./utils/docker-run make check-package
    package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: use name <number>-<description>.patch (https://nightly.buildroot.org/#_providing_patches)
    package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: missing Signed-off-by in the header (https://nightly.buildroot.org/#_format_and_licensing_of_the_package_patches)
    package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: missing Upstream in the header (https://nightly.buildroot.org/#_additional_patch_documentation)

Also, we currently only have qt6.4, while qt-6.7 is already released
now, and the patch you add was already present in qt-6.5.

So, maybe it would be better to actually bump qt6 rather than backport
patches?

Regards,
Yann E. MORIN.

>  3 files changed, 303 insertions(+)
>  create mode 100644 package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch
> 
> diff --git a/package/qt6/qt6base/Config.in b/package/qt6/qt6base/Config.in
> index 3b15d40c83..b21cc33cde 100644
> --- a/package/qt6/qt6base/Config.in
> +++ b/package/qt6/qt6base/Config.in
> @@ -36,6 +36,7 @@ config BR2_PACKAGE_QT6BASE_GUI
>  	# At least one graphic backend must be enabled, so enable
>  	# linuxfb if nothing is enabled.
>  	select BR2_PACKAGE_QT6BASE_LINUXFB if \
> +	       !BR2_PACKAGE_QT6BASE_DIRECTFB && \
>  	       !BR2_PACKAGE_QT6BASE_XCB && \
>  	       !BR2_PACKAGE_QT6BASE_EGLFS
>  	help
> @@ -56,6 +57,13 @@ config BR2_PACKAGE_QT6BASE_VULKAN
>  config BR2_PACKAGE_QT6BASE_LINUXFB
>  	bool "linuxfb support"
>  
> +config BR2_PACKAGE_QT6BASE_DIRECTFB
> +	bool "directfb support"
> +	depends on BR2_PACKAGE_DIRECTFB
> +
> +comment "directfb backend available if directfb is enabled"
> +	depends on !BR2_PACKAGE_DIRECTFB
> +
>  config BR2_PACKAGE_QT6BASE_XCB
>  	bool "X.org XCB support"
>  	depends on BR2_PACKAGE_XORG7
> diff --git a/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch b/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch
> new file mode 100644
> index 0000000000..5a7df51779
> --- /dev/null
> +++ b/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch
> @@ -0,0 +1,288 @@
> +From d86ab16a86ec4d6fb92855a3c9913b6b74b6bb0f Mon Sep 17 00:00:00 2001
> +From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
> +Date: Tue, 30 Aug 2022 14:54:01 +0200
> +Subject: [PATCH] directfb: Fix compilation
> +
> +The DirectFB QPA plugin has not built since Qt 6, because it used
> +deprecated API which has been removed and private API which has
> +changed.
> +
> +This change updates the handleMouseEvent() and
> +handleWheelEvent() calls with the contents of the deprecated
> +overloads the way they were in Qt 5.15.
> +
> +In addition, it updates usage of GlyphAndSubPixelPosition to default to
> +vertical subpixel position of 0, and adds override qualifiers where
> +necessary.
> +
> +Fixes: QTBUG-105061
> +Change-Id: Id7516f8e3c0a466d15b754f8e5f6df15a5f9526a
> +Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
> +---
> + src/plugins/platforms/directfb/main.cpp       |  2 +-
> + .../directfb/qdirectfbbackingstore.h          |  8 ++---
> + .../platforms/directfb/qdirectfbblitter.cpp   |  2 +-
> + .../platforms/directfb/qdirectfbblitter.h     | 31 ++++++++++++-------
> + .../platforms/directfb/qdirectfbcursor.h      |  2 +-
> + .../platforms/directfb/qdirectfbinput.cpp     | 11 ++++---
> + .../platforms/directfb/qdirectfbinput.h       |  2 +-
> + .../platforms/directfb/qdirectfbintegration.h | 20 ++++++------
> + .../platforms/directfb/qdirectfbscreen.h      | 10 +++---
> + .../platforms/directfb/qdirectfbwindow.h      | 20 ++++++------
> + 10 files changed, 60 insertions(+), 48 deletions(-)
> +
> +diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp
> +index 02cceeb487..4618696154 100644
> +--- a/src/plugins/platforms/directfb/main.cpp
> ++++ b/src/plugins/platforms/directfb/main.cpp
> +@@ -24,7 +24,7 @@ class QDirectFbIntegrationPlugin : public QPlatformIntegrationPlugin
> +     Q_OBJECT
> +     Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "directfb.json")
> + public:
> +-    QPlatformIntegration *create(const QString&, const QStringList&);
> ++    QPlatformIntegration *create(const QString&, const QStringList&) override;
> + };
> + 
> + QPlatformIntegration * QDirectFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
> +diff --git a/src/plugins/platforms/directfb/qdirectfbbackingstore.h b/src/plugins/platforms/directfb/qdirectfbbackingstore.h
> +index c51f29271d..625b672a40 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbbackingstore.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbbackingstore.h
> +@@ -18,10 +18,10 @@ class QDirectFbBackingStore : public QPlatformBackingStore
> + public:
> +     QDirectFbBackingStore(QWindow *window);
> + 
> +-    QPaintDevice *paintDevice();
> +-    void flush(QWindow *window, const QRegion &region, const QPoint &offset);
> +-    void resize (const QSize &size, const QRegion &staticContents);
> +-    bool scroll(const QRegion &area, int dx, int dy);
> ++    QPaintDevice *paintDevice() override;
> ++    void flush(QWindow *window, const QRegion &region, const QPoint &offset) override;
> ++    void resize (const QSize &size, const QRegion &staticContents) override;
> ++    bool scroll(const QRegion &area, int dx, int dy) override;
> + 
> +     QImage toImage() const override;
> + 
> +diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
> +index 0a110da798..aac0e3d800 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp
> ++++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
> +@@ -216,7 +216,7 @@ bool QDirectFbBlitter::drawCachedGlyphs(const QPaintEngineState *state, QFontEng
> +     for (int i=0; i<numGlyphs; ++i) {
> + 
> +         QFixed subPixelPosition = fontEngine->subPixelPositionForX(positions[i].x);
> +-        QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], subPixelPosition);
> ++        QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], QFixedPoint(subPixelPosition, 0));
> +         const QTextureGlyphCache::Coord &c = cache->coords[glyph];
> +         if (c.isNull())
> +             continue;
> +diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
> +index 591021061c..6183859613 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbblitter.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
> +@@ -19,11 +19,20 @@ public:
> +     QDirectFbBlitter(const QSize &size, bool alpha);
> +     virtual ~QDirectFbBlitter();
> + 
> +-    virtual void fillRect(const QRectF &rect, const QColor &color);
> +-    virtual void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect);
> +-    void alphaFillRect(const QRectF &rect, const QColor &color, QPainter::CompositionMode cmode);
> +-    void drawPixmapOpacity(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect, QPainter::CompositionMode cmode, qreal opacity);
> +-    virtual bool drawCachedGlyphs(const QPaintEngineState *state, QFontEngine::GlyphFormat glyphFormat, int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine);
> ++    void fillRect(const QRectF &rect, const QColor &color) override;
> ++    void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect) override;
> ++    void alphaFillRect(const QRectF &rect, const QColor &color, QPainter::CompositionMode cmode) override;
> ++    void drawPixmapOpacity(const QRectF &rect,
> ++                           const QPixmap &pixmap,
> ++                           const QRectF &subrect,
> ++                           QPainter::CompositionMode cmode,
> ++                           qreal opacity) override;
> ++    bool drawCachedGlyphs(const QPaintEngineState *state,
> ++                          QFontEngine::GlyphFormat glyphFormat,
> ++                          int numGlyphs,
> ++                          const glyph_t *glyphs,
> ++                          const QFixedPoint *positions,
> ++                          QFontEngine *fontEngine) override;
> + 
> +     IDirectFBSurface *dfbSurface() const;
> + 
> +@@ -32,8 +41,8 @@ public:
> +     static DFBSurfacePixelFormat selectPixmapFormat(bool withAlpha);
> + 
> + protected:
> +-    virtual QImage *doLock();
> +-    virtual void doUnlock();
> ++    QImage *doLock() override;
> ++    void doUnlock() override;
> + 
> +     QDirectFBPointer<IDirectFBSurface> m_surface;
> +     QImage m_image;
> +@@ -50,12 +59,12 @@ private:
> + class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap
> + {
> + public:
> +-    QBlittable *createBlittable(const QSize &size, bool alpha) const;
> ++    QBlittable *createBlittable(const QSize &size, bool alpha) const override;
> + 
> +     QDirectFbBlitter *dfbBlitter() const;
> + 
> +-    virtual bool fromFile(const QString &filename, const char *format,
> +-                          Qt::ImageConversionFlags flags);
> ++    bool fromFile(const QString &filename, const char *format,
> ++                  Qt::ImageConversionFlags flags) override;
> + 
> + private:
> +     bool fromDataBufferDescription(const DFBDataBufferDescription &);
> +@@ -83,7 +92,7 @@ public:
> +         : QImageTextureGlyphCache(format, matrix)
> +     {}
> + 
> +-    virtual void resizeTextureData(int width, int height);
> ++    void resizeTextureData(int width, int height) override;
> + 
> +     IDirectFBSurface *sourceSurface();
> + 
> +diff --git a/src/plugins/platforms/directfb/qdirectfbcursor.h b/src/plugins/platforms/directfb/qdirectfbcursor.h
> +index 9a480fc8f8..21a8f4353d 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbcursor.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbcursor.h
> +@@ -19,7 +19,7 @@ class QDirectFBCursor : public QPlatformCursor
> + public:
> +     QDirectFBCursor(QPlatformScreen *screen);
> + #ifndef QT_NO_CURSOR
> +-    void changeCursor(QCursor *cursor, QWindow *window);
> ++    void changeCursor(QCursor *cursor, QWindow *window) override;
> + #endif
> + 
> + private:
> +diff --git a/src/plugins/platforms/directfb/qdirectfbinput.cpp b/src/plugins/platforms/directfb/qdirectfbinput.cpp
> +index a62ff9882c..516dc1e9d8 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbinput.cpp
> ++++ b/src/plugins/platforms/directfb/qdirectfbinput.cpp
> +@@ -126,7 +126,7 @@ void QDirectFbInput::handleMouseEvents(const DFBEvent &event)
> +     long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
> + 
> +     QWindow *tlw = m_tlwMap.value(event.window.window_id);
> +-    QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons);
> ++    QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons, Qt::NoButton, QEvent::None);
> + }
> + 
> + void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
> +@@ -135,9 +135,12 @@ void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
> +     QPoint globalPos(event.window.cx, event.window.cy);
> +     long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
> +     QWindow *tlw = m_tlwMap.value(event.window.window_id);
> +-    QWindowSystemInterface::handleWheelEvent(tlw, timestamp, p, globalPos,
> +-                                          event.window.step*120,
> +-                                          Qt::Vertical);
> ++    QWindowSystemInterface::handleWheelEvent(tlw,
> ++                                             timestamp,
> ++                                             p,
> ++                                             globalPos,
> ++                                             QPoint(),
> ++                                             QPoint(0, event.window.step*120));
> + }
> + 
> + void QDirectFbInput::handleKeyEvents(const DFBEvent &event)
> +diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
> +index 5496f537a2..02175abc7b 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbinput.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbinput.h
> +@@ -26,7 +26,7 @@ public:
> +     void stopInputEventLoop();
> + 
> + protected:
> +-    void run();
> ++    void run() override;
> + 
> + private:
> +     void handleEvents();
> +diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
> +index aa369d7c05..8dd2a4516a 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbintegration.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
> +@@ -25,16 +25,16 @@ public:
> + 
> +     void connectToDirectFb();
> + 
> +-    bool hasCapability(Capability cap) const;
> +-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
> +-    QPlatformWindow *createPlatformWindow(QWindow *window) const;
> +-    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
> +-    QAbstractEventDispatcher *createEventDispatcher() const;
> +-
> +-    QPlatformFontDatabase *fontDatabase() const;
> +-    QPlatformServices *services() const;
> +-    QPlatformInputContext *inputContext() const { return m_inputContext; }
> +-    QPlatformNativeInterface *nativeInterface() const;
> ++    bool hasCapability(Capability cap) const override;
> ++    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const override;
> ++    QPlatformWindow *createPlatformWindow(QWindow *window) const override;
> ++    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override;
> ++    QAbstractEventDispatcher *createEventDispatcher() const override;
> ++
> ++    QPlatformFontDatabase *fontDatabase() const override;
> ++    QPlatformServices *services() const override;
> ++    QPlatformInputContext *inputContext() const override { return m_inputContext; }
> ++    QPlatformNativeInterface *nativeInterface() const override;
> + 
> + protected:
> +     virtual void initializeDirectFB();
> +diff --git a/src/plugins/platforms/directfb/qdirectfbscreen.h b/src/plugins/platforms/directfb/qdirectfbscreen.h
> +index a4f2e9adb1..cbcb6a55da 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbscreen.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbscreen.h
> +@@ -19,11 +19,11 @@ class QDirectFbScreen : public QPlatformScreen
> + public:
> +     QDirectFbScreen(int display);
> + 
> +-    QRect geometry() const { return m_geometry; }
> +-    int depth() const { return m_depth; }
> +-    QImage::Format format() const { return m_format; }
> +-    QSizeF physicalSize() const { return m_physicalSize; }
> +-    QPlatformCursor *cursor() const { return m_cursor.data(); }
> ++    QRect geometry() const override { return m_geometry; }
> ++    int depth() const override { return m_depth; }
> ++    QImage::Format format() const override { return m_format; }
> ++    QSizeF physicalSize() const override { return m_physicalSize; }
> ++    QPlatformCursor *cursor() const override { return m_cursor.data(); }
> + 
> +     // DirectFb helpers
> +     IDirectFBDisplayLayer *dfbLayer() const;
> +diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h
> +index 6413d91860..f05038d8ca 100644
> +--- a/src/plugins/platforms/directfb/qdirectfbwindow.h
> ++++ b/src/plugins/platforms/directfb/qdirectfbwindow.h
> +@@ -15,19 +15,19 @@ class QDirectFbWindow : public QPlatformWindow
> + {
> + public:
> +     QDirectFbWindow(QWindow *tlw, QDirectFbInput *inputhandler);
> +-    ~QDirectFbWindow();
> ++    ~QDirectFbWindow() override;
> + 
> +-    void setGeometry(const QRect &rect);
> +-    void setOpacity(qreal level);
> ++    void setGeometry(const QRect &rect) override;
> ++    void setOpacity(qreal level) override;
> + 
> +-    void setVisible(bool visible);
> ++    void setVisible(bool visible) override;
> + 
> +-    void setWindowFlags(Qt::WindowFlags flags);
> +-    bool setKeyboardGrabEnabled(bool grab);
> +-    bool setMouseGrabEnabled(bool grab);
> +-    void raise();
> +-    void lower();
> +-    WId winId() const;
> ++    void setWindowFlags(Qt::WindowFlags flags) override;
> ++    bool setKeyboardGrabEnabled(bool grab) override;
> ++    bool setMouseGrabEnabled(bool grab) override;
> ++    void raise() override;
> ++    void lower() override;
> ++    WId winId() const override;
> + 
> +     virtual void createDirectFBWindow();
> +     IDirectFBWindow *dfbWindow() const;
> +-- 
> +2.39.2
> +
> diff --git a/package/qt6/qt6base/qt6base.mk b/package/qt6/qt6base/qt6base.mk
> index 049d73a84f..a904d6edc8 100644
> --- a/package/qt6/qt6base/qt6base.mk
> +++ b/package/qt6/qt6base/qt6base.mk
> @@ -181,6 +181,13 @@ else
>  QT6BASE_CONF_OPTS += -DFEATURE_linuxfb=OFF
>  endif
>  
> +ifeq ($(BR2_PACKAGE_QT6BASE_DIRECTFB),y)
> +QT6BASE_CONF_OPTS += -DFEATURE_directfb=ON
> +QT6BASE_DEPENDENCIES += directfb
> +else
> +QT6BASE_CONF_OPTS += -DFEATURE_directfb=OFF
> +endif
> +
>  ifeq ($(BR2_PACKAGE_QT6BASE_XCB),y)
>  QT6BASE_CONF_OPTS += \
>  	-DFEATURE_xcb=ON \
> -- 
> 2.39.2
> 
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot
Ben Hutchings April 12, 2024, 9:18 p.m. UTC | #2
On Thu, Apr 11, 2024 at 08:48:19PM +0200, Yann E. MORIN wrote:
> Ben, All,
> 
> On 2024-04-11 16:55 +0200, Ben Hutchings via buildroot spake thusly:
> > Apply a patch from upstream to make Qt 6 support DirectFB again.
> > 
> > Implement a config option for this, similar to what we do for Qt 5.
> > 
> > Signed-off-by: Ben Hutchings <ben.hutchings@mind.be>
> > ---
> >  package/qt6/qt6base/Config.in                 |   8 +
> >  .../qt6base-directfb-Fix-compilation.patch    | 288 ++++++++++++++++++
> >  package/qt6/qt6base/qt6base.mk                |   7 +
> 
>     $ ./utils/docker-run make check-package
>     package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: use name <number>-<description>.patch (https://nightly.buildroot.org/#_providing_patches)
>     package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: missing Signed-off-by in the header (https://nightly.buildroot.org/#_format_and_licensing_of_the_package_patches)
>     package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch:0: missing Upstream in the header (https://nightly.buildroot.org/#_additional_patch_documentation)

Sorry, I should have known about those.

> Also, we currently only have qt6.4, while qt-6.7 is already released
> now, and the patch you add was already present in qt-6.5.
> 
> So, maybe it would be better to actually bump qt6 rather than backport
> patches?
[...]

That should also work!  But I don't know what else might break when
updating Qt.

Ben.
diff mbox series

Patch

diff --git a/package/qt6/qt6base/Config.in b/package/qt6/qt6base/Config.in
index 3b15d40c83..b21cc33cde 100644
--- a/package/qt6/qt6base/Config.in
+++ b/package/qt6/qt6base/Config.in
@@ -36,6 +36,7 @@  config BR2_PACKAGE_QT6BASE_GUI
 	# At least one graphic backend must be enabled, so enable
 	# linuxfb if nothing is enabled.
 	select BR2_PACKAGE_QT6BASE_LINUXFB if \
+	       !BR2_PACKAGE_QT6BASE_DIRECTFB && \
 	       !BR2_PACKAGE_QT6BASE_XCB && \
 	       !BR2_PACKAGE_QT6BASE_EGLFS
 	help
@@ -56,6 +57,13 @@  config BR2_PACKAGE_QT6BASE_VULKAN
 config BR2_PACKAGE_QT6BASE_LINUXFB
 	bool "linuxfb support"
 
+config BR2_PACKAGE_QT6BASE_DIRECTFB
+	bool "directfb support"
+	depends on BR2_PACKAGE_DIRECTFB
+
+comment "directfb backend available if directfb is enabled"
+	depends on !BR2_PACKAGE_DIRECTFB
+
 config BR2_PACKAGE_QT6BASE_XCB
 	bool "X.org XCB support"
 	depends on BR2_PACKAGE_XORG7
diff --git a/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch b/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch
new file mode 100644
index 0000000000..5a7df51779
--- /dev/null
+++ b/package/qt6/qt6base/qt6base-directfb-Fix-compilation.patch
@@ -0,0 +1,288 @@ 
+From d86ab16a86ec4d6fb92855a3c9913b6b74b6bb0f Mon Sep 17 00:00:00 2001
+From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
+Date: Tue, 30 Aug 2022 14:54:01 +0200
+Subject: [PATCH] directfb: Fix compilation
+
+The DirectFB QPA plugin has not built since Qt 6, because it used
+deprecated API which has been removed and private API which has
+changed.
+
+This change updates the handleMouseEvent() and
+handleWheelEvent() calls with the contents of the deprecated
+overloads the way they were in Qt 5.15.
+
+In addition, it updates usage of GlyphAndSubPixelPosition to default to
+vertical subpixel position of 0, and adds override qualifiers where
+necessary.
+
+Fixes: QTBUG-105061
+Change-Id: Id7516f8e3c0a466d15b754f8e5f6df15a5f9526a
+Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
+---
+ src/plugins/platforms/directfb/main.cpp       |  2 +-
+ .../directfb/qdirectfbbackingstore.h          |  8 ++---
+ .../platforms/directfb/qdirectfbblitter.cpp   |  2 +-
+ .../platforms/directfb/qdirectfbblitter.h     | 31 ++++++++++++-------
+ .../platforms/directfb/qdirectfbcursor.h      |  2 +-
+ .../platforms/directfb/qdirectfbinput.cpp     | 11 ++++---
+ .../platforms/directfb/qdirectfbinput.h       |  2 +-
+ .../platforms/directfb/qdirectfbintegration.h | 20 ++++++------
+ .../platforms/directfb/qdirectfbscreen.h      | 10 +++---
+ .../platforms/directfb/qdirectfbwindow.h      | 20 ++++++------
+ 10 files changed, 60 insertions(+), 48 deletions(-)
+
+diff --git a/src/plugins/platforms/directfb/main.cpp b/src/plugins/platforms/directfb/main.cpp
+index 02cceeb487..4618696154 100644
+--- a/src/plugins/platforms/directfb/main.cpp
++++ b/src/plugins/platforms/directfb/main.cpp
+@@ -24,7 +24,7 @@ class QDirectFbIntegrationPlugin : public QPlatformIntegrationPlugin
+     Q_OBJECT
+     Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "directfb.json")
+ public:
+-    QPlatformIntegration *create(const QString&, const QStringList&);
++    QPlatformIntegration *create(const QString&, const QStringList&) override;
+ };
+ 
+ QPlatformIntegration * QDirectFbIntegrationPlugin::create(const QString& system, const QStringList& paramList)
+diff --git a/src/plugins/platforms/directfb/qdirectfbbackingstore.h b/src/plugins/platforms/directfb/qdirectfbbackingstore.h
+index c51f29271d..625b672a40 100644
+--- a/src/plugins/platforms/directfb/qdirectfbbackingstore.h
++++ b/src/plugins/platforms/directfb/qdirectfbbackingstore.h
+@@ -18,10 +18,10 @@ class QDirectFbBackingStore : public QPlatformBackingStore
+ public:
+     QDirectFbBackingStore(QWindow *window);
+ 
+-    QPaintDevice *paintDevice();
+-    void flush(QWindow *window, const QRegion &region, const QPoint &offset);
+-    void resize (const QSize &size, const QRegion &staticContents);
+-    bool scroll(const QRegion &area, int dx, int dy);
++    QPaintDevice *paintDevice() override;
++    void flush(QWindow *window, const QRegion &region, const QPoint &offset) override;
++    void resize (const QSize &size, const QRegion &staticContents) override;
++    bool scroll(const QRegion &area, int dx, int dy) override;
+ 
+     QImage toImage() const override;
+ 
+diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
+index 0a110da798..aac0e3d800 100644
+--- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp
++++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
+@@ -216,7 +216,7 @@ bool QDirectFbBlitter::drawCachedGlyphs(const QPaintEngineState *state, QFontEng
+     for (int i=0; i<numGlyphs; ++i) {
+ 
+         QFixed subPixelPosition = fontEngine->subPixelPositionForX(positions[i].x);
+-        QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], subPixelPosition);
++        QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], QFixedPoint(subPixelPosition, 0));
+         const QTextureGlyphCache::Coord &c = cache->coords[glyph];
+         if (c.isNull())
+             continue;
+diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
+index 591021061c..6183859613 100644
+--- a/src/plugins/platforms/directfb/qdirectfbblitter.h
++++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
+@@ -19,11 +19,20 @@ public:
+     QDirectFbBlitter(const QSize &size, bool alpha);
+     virtual ~QDirectFbBlitter();
+ 
+-    virtual void fillRect(const QRectF &rect, const QColor &color);
+-    virtual void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect);
+-    void alphaFillRect(const QRectF &rect, const QColor &color, QPainter::CompositionMode cmode);
+-    void drawPixmapOpacity(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect, QPainter::CompositionMode cmode, qreal opacity);
+-    virtual bool drawCachedGlyphs(const QPaintEngineState *state, QFontEngine::GlyphFormat glyphFormat, int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine);
++    void fillRect(const QRectF &rect, const QColor &color) override;
++    void drawPixmap(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect) override;
++    void alphaFillRect(const QRectF &rect, const QColor &color, QPainter::CompositionMode cmode) override;
++    void drawPixmapOpacity(const QRectF &rect,
++                           const QPixmap &pixmap,
++                           const QRectF &subrect,
++                           QPainter::CompositionMode cmode,
++                           qreal opacity) override;
++    bool drawCachedGlyphs(const QPaintEngineState *state,
++                          QFontEngine::GlyphFormat glyphFormat,
++                          int numGlyphs,
++                          const glyph_t *glyphs,
++                          const QFixedPoint *positions,
++                          QFontEngine *fontEngine) override;
+ 
+     IDirectFBSurface *dfbSurface() const;
+ 
+@@ -32,8 +41,8 @@ public:
+     static DFBSurfacePixelFormat selectPixmapFormat(bool withAlpha);
+ 
+ protected:
+-    virtual QImage *doLock();
+-    virtual void doUnlock();
++    QImage *doLock() override;
++    void doUnlock() override;
+ 
+     QDirectFBPointer<IDirectFBSurface> m_surface;
+     QImage m_image;
+@@ -50,12 +59,12 @@ private:
+ class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap
+ {
+ public:
+-    QBlittable *createBlittable(const QSize &size, bool alpha) const;
++    QBlittable *createBlittable(const QSize &size, bool alpha) const override;
+ 
+     QDirectFbBlitter *dfbBlitter() const;
+ 
+-    virtual bool fromFile(const QString &filename, const char *format,
+-                          Qt::ImageConversionFlags flags);
++    bool fromFile(const QString &filename, const char *format,
++                  Qt::ImageConversionFlags flags) override;
+ 
+ private:
+     bool fromDataBufferDescription(const DFBDataBufferDescription &);
+@@ -83,7 +92,7 @@ public:
+         : QImageTextureGlyphCache(format, matrix)
+     {}
+ 
+-    virtual void resizeTextureData(int width, int height);
++    void resizeTextureData(int width, int height) override;
+ 
+     IDirectFBSurface *sourceSurface();
+ 
+diff --git a/src/plugins/platforms/directfb/qdirectfbcursor.h b/src/plugins/platforms/directfb/qdirectfbcursor.h
+index 9a480fc8f8..21a8f4353d 100644
+--- a/src/plugins/platforms/directfb/qdirectfbcursor.h
++++ b/src/plugins/platforms/directfb/qdirectfbcursor.h
+@@ -19,7 +19,7 @@ class QDirectFBCursor : public QPlatformCursor
+ public:
+     QDirectFBCursor(QPlatformScreen *screen);
+ #ifndef QT_NO_CURSOR
+-    void changeCursor(QCursor *cursor, QWindow *window);
++    void changeCursor(QCursor *cursor, QWindow *window) override;
+ #endif
+ 
+ private:
+diff --git a/src/plugins/platforms/directfb/qdirectfbinput.cpp b/src/plugins/platforms/directfb/qdirectfbinput.cpp
+index a62ff9882c..516dc1e9d8 100644
+--- a/src/plugins/platforms/directfb/qdirectfbinput.cpp
++++ b/src/plugins/platforms/directfb/qdirectfbinput.cpp
+@@ -126,7 +126,7 @@ void QDirectFbInput::handleMouseEvents(const DFBEvent &event)
+     long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
+ 
+     QWindow *tlw = m_tlwMap.value(event.window.window_id);
+-    QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons);
++    QWindowSystemInterface::handleMouseEvent(tlw, timestamp, p, globalPos, buttons, Qt::NoButton, QEvent::None);
+ }
+ 
+ void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
+@@ -135,9 +135,12 @@ void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
+     QPoint globalPos(event.window.cx, event.window.cy);
+     long timestamp = (event.window.timestamp.tv_sec*1000) + (event.window.timestamp.tv_usec/1000);
+     QWindow *tlw = m_tlwMap.value(event.window.window_id);
+-    QWindowSystemInterface::handleWheelEvent(tlw, timestamp, p, globalPos,
+-                                          event.window.step*120,
+-                                          Qt::Vertical);
++    QWindowSystemInterface::handleWheelEvent(tlw,
++                                             timestamp,
++                                             p,
++                                             globalPos,
++                                             QPoint(),
++                                             QPoint(0, event.window.step*120));
+ }
+ 
+ void QDirectFbInput::handleKeyEvents(const DFBEvent &event)
+diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
+index 5496f537a2..02175abc7b 100644
+--- a/src/plugins/platforms/directfb/qdirectfbinput.h
++++ b/src/plugins/platforms/directfb/qdirectfbinput.h
+@@ -26,7 +26,7 @@ public:
+     void stopInputEventLoop();
+ 
+ protected:
+-    void run();
++    void run() override;
+ 
+ private:
+     void handleEvents();
+diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
+index aa369d7c05..8dd2a4516a 100644
+--- a/src/plugins/platforms/directfb/qdirectfbintegration.h
++++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
+@@ -25,16 +25,16 @@ public:
+ 
+     void connectToDirectFb();
+ 
+-    bool hasCapability(Capability cap) const;
+-    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const;
+-    QPlatformWindow *createPlatformWindow(QWindow *window) const;
+-    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const;
+-    QAbstractEventDispatcher *createEventDispatcher() const;
+-
+-    QPlatformFontDatabase *fontDatabase() const;
+-    QPlatformServices *services() const;
+-    QPlatformInputContext *inputContext() const { return m_inputContext; }
+-    QPlatformNativeInterface *nativeInterface() const;
++    bool hasCapability(Capability cap) const override;
++    QPlatformPixmap *createPlatformPixmap(QPlatformPixmap::PixelType type) const override;
++    QPlatformWindow *createPlatformWindow(QWindow *window) const override;
++    QPlatformBackingStore *createPlatformBackingStore(QWindow *window) const override;
++    QAbstractEventDispatcher *createEventDispatcher() const override;
++
++    QPlatformFontDatabase *fontDatabase() const override;
++    QPlatformServices *services() const override;
++    QPlatformInputContext *inputContext() const override { return m_inputContext; }
++    QPlatformNativeInterface *nativeInterface() const override;
+ 
+ protected:
+     virtual void initializeDirectFB();
+diff --git a/src/plugins/platforms/directfb/qdirectfbscreen.h b/src/plugins/platforms/directfb/qdirectfbscreen.h
+index a4f2e9adb1..cbcb6a55da 100644
+--- a/src/plugins/platforms/directfb/qdirectfbscreen.h
++++ b/src/plugins/platforms/directfb/qdirectfbscreen.h
+@@ -19,11 +19,11 @@ class QDirectFbScreen : public QPlatformScreen
+ public:
+     QDirectFbScreen(int display);
+ 
+-    QRect geometry() const { return m_geometry; }
+-    int depth() const { return m_depth; }
+-    QImage::Format format() const { return m_format; }
+-    QSizeF physicalSize() const { return m_physicalSize; }
+-    QPlatformCursor *cursor() const { return m_cursor.data(); }
++    QRect geometry() const override { return m_geometry; }
++    int depth() const override { return m_depth; }
++    QImage::Format format() const override { return m_format; }
++    QSizeF physicalSize() const override { return m_physicalSize; }
++    QPlatformCursor *cursor() const override { return m_cursor.data(); }
+ 
+     // DirectFb helpers
+     IDirectFBDisplayLayer *dfbLayer() const;
+diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.h b/src/plugins/platforms/directfb/qdirectfbwindow.h
+index 6413d91860..f05038d8ca 100644
+--- a/src/plugins/platforms/directfb/qdirectfbwindow.h
++++ b/src/plugins/platforms/directfb/qdirectfbwindow.h
+@@ -15,19 +15,19 @@ class QDirectFbWindow : public QPlatformWindow
+ {
+ public:
+     QDirectFbWindow(QWindow *tlw, QDirectFbInput *inputhandler);
+-    ~QDirectFbWindow();
++    ~QDirectFbWindow() override;
+ 
+-    void setGeometry(const QRect &rect);
+-    void setOpacity(qreal level);
++    void setGeometry(const QRect &rect) override;
++    void setOpacity(qreal level) override;
+ 
+-    void setVisible(bool visible);
++    void setVisible(bool visible) override;
+ 
+-    void setWindowFlags(Qt::WindowFlags flags);
+-    bool setKeyboardGrabEnabled(bool grab);
+-    bool setMouseGrabEnabled(bool grab);
+-    void raise();
+-    void lower();
+-    WId winId() const;
++    void setWindowFlags(Qt::WindowFlags flags) override;
++    bool setKeyboardGrabEnabled(bool grab) override;
++    bool setMouseGrabEnabled(bool grab) override;
++    void raise() override;
++    void lower() override;
++    WId winId() const override;
+ 
+     virtual void createDirectFBWindow();
+     IDirectFBWindow *dfbWindow() const;
+-- 
+2.39.2
+
diff --git a/package/qt6/qt6base/qt6base.mk b/package/qt6/qt6base/qt6base.mk
index 049d73a84f..a904d6edc8 100644
--- a/package/qt6/qt6base/qt6base.mk
+++ b/package/qt6/qt6base/qt6base.mk
@@ -181,6 +181,13 @@  else
 QT6BASE_CONF_OPTS += -DFEATURE_linuxfb=OFF
 endif
 
+ifeq ($(BR2_PACKAGE_QT6BASE_DIRECTFB),y)
+QT6BASE_CONF_OPTS += -DFEATURE_directfb=ON
+QT6BASE_DEPENDENCIES += directfb
+else
+QT6BASE_CONF_OPTS += -DFEATURE_directfb=OFF
+endif
+
 ifeq ($(BR2_PACKAGE_QT6BASE_XCB),y)
 QT6BASE_CONF_OPTS += \
 	-DFEATURE_xcb=ON \