diff options
author | Jason Barron <jbarron@trolltech.com> | 2009-04-15 12:12:20 (GMT) |
---|---|---|
committer | Jason Barron <jbarron@trolltech.com> | 2009-04-28 14:42:20 (GMT) |
commit | c4e2008731cd7c9df922921c52294f84205fccb9 (patch) | |
tree | 969814f41c4b51659029656cf6f002add050d707 | |
parent | 20a0448cfe6e683e8bc66d3bd62a0981067602f9 (diff) | |
download | Qt-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.cpp | 4 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.cpp | 6 | ||||
-rw-r--r-- | src/gui/kernel/qwidget.h | 1 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_p.h | 4 | ||||
-rw-r--r-- | src/gui/kernel/qwidget_s60.cpp | 34 | ||||
-rw-r--r-- | src/gui/painting/qwindowsurface_s60.cpp | 11 |
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); |