From 6963d8ef73192b78503631587366a0110dddd161 Mon Sep 17 00:00:00 2001 From: tpearson Date: Sun, 14 Aug 2011 21:39:35 +0000 Subject: [PATCH] Allow the Amarok OSD to use true transparency if it is available git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/amarok@1247185 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- amarok/src/Options5.ui | 1 + amarok/src/Options5.ui.h | 41 +++++++++++++++++++++------------ amarok/src/app.cpp | 4 ++-- amarok/src/osd.cpp | 49 ++++++++++++++++++++++++++++++++++++---- amarok/src/osd.h | 4 +++- 5 files changed, 77 insertions(+), 22 deletions(-) diff --git a/amarok/src/Options5.ui b/amarok/src/Options5.ui index c5782df5..d0c7b32a 100644 --- a/amarok/src/Options5.ui +++ b/amarok/src/Options5.ui @@ -517,6 +517,7 @@ slotPositionChanged() useCustomColorsToggled( bool on ) + useFakeTransparencyToggled( bool on ) init() diff --git a/amarok/src/Options5.ui.h b/amarok/src/Options5.ui.h index b24517f9..a9d5c050 100644 --- a/amarok/src/Options5.ui.h +++ b/amarok/src/Options5.ui.h @@ -25,6 +25,7 @@ email : fh@ez.no #include "amarokconfig.h" #include +#include #include "qstringx.h" #include @@ -41,20 +42,22 @@ void Options5::init() for( int i = 0; i < numScreens; i++ ) kcfg_OsdScreen->insertItem( TQString::number( i ) ); - connect( kcfg_OsdDrawShadow, TQT_SIGNAL( toggled(bool) ), - m_pOSDPreview, TQT_SLOT( setDrawShadow(bool) ) ); - connect( kcfg_OsdTextColor, TQT_SIGNAL( changed(const TQColor&) ), - m_pOSDPreview, TQT_SLOT( setTextColor(const TQColor&) ) ); - connect( kcfg_OsdUseCustomColors, TQT_SIGNAL( toggled(bool) ), - this, TQT_SLOT( useCustomColorsToggled(bool) ) ); - connect( kcfg_OsdBackgroundColor, TQT_SIGNAL( changed(const TQColor&) ), - m_pOSDPreview, TQT_SLOT( setBackgroundColor(const TQColor&) ) ); - connect( kcfg_OsdFont, TQT_SIGNAL( fontSelected(const TQFont&) ), - m_pOSDPreview, TQT_SLOT( setFont(const TQFont&) ) ); - connect( kcfg_OsdScreen, TQT_SIGNAL( activated(int) ), - m_pOSDPreview, TQT_SLOT( setScreen(int) ) ); - connect( kcfg_OsdEnabled, TQT_SIGNAL( toggled(bool) ), - m_pOSDPreview, TQT_SLOT( setShown(bool) ) ); + connect( kcfg_OsdDrawShadow, TQT_SIGNAL( toggled(bool) ), + m_pOSDPreview, TQT_SLOT( setDrawShadow(bool) ) ); + connect( kcfg_OsdTextColor, TQT_SIGNAL( changed(const TQColor&) ), + m_pOSDPreview, TQT_SLOT( setTextColor(const TQColor&) ) ); + connect( kcfg_OsdUseCustomColors, TQT_SIGNAL( toggled(bool) ), + this, TQT_SLOT( useCustomColorsToggled(bool) ) ); + connect( kcfg_OsdUseFakeTranslucency, TQT_SIGNAL( toggled(bool) ), + this, TQT_SLOT( useFakeTransparencyToggled(bool) ) ); + connect( kcfg_OsdBackgroundColor, TQT_SIGNAL( changed(const TQColor&) ), + m_pOSDPreview, TQT_SLOT( setBackgroundColor(const TQColor&) ) ); + connect( kcfg_OsdFont, TQT_SIGNAL( fontSelected(const TQFont&) ), + m_pOSDPreview, TQT_SLOT( setFont(const TQFont&) ) ); + connect( kcfg_OsdScreen, TQT_SIGNAL( activated(int) ), + m_pOSDPreview, TQT_SLOT( setScreen(int) ) ); + connect( kcfg_OsdEnabled, TQT_SIGNAL( toggled(bool) ), + m_pOSDPreview, TQT_SLOT( setShown(bool) ) ); Amarok::QStringx text = i18n( "

Tags Displayed in OSD

