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
v3.5.13-sru
tpearson 13 years ago
parent 394f15165b
commit 6963d8ef73

@ -517,6 +517,7 @@
<Q_SLOTS> <Q_SLOTS>
<slot access="protected">slotPositionChanged()</slot> <slot access="protected">slotPositionChanged()</slot>
<slot access="protected">useCustomColorsToggled( bool on )</slot> <slot access="protected">useCustomColorsToggled( bool on )</slot>
<slot access="protected">useFakeTransparencyToggled( bool on )</slot>
</Q_SLOTS> </Q_SLOTS>
<functions> <functions>
<function access="private" specifier="non virtual">init()</function> <function access="private" specifier="non virtual">init()</function>

@ -25,6 +25,7 @@ email : fh@ez.no
#include "amarokconfig.h" #include "amarokconfig.h"
#include <klocale.h> #include <klocale.h>
#include <kapplication.h>
#include "qstringx.h" #include "qstringx.h"
#include <tqtooltip.h> #include <tqtooltip.h>
@ -41,20 +42,22 @@ void Options5::init()
for( int i = 0; i < numScreens; i++ ) for( int i = 0; i < numScreens; i++ )
kcfg_OsdScreen->insertItem( TQString::number( i ) ); kcfg_OsdScreen->insertItem( TQString::number( i ) );
connect( kcfg_OsdDrawShadow, TQT_SIGNAL( toggled(bool) ), connect( kcfg_OsdDrawShadow, TQT_SIGNAL( toggled(bool) ),
m_pOSDPreview, TQT_SLOT( setDrawShadow(bool) ) ); m_pOSDPreview, TQT_SLOT( setDrawShadow(bool) ) );
connect( kcfg_OsdTextColor, TQT_SIGNAL( changed(const TQColor&) ), connect( kcfg_OsdTextColor, TQT_SIGNAL( changed(const TQColor&) ),
m_pOSDPreview, TQT_SLOT( setTextColor(const TQColor&) ) ); m_pOSDPreview, TQT_SLOT( setTextColor(const TQColor&) ) );
connect( kcfg_OsdUseCustomColors, TQT_SIGNAL( toggled(bool) ), connect( kcfg_OsdUseCustomColors, TQT_SIGNAL( toggled(bool) ),
this, TQT_SLOT( useCustomColorsToggled(bool) ) ); this, TQT_SLOT( useCustomColorsToggled(bool) ) );
connect( kcfg_OsdBackgroundColor, TQT_SIGNAL( changed(const TQColor&) ), connect( kcfg_OsdUseFakeTranslucency, TQT_SIGNAL( toggled(bool) ),
m_pOSDPreview, TQT_SLOT( setBackgroundColor(const TQColor&) ) ); this, TQT_SLOT( useFakeTransparencyToggled(bool) ) );
connect( kcfg_OsdFont, TQT_SIGNAL( fontSelected(const TQFont&) ), connect( kcfg_OsdBackgroundColor, TQT_SIGNAL( changed(const TQColor&) ),
m_pOSDPreview, TQT_SLOT( setFont(const TQFont&) ) ); m_pOSDPreview, TQT_SLOT( setBackgroundColor(const TQColor&) ) );
connect( kcfg_OsdScreen, TQT_SIGNAL( activated(int) ), connect( kcfg_OsdFont, TQT_SIGNAL( fontSelected(const TQFont&) ),
m_pOSDPreview, TQT_SLOT( setScreen(int) ) ); m_pOSDPreview, TQT_SLOT( setFont(const TQFont&) ) );
connect( kcfg_OsdEnabled, TQT_SIGNAL( toggled(bool) ), connect( kcfg_OsdScreen, TQT_SIGNAL( activated(int) ),
m_pOSDPreview, TQT_SLOT( setShown(bool) ) ); m_pOSDPreview, TQT_SLOT( setScreen(int) ) );
connect( kcfg_OsdEnabled, TQT_SIGNAL( toggled(bool) ),
m_pOSDPreview, TQT_SLOT( setShown(bool) ) );
Amarok::QStringx text = i18n( Amarok::QStringx text = i18n(
"<h3>Tags Displayed in OSD</h3>" "<h3>Tags Displayed in OSD</h3>"
@ -113,6 +116,7 @@ void
Options5::showEvent( TQShowEvent* ) Options5::showEvent( TQShowEvent* )
{ {
useCustomColorsToggled( kcfg_OsdUseCustomColors->isChecked() ); useCustomColorsToggled( kcfg_OsdUseCustomColors->isChecked() );
useFakeTransparencyToggled( kcfg_OsdUseFakeTranslucency->isChecked() );
m_pOSDPreview->setFont( kcfg_OsdFont->font() ); m_pOSDPreview->setFont( kcfg_OsdFont->font() );
m_pOSDPreview->setScreen( kcfg_OsdScreen->currentItem() ); m_pOSDPreview->setScreen( kcfg_OsdScreen->currentItem() );
@ -124,3 +128,12 @@ Options5::useCustomColorsToggled( bool on )
{ {
m_pOSDPreview->setUseCustomColors( on, kcfg_OsdTextColor->color(), kcfg_OsdBackgroundColor->color() ); 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 );
}

@ -120,12 +120,12 @@ appleEventProcessor(const AppleEvent *ae, AppleEvent *, long /*handlerRefCon*/)
LIBAMAROK_EXPORT KAboutData aboutData( "amarok", LIBAMAROK_EXPORT KAboutData aboutData( "amarok",
I18N_NOOP( "Amarok" ), APP_VERSION, I18N_NOOP( "Amarok" ), APP_VERSION,
I18N_NOOP( "The audio player for KDE" ), KAboutData::License_GPL, 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__ ")" ), 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" ) ); ( "http://amarok.kde.org" ) );
App::App() App::App()
: KApplication() : KApplication(KApplication::openX11RGBADisplay())
, m_pPlayerWindow( 0 ) //will be created in applySettings() , m_pPlayerWindow( 0 ) //will be created in applySettings()
{ {
DEBUG_BLOCK DEBUG_BLOCK

@ -139,7 +139,7 @@ OSDWidget::show() //virtual
newGeometry.width(), newGeometry.height() )); newGeometry.width(), newGeometry.height() ));
else if( m_translucency ) else if (( m_translucency ) && (!kapp->isX11CompositionAvailable()))
{ {
const TQRect unite = oldGeometry.unite( newGeometry ); const TQRect unite = oldGeometry.unite( newGeometry );
KPixmap pix = TQPixmap(TQPixmap::grabWindow( qt_xrootwin(), unite.x(), unite.y(), unite.width(), unite.height() )); 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() ); render( M, newGeometry.size() );
setGeometry( newGeometry ); setGeometry( newGeometry );
TQWidget::show(); TQWidget::show();
bitBlt( this, 0, 0, &m_buffer ); paintMe();
if( m_duration ) //duration 0 -> stay forever if( m_duration ) //duration 0 -> stay forever
m_timer->start( m_duration, true ); //calls hide() 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() ); m_buffer.resize( rect.size() );
TQPainter p( &m_buffer ); TQPainter p( &m_buffer );
if( m_translucency ) if (( m_translucency ) && (!kapp->isX11CompositionAvailable()))
{ {
KPixmap background( m_screenshot ); KPixmap background( m_screenshot );
KPixmapEffect::fade( background, 0.80, backgroundColor() ); KPixmapEffect::fade( background, 0.80, backgroundColor() );
@ -386,7 +386,7 @@ OSDWidget::render( const uint M, const TQSize &size )
pixmapGradient.setMask( mask ); pixmapGradient.setMask( mask );
} }
if( m_translucency ) if (( m_translucency ) && (!kapp->isX11CompositionAvailable()))
{ {
KPixmap background( m_screenshot ); KPixmap background( m_screenshot );
KPixmapEffect::fade( background, 0.80, backgroundColor() ); KPixmapEffect::fade( background, 0.80, backgroundColor() );
@ -487,6 +487,45 @@ OSDWidget::render( const uint M, const TQSize &size )
p.end(); 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 bool
OSDWidget::event( TQEvent *e ) OSDWidget::event( TQEvent *e )
{ {
@ -497,7 +536,7 @@ OSDWidget::event( TQEvent *e )
unsetColors(); //use new palette's colours unsetColors(); //use new palette's colours
return true; return true;
case TQEvent::Paint: case TQEvent::Paint:
bitBlt( this, 0, 0, &m_buffer ); paintMe();
return true; return true;
default: default:
return TQWidget::event( e ); return TQWidget::event( e );

@ -26,7 +26,7 @@
class OSDWidget : public TQWidget class OSDWidget : public TQWidget
{ {
Q_OBJECT Q_OBJECT
TQ_OBJECT TQ_OBJECT
public: public:
enum Alignment { Left, Middle, Center, Right }; enum Alignment { Left, Middle, Center, Right };
@ -81,6 +81,8 @@ class OSDWidget : public TQWidget
bool useMoodbar( void ); bool useMoodbar( void );
void paintMe();
/** distance from screen edge */ /** distance from screen edge */
static const int MARGIN = 15; static const int MARGIN = 15;

Loading…
Cancel
Save