summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/directfb
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/directfb')
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.cpp193
-rw-r--r--src/plugins/platforms/directfb/qdirectfbblitter.h19
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.cpp15
-rw-r--r--src/plugins/platforms/directfb/qdirectfbinput.h1
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.cpp28
-rw-r--r--src/plugins/platforms/directfb/qdirectfbintegration.h9
-rw-r--r--src/plugins/platforms/directfb/qdirectfbwindow.cpp104
7 files changed, 298 insertions, 71 deletions
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.cpp b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
index 46f811f816..60a501f730 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.cpp
@@ -58,22 +58,29 @@ static QBlittable::Capabilities dfb_blitter_capabilities()
|QBlittable::SourceOverPixmapCapability
|QBlittable::SourceOverScaledPixmapCapability
|QBlittable::AlphaFillRectCapability
- |QBlittable::OpacityPixmapCapability);
+ |QBlittable::OpacityPixmapCapability
+ |QBlittable::DrawScaledCachedGlyphsCapability
+ );
}
QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, IDirectFBSurface *surface)
: QBlittable(rect, dfb_blitter_capabilities())
- , m_surface(surface)
+ , m_surface(surface)
+ , m_debugPaint(false)
{
m_surface->AddRef(m_surface.data());
DFBSurfaceCapabilities surfaceCaps;
m_surface->GetCapabilities(m_surface.data(), &surfaceCaps);
m_premult = (surfaceCaps & DSCAPS_PREMULTIPLIED);
+ if (qgetenv("QT_DIRECTFB_BLITTER_DEBUGPAINT").toInt())
+ m_debugPaint = true;
}
QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, bool alpha)
- : QBlittable(rect, dfb_blitter_capabilities()), m_premult(false)
+ : QBlittable(rect, dfb_blitter_capabilities())
+ , m_premult(false)
+ , m_debugPaint(false)
{
DFBSurfaceDescription surfaceDesc;
memset(&surfaceDesc,0,sizeof(DFBSurfaceDescription));
@@ -93,6 +100,9 @@ QDirectFbBlitter::QDirectFbBlitter(const QSize &rect, bool alpha)
surfaceDesc.pixelformat = QDirectFbBlitter::pixmapFormat();
}
+ if (qgetenv("QT_DIRECTFB_BLITTER_DEBUGPAINT").toInt())
+ m_debugPaint = true;
+
IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
dfb->CreateSurface(dfb , &surfaceDesc, m_surface.outPtr());
m_surface->Clear(m_surface.data(), 0, 0, 0, 0);
@@ -163,6 +173,8 @@ void QDirectFbBlitter::alphaFillRect(const QRectF &rect, const QColor &color, QP
result = m_surface->FillRectangle(m_surface.data(), x, y, w, h);
if (result != DFB_OK)
DirectFBError("QDirectFBBlitter::alphaFillRect()", result);
+ if (m_debugPaint)
+ drawDebugRect(QRect(x, y, w, h), QColor(Qt::blue));
}
void QDirectFbBlitter::drawPixmapOpacity(const QRectF &rect, const QPixmap &pixmap, const QRectF &subrect, QPainter::CompositionMode cmode, qreal opacity)
@@ -201,13 +213,105 @@ void QDirectFbBlitter::drawPixmapOpacity(const QRectF &rect, const QPixmap &pixm
if (cmode == QPainter::CompositionMode_SourceOver)
m_surface->SetDstBlendFunction(m_surface.data(), DSBF_INVSRCALPHA);
- if ((sRect.w == dRect.w) && (sRect.h == dRect.h))
+ if ((sRect.w == dRect.w) && (sRect.h == dRect.h)) {
result = m_surface->Blit(m_surface.data(), s, &sRect, dRect.x, dRect.y);
- else
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result);
+ if (m_debugPaint)
+ drawDebugRect(QRect(dRect.x, dRect.y, sRect.w, sRect.h), QColor(Qt::green));
+ } else {
result = m_surface->StretchBlit(m_surface.data(), s, &sRect, &dRect);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawPixmapOpacity()", result);
+ if (m_debugPaint)
+ drawDebugRect(QRect(dRect.x, dRect.y, dRect.w, dRect.h), QColor(Qt::red));
+ }
+}
- if (result != DFB_OK)
- DirectFBError("QDirectFBBlitter::drawPixmapExtended()", result);
+bool QDirectFbBlitter::drawCachedGlyphs(const QPaintEngineState *state, QFontEngine::GlyphFormat glyphFormat, int numGlyphs, const glyph_t *glyphs, const QFixedPoint *positions, QFontEngine *fontEngine)
+{
+ void *cacheKey = QDirectFbConvenience::dfbInterface();
+
+ QDirectFbTextureGlyphCache *cache =
+ static_cast<QDirectFbTextureGlyphCache *>(fontEngine->glyphCache(cacheKey, glyphFormat, state->transform()));
+ if (!cache) {
+ cache = new QDirectFbTextureGlyphCache(glyphFormat, state->transform());
+ fontEngine->setGlyphCache(cacheKey, cache);
+ }
+
+ cache->populate(fontEngine, numGlyphs, glyphs, positions);
+ cache->fillInPendingGlyphs();
+
+ if (cache->image().width() == 0 || cache->image().height() == 0)
+ return false;
+
+ const int margin = fontEngine->glyphMargin(glyphFormat);
+
+ QVarLengthArray<DFBRectangle, 64> sourceRects(numGlyphs);
+ QVarLengthArray<DFBPoint, 64> destPoints(numGlyphs);
+ int nGlyphs = 0;
+
+ for (int i=0; i<numGlyphs; ++i) {
+
+ QFixed subPixelPosition = fontEngine->subPixelPositionForX(positions[i].x);
+ QTextureGlyphCache::GlyphAndSubPixelPosition glyph(glyphs[i], subPixelPosition);
+ const QTextureGlyphCache::Coord &c = cache->coords[glyph];
+ if (c.isNull())
+ continue;
+
+ int x = qFloor(positions[i].x) + c.baseLineX - margin;
+ int y = qRound(positions[i].y) - c.baseLineY - margin;
+
+ // printf("drawing [%d %d %d %d] baseline [%d %d], glyph: %d, to: %d %d, pos: %d %d\n",
+ // c.x, c.y,
+ // c.w, c.h,
+ // c.baseLineX, c.baseLineY,
+ // glyphs[i],
+ // x, y,
+ // positions[i].x.toInt(), positions[i].y.toInt());
+
+ sourceRects[nGlyphs].x = c.x;
+ sourceRects[nGlyphs].y = c.y;
+ sourceRects[nGlyphs].w = c.w;
+ sourceRects[nGlyphs].h = c.h;
+ destPoints[nGlyphs].x = x;
+ destPoints[nGlyphs].y = y;
+ ++nGlyphs;
+ }
+
+ const QColor color = state->pen().color();
+ m_surface->SetColor(m_surface.data(), color.red(), color.green(), color.blue(), color.alpha());
+
+ m_surface->SetSrcBlendFunction(m_surface.data(), DSBF_SRCALPHA);
+ m_surface->SetDstBlendFunction(m_surface.data(), DSBF_INVSRCALPHA);
+
+ int flags = DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_COLORIZE;
+ if (color.alpha() != 0xff)
+ flags |= DSBLIT_BLEND_COLORALPHA;
+ m_surface->SetBlittingFlags(m_surface.data(), DFBSurfaceBlittingFlags(flags));
+
+ const QRasterPaintEngineState *rs = static_cast<const QRasterPaintEngineState*>(state);
+ if (rs->clip && rs->clip->enabled) {
+ Q_ASSERT(rs->clip->hasRectClip);
+ DFBRegion dfbClip;
+ dfbClip.x1 = rs->clip->clipRect.x();
+ dfbClip.y1 = rs->clip->clipRect.y();
+ dfbClip.x2 = rs->clip->clipRect.right();
+ dfbClip.y2 = rs->clip->clipRect.bottom();
+ m_surface->SetClip(m_surface.data(), &dfbClip);
+ }
+
+ m_surface->BatchBlit(m_surface.data(), cache->sourceSurface(), sourceRects.constData(), destPoints.constData(), nGlyphs);
+
+ if (m_debugPaint) {
+ for (int i = 0; i < nGlyphs; ++i) {
+ drawDebugRect(QRect(destPoints[i].x, destPoints[i].y, sourceRects[i].w, sourceRects[i].h), QColor(Qt::yellow));
+ }
+ }
+
+ if (rs->clip && rs->clip->enabled)
+ m_surface->SetClip(m_surface.data(), 0);
+ return true;
}
QImage *QDirectFbBlitter::doLock()
@@ -321,4 +425,79 @@ void QDirectFbBlitter::doUnlock()
m_surface->Unlock(m_surface.data());
}
+void QDirectFbBlitter::drawDebugRect(const QRect &rect, const QColor &color)
+{
+ int x, y, w, h;
+ DFBResult result;
+
+ // check parameters
+ rect.getRect(&x, &y ,&w, &h);
+ if ((w <= 0) || (h <= 0)) return;
+
+ m_surface->SetDrawingFlags(m_surface.data(),
+ DFBSurfaceDrawingFlags(m_premult ? (DSDRAW_BLEND | DSDRAW_SRC_PREMULTIPLY) : DSDRAW_BLEND));
+ m_surface->SetPorterDuff(m_surface.data(), DSPD_SRC_OVER);
+
+ // set color
+ m_surface->SetColor(m_surface.data(), color.red(), color.green(), color.blue(), 120);
+
+ result = m_surface->DrawLine(m_surface.data(), x, y, x + w-1, y);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawDebugRect()", result);
+ result = m_surface->DrawLine(m_surface.data(), x + w-1, y, x + w-1, y + h-1);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawDebugRect()", result);
+ result = m_surface->DrawLine(m_surface.data(), x + w-1, y + h-1, x, y + h-1);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawDebugRect()", result);
+ result = m_surface->DrawLine(m_surface.data(), x, y + h-1, x, y);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawDebugRect()", result);
+
+ m_surface->SetColor(m_surface.data(), color.red(), color.green(), color.blue(), 10);
+ result = m_surface->FillRectangle(m_surface.data(), x, y, w, h);
+ if (result != DFB_OK)
+ DirectFBError("QDirectFBBlitter::drawDebugRect()", result);
+}
+
+void QDirectFbTextureGlyphCache::resizeTextureData(int width, int height)
+{
+ m_surface.reset();;
+ QImageTextureGlyphCache::resizeTextureData(width, height);
+}
+
+IDirectFBSurface *QDirectFbTextureGlyphCache::sourceSurface()
+{
+ if (m_surface.isNull()) {
+ const QImage &source = image();
+ DFBSurfaceDescription desc;
+ memset(&desc, 0, sizeof(desc));
+ desc.flags = DFBSurfaceDescriptionFlags(DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT | DSDESC_PREALLOCATED | DSDESC_CAPS);
+ desc.width = source.width();
+ desc.height = source.height();
+ desc.caps = DSCAPS_SYSTEMONLY;
+
+ switch (source.format()) {
+ case QImage::Format_Mono:
+ desc.pixelformat = DSPF_A1;
+ break;
+ case QImage::Format_Indexed8:
+ desc.pixelformat = DSPF_A8;
+ break;
+ default:
+ qFatal("QDirectFBTextureGlyphCache: Unsupported source texture image format.");
+ break;
+ }
+
+ desc.preallocated[0].data = const_cast<void*>(static_cast<const void*>(source.bits()));
+ desc.preallocated[0].pitch = source.bytesPerLine();
+ desc.preallocated[1].data = 0;
+ desc.preallocated[1].pitch = 0;
+
+ IDirectFB *dfb = QDirectFbConvenience::dfbInterface();
+ dfb->CreateSurface(dfb , &desc, m_surface.outPtr());
+ }
+ return m_surface.data();
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbblitter.h b/src/plugins/platforms/directfb/qdirectfbblitter.h
index 0255040729..4fa432462f 100644
--- a/src/plugins/platforms/directfb/qdirectfbblitter.h
+++ b/src/plugins/platforms/directfb/qdirectfbblitter.h
@@ -61,6 +61,7 @@ public:
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);
IDirectFBSurface *dfbSurface() const;
@@ -78,7 +79,10 @@ protected:
friend class QDirectFbConvenience;
private:
+ void drawDebugRect(const QRect &rect, const QColor &color);
+
bool m_premult;
+ bool m_debugPaint;
};
class QDirectFbBlitterPlatformPixmap : public QBlittablePlatformPixmap
@@ -110,6 +114,21 @@ inline IDirectFBSurface *QDirectFbBlitter::dfbSurface() const
return m_surface.data();
}
+class QDirectFbTextureGlyphCache : public QImageTextureGlyphCache
+{
+public:
+ QDirectFbTextureGlyphCache(QFontEngine::GlyphFormat format, const QTransform &matrix)
+ : QImageTextureGlyphCache(format, matrix)
+ {}
+
+ virtual void resizeTextureData(int width, int height);
+
+ IDirectFBSurface *sourceSurface();
+
+private:
+ QDirectFBPointer<IDirectFBSurface> m_surface;
+};
+
QT_END_NAMESPACE
#endif // QDIRECTFBBLITTER_H
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.cpp b/src/plugins/platforms/directfb/qdirectfbinput.cpp
index 49dc45f04a..fd558b9974 100644
--- a/src/plugins/platforms/directfb/qdirectfbinput.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbinput.cpp
@@ -154,7 +154,7 @@ void QDirectFbInput::handleEvents()
void QDirectFbInput::handleMouseEvents(const DFBEvent &event)
{
QPoint p(event.window.x, event.window.y);
- QPoint globalPos = globalPoint(event);
+ QPoint globalPos(event.window.cx, event.window.cy);
Qt::MouseButtons buttons = QDirectFbConvenience::mouseButtons(event.window.buttons);
QDirectFBPointer<IDirectFBDisplayLayer> layer(QDirectFbConvenience::dfbDisplayLayer());
@@ -169,8 +169,8 @@ void QDirectFbInput::handleMouseEvents(const DFBEvent &event)
void QDirectFbInput::handleWheelEvent(const DFBEvent &event)
{
- QPoint p(event.window.cx, event.window.cy);
- QPoint globalPos = globalPoint(event);
+ QPoint p(event.window.x, event.window.y);
+ 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,
@@ -227,13 +227,4 @@ void QDirectFbInput::handleGeometryEvent(const DFBEvent &event)
QWindowSystemInterface::handleGeometryChange(tlw, rect);
}
-inline QPoint QDirectFbInput::globalPoint(const DFBEvent &event) const
-{
- QDirectFBPointer<IDirectFBWindow> window;
- m_dfbDisplayLayer->GetWindow(m_dfbDisplayLayer, event.window.window_id, window.outPtr());
- int x,y;
- window->GetPosition(window.data(), &x, &y);
- return QPoint(event.window.cx +x, event.window.cy + y);
-}
-
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbinput.h b/src/plugins/platforms/directfb/qdirectfbinput.h
index 0ce45823e1..0d775cdc79 100644
--- a/src/plugins/platforms/directfb/qdirectfbinput.h
+++ b/src/plugins/platforms/directfb/qdirectfbinput.h
@@ -75,7 +75,6 @@ private:
void handleGotFocusEvent(const DFBEvent &event);
void handleCloseEvent(const DFBEvent& event);
void handleGeometryEvent(const DFBEvent& event);
- inline QPoint globalPoint(const DFBEvent &event) const;
IDirectFB *m_dfbInterface;
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.cpp b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
index 3d1b79ef38..fe11cbebc4 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.cpp
@@ -48,6 +48,7 @@
#include <QtPlatformSupport/private/qgenericunixfontdatabase_p.h>
#include <QtPlatformSupport/private/qgenericunixeventdispatcher_p.h>
+#include <QtPlatformSupport/private/qgenericunixservices_p.h>
#include <QtGui/private/qpixmap_blitter_p.h>
#include <QtGui/private/qpixmap_raster_p.h>
@@ -56,11 +57,13 @@
#include <QtCore/QCoreApplication>
#include <QtCore/QThread>
#include <QtCore/QAbstractEventDispatcher>
+#include <qpa/qplatforminputcontextfactory_p.h>
QT_BEGIN_NAMESPACE
QDirectFbIntegration::QDirectFbIntegration()
: m_fontDb(new QGenericUnixFontDatabase())
+ , m_services(new QGenericUnixServices)
{
}
@@ -69,6 +72,21 @@ void QDirectFbIntegration::connectToDirectFb()
initializeDirectFB();
initializeScreen();
initializeInput();
+
+ m_inputContext = QPlatformInputContextFactory::create();
+}
+
+bool QDirectFbIntegration::hasCapability(Capability cap) const
+{
+ switch (cap) {
+ case ThreadedPixmaps: return true;
+ case MultipleWindows: return true;
+#ifdef DIRECTFB_GL_EGL
+ case OpenGL: return true;
+ case ThreadedOpenGL: return true;
+#endif
+ default: return QPlatformIntegration::hasCapability(cap);
+ }
}
void QDirectFbIntegration::initializeDirectFB()
@@ -142,4 +160,14 @@ QPlatformFontDatabase *QDirectFbIntegration::fontDatabase() const
return m_fontDb.data();
}
+QPlatformServices *QDirectFbIntegration::services() const
+{
+ return m_services.data();
+}
+
+QPlatformNativeInterface *QDirectFbIntegration::nativeInterface() const
+{
+ return const_cast<QDirectFbIntegration *>(this);
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbintegration.h b/src/plugins/platforms/directfb/qdirectfbintegration.h
index b49600bed9..eb3ff41961 100644
--- a/src/plugins/platforms/directfb/qdirectfbintegration.h
+++ b/src/plugins/platforms/directfb/qdirectfbintegration.h
@@ -46,6 +46,7 @@
#include "qdirectfbscreen.h"
#include <qpa/qplatformintegration.h>
+#include <qpa/qplatformnativeinterface.h>
#include <directfb.h>
#include <directfb_version.h>
@@ -54,7 +55,7 @@ QT_BEGIN_NAMESPACE
class QThread;
class QAbstractEventDispatcher;
-class QDirectFbIntegration : public QPlatformIntegration
+class QDirectFbIntegration : public QPlatformIntegration, public QPlatformNativeInterface
{
public:
QDirectFbIntegration();
@@ -62,12 +63,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;
protected:
virtual void initializeDirectFB();
@@ -80,6 +85,8 @@ protected:
QScopedPointer<QDirectFbInput> m_input;
QScopedPointer<QThread> m_inputRunner;
QScopedPointer<QPlatformFontDatabase> m_fontDb;
+ QScopedPointer<QPlatformServices> m_services;
+ QPlatformInputContext *m_inputContext;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/directfb/qdirectfbwindow.cpp b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
index 670a955bd6..52ff1a7704 100644
--- a/src/plugins/platforms/directfb/qdirectfbwindow.cpp
+++ b/src/plugins/platforms/directfb/qdirectfbwindow.cpp
@@ -67,27 +67,39 @@ void QDirectFbWindow::createDirectFBWindow()
DFBWindowDescription description;
memset(&description,0,sizeof(DFBWindowDescription));
- description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH|DWDESC_HEIGHT|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS
- |DWDESC_OPTIONS
- |DWDESC_CAPS);
- description.width = qMax(1, window()->width());
- description.height = qMax(1, window()->height());
- description.posx = window()->x();
- description.posy = window()->y();
-
- if (layerConfig.surface_caps & DSCAPS_PREMULTIPLIED)
- description.surface_caps = DSCAPS_PREMULTIPLIED;
- description.pixelformat = layerConfig.pixelformat;
-
- description.options = DFBWindowOptions(DWOP_ALPHACHANNEL);
- description.caps = DFBWindowCapabilities(DWCAPS_DOUBLEBUFFER|DWCAPS_ALPHACHANNEL);
-
- DFBResult result = layer->CreateWindow(layer, &description, m_dfbWindow.outPtr());
- if (result != DFB_OK)
- DirectFBError("QDirectFbWindow: failed to create window", result);
-
- m_dfbWindow->SetOpacity(m_dfbWindow.data(), 0xff);
- m_inputHandler->addWindow(m_dfbWindow.data(), window());
+
+ if (window()->type() == Qt::Desktop) {
+ QRect fullscreenRect(QPoint(), screen()->availableGeometry().size());
+ window()->setGeometry(fullscreenRect);
+
+ DFBResult result = layer->CreateWindow(layer, &description, m_dfbWindow.outPtr());
+ if (result != DFB_OK)
+ DirectFBError("QDirectFbWindow: failed to create window", result);
+
+ } else {
+ description.flags = DFBWindowDescriptionFlags(DWDESC_WIDTH|DWDESC_HEIGHT|DWDESC_POSX|DWDESC_POSY|DWDESC_SURFACE_CAPS
+ |DWDESC_OPTIONS
+ |DWDESC_CAPS);
+ description.width = qMax(1, window()->width());
+ description.height = qMax(1, window()->height());
+ description.posx = window()->x();
+ description.posy = window()->y();
+
+ if (layerConfig.surface_caps & DSCAPS_PREMULTIPLIED)
+ description.surface_caps = DSCAPS_PREMULTIPLIED;
+ description.pixelformat = layerConfig.pixelformat;
+
+ description.options = DFBWindowOptions(DWOP_ALPHACHANNEL);
+ description.caps = DFBWindowCapabilities(DWCAPS_DOUBLEBUFFER|DWCAPS_ALPHACHANNEL);
+
+
+ DFBResult result = layer->CreateWindow(layer, &description, m_dfbWindow.outPtr());
+ if (result != DFB_OK)
+ DirectFBError("QDirectFbWindow: failed to create window", result);
+
+ m_dfbWindow->SetOpacity(m_dfbWindow.data(), 0xff);
+ m_inputHandler->addWindow(m_dfbWindow.data(), window());
+ }
}
QDirectFbWindow::~QDirectFbWindow()
@@ -98,21 +110,9 @@ QDirectFbWindow::~QDirectFbWindow()
void QDirectFbWindow::setGeometry(const QRect &rect)
{
-// bool isMoveOnly = (rect.topLeft() != geometry().topLeft()) && (rect.size() == geometry().size());
-
QPlatformWindow::setGeometry(rect);
- if (window()->isVisible()) {
- m_dfbWindow->SetBounds(m_dfbWindow.data(), rect.x(),rect.y(),
- rect.width(), rect.height());
-// ### TODO port, verify if this is needed
-#if 0
- //Hack. When moving since the WindowSurface of a window becomes invalid when moved
- if (isMoveOnly) { //if resize then windowsurface is updated.
- widget()->windowSurface()->resize(rect.size());
- window()->update();
- }
-#endif
- }
+ m_dfbWindow->SetBounds(m_dfbWindow.data(), rect.x(),rect.y(),
+ rect.width(), rect.height());
}
void QDirectFbWindow::setOpacity(qreal level)
@@ -123,21 +123,23 @@ void QDirectFbWindow::setOpacity(qreal level)
void QDirectFbWindow::setVisible(bool visible)
{
- if (visible) {
- int x = geometry().x();
- int y = geometry().y();
- m_dfbWindow->MoveTo(m_dfbWindow.data(), x, y);
- } else {
- QDirectFBPointer<IDirectFBDisplayLayer> displayLayer;
- QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(), DLID_PRIMARY, displayLayer.outPtr());
+ if (window()->type() != Qt::Desktop) {
+ if (visible) {
+ int x = geometry().x();
+ int y = geometry().y();
+ m_dfbWindow->MoveTo(m_dfbWindow.data(), x, y);
+ } else {
+ QDirectFBPointer<IDirectFBDisplayLayer> displayLayer;
+ QDirectFbConvenience::dfbInterface()->GetDisplayLayer(QDirectFbConvenience::dfbInterface(), DLID_PRIMARY, displayLayer.outPtr());
+
+ DFBDisplayLayerConfig config;
+ displayLayer->GetConfiguration(displayLayer.data(), &config);
+ m_dfbWindow->MoveTo(m_dfbWindow.data(), config. width + 1, config.height + 1);
+ }
- DFBDisplayLayerConfig config;
- displayLayer->GetConfiguration(displayLayer.data(), &config);
- m_dfbWindow->MoveTo(m_dfbWindow.data(), config. width + 1, config.height + 1);
+ if (window()->isTopLevel() && visible)
+ QPlatformWindow::setVisible(visible);
}
-
- if (window()->isTopLevel() && visible)
- QWindowSystemInterface::handleExposeEvent(window(), window()->geometry());
}
void QDirectFbWindow::setWindowFlags(Qt::WindowFlags flags)
@@ -158,12 +160,14 @@ void QDirectFbWindow::setWindowFlags(Qt::WindowFlags flags)
void QDirectFbWindow::raise()
{
- m_dfbWindow->RaiseToTop(m_dfbWindow.data());
+ if (window()->type() != Qt::Desktop)
+ m_dfbWindow->RaiseToTop(m_dfbWindow.data());
}
void QDirectFbWindow::lower()
{
- m_dfbWindow->LowerToBottom(m_dfbWindow.data());
+ if (window()->type() != Qt::Desktop)
+ m_dfbWindow->LowerToBottom(m_dfbWindow.data());
}
WId QDirectFbWindow::winId() const