" @@ -113,6 +116,7 @@ void Options5::showEvent( TQShowEvent* ) { useCustomColorsToggled( kcfg_OsdUseCustomColors->isChecked() ); + useFakeTransparencyToggled( kcfg_OsdUseFakeTranslucency->isChecked() ); m_pOSDPreview->setFont( kcfg_OsdFont->font() ); m_pOSDPreview->setScreen( kcfg_OsdScreen->currentItem() ); @@ -124,3 +128,12 @@ Options5::useCustomColorsToggled( bool on ) { m_pOSDPreview->setUseCustomColors( on, kcfg_OsdTextColor->color(), kcfg_OsdBackgroundColor->color() ); } + +void +Options5::useFakeTransparencyToggled( bool on ) +{ + if (kapp->isX11CompositionAvailable()) + m_pOSDPreview->setTranslucency( on ); + else + m_pOSDPreview->setTranslucency( false ); +} \ No newline at end of file diff --git a/amarok/src/app.cpp b/amarok/src/app.cpp index a517ac34..ee726662 100644 --- a/amarok/src/app.cpp +++ b/amarok/src/app.cpp @@ -120,12 +120,12 @@ appleEventProcessor(const AppleEvent *ae, AppleEvent *, long /*handlerRefCon*/) LIBAMAROK_EXPORT KAboutData aboutData( "amarok", I18N_NOOP( "Amarok" ), APP_VERSION, I18N_NOOP( "The audio player for KDE" ), KAboutData::License_GPL, - I18N_NOOP( "(C) 2002-2003, Mark Kretschmann\n(C) 2003-2007, The Amarok Development Squad" ), + I18N_NOOP( "(C) 2002-2003, Mark Kretschmann\n(C) 2003-2007, The Amarok Development Squad\n(C) 2007-2011, The Trinity Desktop Project" ), I18N_NOOP( "IRC:\nirc.freenode.net - #amarok, #amarok.de, #amarok.es\n\nFeedback:\namarok@kde.org\n\n(Build Date: " __DATE__ ")" ), ( "http://amarok.kde.org" ) ); App::App() - : KApplication() + : KApplication(KApplication::openX11RGBADisplay()) , m_pPlayerWindow( 0 ) //will be created in applySettings() { DEBUG_BLOCK diff --git a/amarok/src/osd.cpp b/amarok/src/osd.cpp index cc475524..a9c2f517 100644 --- a/amarok/src/osd.cpp +++ b/amarok/src/osd.cpp @@ -139,7 +139,7 @@ OSDWidget::show() //virtual newGeometry.width(), newGeometry.height() )); - else if( m_translucency ) + else if (( m_translucency ) && (!kapp->isX11CompositionAvailable())) { const TQRect unite = oldGeometry.unite( newGeometry ); KPixmap pix = TQPixmap(TQPixmap::grabWindow( qt_xrootwin(), unite.x(), unite.y(), unite.width(), unite.height() )); @@ -158,7 +158,7 @@ OSDWidget::show() //virtual render( M, newGeometry.size() ); setGeometry( newGeometry ); TQWidget::show(); - bitBlt( this, 0, 0, &m_buffer ); + paintMe(); if( m_duration ) //duration 0 -> stay forever m_timer->start( m_duration, true ); //calls hide() @@ -308,7 +308,7 @@ OSDWidget::render( const uint M, const TQSize &size ) m_buffer.resize( rect.size() ); TQPainter p( &m_buffer ); - if( m_translucency ) + if (( m_translucency ) && (!kapp->isX11CompositionAvailable())) { KPixmap background( m_screenshot ); KPixmapEffect::fade( background, 0.80, backgroundColor() ); @@ -386,7 +386,7 @@ OSDWidget::render( const uint M, const TQSize &size ) pixmapGradient.setMask( mask ); } - if( m_translucency ) + if (( m_translucency ) && (!kapp->isX11CompositionAvailable())) { KPixmap background( m_screenshot ); KPixmapEffect::fade( background, 0.80, backgroundColor() ); @@ -487,6 +487,45 @@ OSDWidget::render( const uint M, const TQSize &size ) p.end(); } +void +OSDWidget::paintMe() +{ + if ((m_translucency) && (kapp->isX11CompositionAvailable())) { + // We have true composition support, so make the OSD truly transparent + TQImage blendedImage = m_buffer.convertToImage(); + blendedImage = blendedImage.convertDepth(32); + blendedImage.setAlphaBuffer(true); + + int w = blendedImage.width(); + int h = blendedImage.height(); + + for (int y = 0; y < h; ++y) { + TQRgb *ls = (TQRgb *)blendedImage.scanLine( y ); + for (int x = 0; x < w; ++x) { + TQRgb l = ls[x]; + //int desired_alpha = 127; + int desired_alpha = 204; + float alpha_adjust = (desired_alpha/256.0); + int r = int( tqRed( l ) * alpha_adjust ); + int g = int( tqGreen( l ) * alpha_adjust ); + int b = int( tqBlue( l ) * alpha_adjust ); + int a = int( desired_alpha ); + ls[x] = tqRgba( r, g, b, a ); + } + } + + // Finally, paint it + TQPainter p1; + p1.begin( this ); + blendedImage.setAlphaBuffer(false); + p1.drawImage( 0, 0, blendedImage ); + p1.end(); + } + else { + bitBlt( this, 0, 0, &m_buffer ); + } +} + bool OSDWidget::event( TQEvent *e ) { @@ -497,7 +536,7 @@ OSDWidget::event( TQEvent *e ) unsetColors(); //use new palette's colours return true; case TQEvent::Paint: - bitBlt( this, 0, 0, &m_buffer ); + paintMe(); return true; default: return TQWidget::event( e ); diff --git a/amarok/src/osd.h b/amarok/src/osd.h index cfa5cf70..625145d3 100644 --- a/amarok/src/osd.h +++ b/amarok/src/osd.h @@ -26,7 +26,7 @@ class OSDWidget : public TQWidget { Q_OBJECT - TQ_OBJECT + TQ_OBJECT public: enum Alignment { Left, Middle, Center, Right }; @@ -81,6 +81,8 @@ class OSDWidget : public TQWidget bool useMoodbar( void ); + void paintMe(); + /** distance from screen edge */ static const int MARGIN = 15;