summaryrefslogtreecommitdiffstats
path: root/src/plugins/gfxdrivers/directfb
diff options
context:
space:
mode:
authorAnders Bakken <anders.bakken@nokia.com>2009-10-15 22:27:14 (GMT)
committerAnders Bakken <anders.bakken@nokia.com>2009-10-15 23:00:05 (GMT)
commit35298949b75c1f9876e4031f184cdc106df2a5da (patch)
tree9a8ecd20d2849c3540e2c662b8c2083dc91662a3 /src/plugins/gfxdrivers/directfb
parentcdd181ddff47be15d396d05ca41d1ca11f8705fc (diff)
downloadQt-35298949b75c1f9876e4031f184cdc106df2a5da.zip
Qt-35298949b75c1f9876e4031f184cdc106df2a5da.tar.gz
Qt-35298949b75c1f9876e4031f184cdc106df2a5da.tar.bz2
Allow setting DFBDisplayLayer background color
We already have an option for setting the background color of the primary surface when running with NO_WM. Reuse the same option for allowing users to set the background color of the primary layer. Also fix the regexp. Reviewed-by: Donald Carr <donald.carr@nokia.com>
Diffstat (limited to 'src/plugins/gfxdrivers/directfb')
-rw-r--r--src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp66
1 files changed, 59 insertions, 7 deletions
diff --git a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
index 00eeebd..449bc0d 100644
--- a/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
+++ b/src/plugins/gfxdrivers/directfb/qdirectfbscreen.cpp
@@ -1061,6 +1061,26 @@ static inline bool setIntOption(const QStringList &arguments, const QString &var
return false;
}
+static inline QColor colorFromName(const QString &name)
+{
+ QRegExp rx("#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])");
+ rx.setCaseSensitivity(Qt::CaseInsensitive);
+ if (rx.exactMatch(name)) {
+ Q_ASSERT(rx.numCaptures() == 4);
+ int ints[4];
+ int i;
+ for (i=0; i<4; ++i) {
+ bool ok;
+ ints[i] = rx.cap(i + 1).toUInt(&ok, 16);
+ if (!ok || ints[i] > 255)
+ break;
+ }
+ if (i == 4)
+ return QColor(ints[0], ints[1], ints[2], ints[3]);
+ }
+ return QColor(name);
+}
+
bool QDirectFBScreen::connect(const QString &displaySpec)
{
DFBResult result = DFB_OK;
@@ -1293,18 +1313,50 @@ bool QDirectFBScreen::connect(const QString &displaySpec)
#endif
#ifdef QT_DIRECTFB_WM
surface->Release(surface);
+ QColor backgroundColor;
#else
- QRegExp backgroundColorRegExp(QLatin1String("bgcolor=?(.+)"));
+ QColor &backgroundColor = d_ptr->backgroundColor;
+#endif
+
+ QRegExp backgroundColorRegExp(QLatin1String("bgcolor=(.+)"));
backgroundColorRegExp.setCaseSensitivity(Qt::CaseInsensitive);
if (displayArgs.indexOf(backgroundColorRegExp) != -1) {
- d_ptr->backgroundColor.setNamedColor(backgroundColorRegExp.cap(1));
+ backgroundColor = colorFromName(backgroundColorRegExp.cap(1));
}
- if (!d_ptr->backgroundColor.isValid())
- d_ptr->backgroundColor = Qt::green;
- d_ptr->primarySurface->Clear(d_ptr->primarySurface, d_ptr->backgroundColor.red(),
- d_ptr->backgroundColor.green(), d_ptr->backgroundColor.blue(),
- d_ptr->backgroundColor.alpha());
+#ifdef QT_NO_DIRECTFB_WM
+ if (!backgroundColor.isValid())
+ backgroundColor = Qt::green;
+ d_ptr->primarySurface->Clear(d_ptr->primarySurface, backgroundColor.red(),
+ backgroundColor.green(), backgroundColor.blue(),
+ backgroundColor.alpha());
d_ptr->primarySurface->Flip(d_ptr->primarySurface, 0, d_ptr->flipFlags);
+#else
+ if (backgroundColor.isValid()) {
+ DFBResult result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_ADMINISTRATIVE);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+ result = d_ptr->dfbLayer->SetBackgroundColor(d_ptr->dfbLayer, backgroundColor.red(), backgroundColor.green(),
+ backgroundColor.blue(), backgroundColor.alpha());
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background color", result);
+ }
+
+ result = d_ptr->dfbLayer->SetBackgroundMode(d_ptr->dfbLayer, DLBM_COLOR);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreenCursor::connect: "
+ "Unable to set background mode", result);
+ }
+
+ result = d_ptr->dfbLayer->SetCooperativeLevel(d_ptr->dfbLayer, DLSCL_SHARED);
+ if (result != DFB_OK) {
+ DirectFBError("QDirectFBScreen::connect "
+ "Unable to set cooperative level", result);
+ }
+
+ }
#endif
return true;