From c4e2008731cd7c9df922921c52294f84205fccb9 Mon Sep 17 00:00:00 2001 From: Jason Barron Date: Wed, 15 Apr 2009 14:12:20 +0200 Subject: 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). --- src/gui/kernel/qapplication_s60.cpp | 4 +++- src/gui/kernel/qwidget.cpp | 6 ++++++ src/gui/kernel/qwidget.h | 1 + src/gui/kernel/qwidget_p.h | 4 ++++ src/gui/kernel/qwidget_s60.cpp | 34 ++++++++++++++++++++++++++++++++- 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(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(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(topExtra->rwindow); + TDisplayMode gotDM = (TDisplayMode)rwindow->SetRequiredDisplayMode(EColor16MA); + int erro = rwindow->SetTransparencyAlphaChannel(); + } else { + QTLWExtra *topExtra = topData(); + RWindow *rwindow = static_cast(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(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 // for Q_WS_WIN define (non-PCH) #include -#include +#include #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); -- cgit v0.12