summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Barron <jbarron@trolltech.com>2009-04-15 12:12:20 (GMT)
committerJason Barron <jbarron@trolltech.com>2009-04-28 14:42:20 (GMT)
commitc4e2008731cd7c9df922921c52294f84205fccb9 (patch)
tree969814f41c4b51659029656cf6f002add050d707
parent20a0448cfe6e683e8bc66d3bd62a0981067602f9 (diff)
downloadQt-c4e2008731cd7c9df922921c52294f84205fccb9.zip
Qt-c4e2008731cd7c9df922921c52294f84205fccb9.tar.gz
Qt-c4e2008731cd7c9df922921c52294f84205fccb9.tar.bz2
Fixes: Add support for translucent windows in Symbian.
Warning, this is completely untested! Details: This should (in theory) get translucent windows working but this hasn't been tested yet. The emulator environment seems to return only 16ColorMU display modes which implies the window is opague so Qt ignores the translucent flag. HW seems to create 16ColorMA windows, but it hasn't been tested there yet either (no time).
-rw-r--r--src/gui/kernel/qapplication_s60.cpp4
-rw-r--r--src/gui/kernel/qwidget.cpp6
-rw-r--r--src/gui/kernel/qwidget.h1
-rw-r--r--src/gui/kernel/qwidget_p.h4
-rw-r--r--src/gui/kernel/qwidget_s60.cpp34
-rw-r--r--src/gui/painting/qwindowsurface_s60.cpp11
6 files changed, 57 insertions, 3 deletions
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index c7bbcdb..e1155ad 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -540,7 +540,9 @@ void QSymbianControl::Draw(const TRect& r) const
if (engine->type() == QPaintEngine::Raster) {
QS60WindowSurface *s60Surface = static_cast<QS60WindowSurface *>(qwidget->windowSurface());
CFbsBitmap *bitmap = s60Surface->symbianBitmap();
- SystemGc().BitBlt(r.iTl, bitmap, r);
+ CWindowGc &gc = SystemGc();
+ gc.SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha);
+ gc.BitBlt(r.iTl, bitmap, r);
} else {
surface->flush(qwidget, QRegion(qt_TRect2QRect(r)), QPoint());
}
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp
index 9015182..f5deb96 100644
--- a/src/gui/kernel/qwidget.cpp
+++ b/src/gui/kernel/qwidget.cpp
@@ -1991,6 +1991,9 @@ void QWidgetPrivate::setOpaque(bool opaque)
#ifdef Q_WS_WIN
winUpdateIsOpaque();
#endif
+#ifdef Q_WS_S60
+ s60UpdateIsOpaque();
+#endif
}
void QWidgetPrivate::updateIsTranslucent()
@@ -2004,6 +2007,9 @@ void QWidgetPrivate::updateIsTranslucent()
#ifdef Q_WS_WIN
winUpdateIsOpaque();
#endif
+#ifdef Q_WS_S60
+ s60UpdateIsOpaque();
+#endif
}
/*!
diff --git a/src/gui/kernel/qwidget.h b/src/gui/kernel/qwidget.h
index 8ecf758..2b584eb 100644
--- a/src/gui/kernel/qwidget.h
+++ b/src/gui/kernel/qwidget.h
@@ -746,6 +746,7 @@ private:
#endif
#ifdef Q_WS_S60
friend class QSymbianControl;
+ friend class QS60WindowSurface;
#endif
#ifdef Q_WS_X11
friend void qt_net_update_user_time(QWidget *tlw, unsigned long timestamp);
diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
index ec64b6e..19f4b98 100644
--- a/src/gui/kernel/qwidget_p.h
+++ b/src/gui/kernel/qwidget_p.h
@@ -270,6 +270,10 @@ public:
void applyMaxAndMinSizeConstraints(int &w, int &h);
#endif
+#ifdef Q_WS_S60
+ void s60UpdateIsOpaque();
+#endif
+
void raise_sys();
void lower_sys();
void stackUnder_sys(QWidget *);
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index ec80a18..20325c2 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -202,8 +202,15 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
topExtra->rwindow->PointerFilter(EPointerFilterEnterExit
| EPointerFilterMove | EPointerFilterDrag, 0);
topExtra->rwindow->EnableVisibilityChangeEvents();
+
+ if (q->testAttribute(Qt::WA_TranslucentBackground)) {
+ RWindow *rwindow = static_cast<RWindow*>(topExtra->rwindow);
+ TDisplayMode gotDM = (TDisplayMode)rwindow->SetRequiredDisplayMode(EColor16MA);
+ int erro = rwindow->SetTransparencyAlphaChannel();
+ }
}
+
id = (WId)control;
setWinId(id);
@@ -429,6 +436,29 @@ void QWidgetPrivate::setConstraints_sys()
}
+
+void QWidgetPrivate::s60UpdateIsOpaque()
+{
+ Q_Q(QWidget);
+
+ if (!q->testAttribute(Qt::WA_WState_Created) || !q->testAttribute(Qt::WA_TranslucentBackground))
+ return;
+
+ if ((data.window_flags & Qt::FramelessWindowHint) == 0)
+ return;
+
+ if (!isOpaque) {
+ QTLWExtra *topExtra = topData();
+ RWindow *rwindow = static_cast<RWindow*>(topExtra->rwindow);
+ TDisplayMode gotDM = (TDisplayMode)rwindow->SetRequiredDisplayMode(EColor16MA);
+ int erro = rwindow->SetTransparencyAlphaChannel();
+ } else {
+ QTLWExtra *topExtra = topData();
+ RWindow *rwindow = static_cast<RWindow*>(topExtra->rwindow);
+ rwindow->SetTransparentRegion(TRegionFix<1>());
+ }
+}
+
CFbsBitmap* qt_pixmapToNativeBitmapL(QPixmap pixmap, bool invert)
{
CFbsBitmap* fbsBitmap = new(ELeave)CFbsBitmap;
@@ -576,7 +606,9 @@ void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r)
*/
void QWidgetPrivate::setWindowOpacity_sys(qreal level)
{
-
+ RWindow* rw = static_cast<RWindow*>(topData()->rwindow);
+ if (rw)
+ rw->SetTransparencyFactor(TRgb::Gray256(255.0 * level));
}
void QWidgetPrivate::updateFrameStrut()
diff --git a/src/gui/painting/qwindowsurface_s60.cpp b/src/gui/painting/qwindowsurface_s60.cpp
index b262cb2..d0c3e1c 100644
--- a/src/gui/painting/qwindowsurface_s60.cpp
+++ b/src/gui/painting/qwindowsurface_s60.cpp
@@ -12,7 +12,7 @@
#include <qglobal.h> // for Q_WS_WIN define (non-PCH)
#include <QtGui/qpaintdevice.h>
-#include <QtGui/qwidget.h>
+#include <private/qwidget_p.h>
#include "qwindowsurface_s60_p.h"
#include "qt_s60_p.h"
@@ -143,6 +143,15 @@ void QS60WindowSurface::lockBitmapHeap()
// Get some values for QImage creation
TDisplayMode mode = bitmap->DisplayMode();
+ QWidget *win = QS60WindowSurfacePrivate::lockedSurface->window();
+ RWindowBase *rwin = win->winId()->DrawableWindow();
+ TDisplayMode rwMode = rwin->DisplayMode();
+
+ mode = rwMode;
+
+ if (mode == EColor16MA
+ && qt_widget_private(QS60WindowSurfacePrivate::lockedSurface->window())->isOpaque)
+ mode = EColor16MU;
QImage::Format format = qt_TDisplayMode2Format( mode );
TSize bitmapSize = bitmap->SizeInPixels();
int bytesPerLine = CFbsBitmap::ScanLineLength( bitmapSize.iWidth, mode);