Add secondary logout fadeaway control

This resolves Bug 1999
This relates to Bug 258
pull/2/head
Darrell Anderson 10 years ago committed by Slávek Banko
parent 0b4c2f588d
commit 907d8b7d7b

@ -94,7 +94,9 @@ void SMServerConfig::load(bool useDefaults )
c->setGroup("Logout"); c->setGroup("Logout");
dialog->showLogoutStatusDialog->setChecked(c->readBoolEntry("showLogoutStatusDlg", true)); dialog->showLogoutStatusDialog->setChecked(c->readBoolEntry("showLogoutStatusDlg", true));
dialog->showFadeAway->setChecked(c->readBoolEntry("doFadeaway", true));
dialog->showFancyFadeAway->setChecked(c->readBoolEntry("doFancyLogout", true)); dialog->showFancyFadeAway->setChecked(c->readBoolEntry("doFancyLogout", true));
dialog->showFancyFadeAway->setEnabled(dialog->confirmLogoutCheck->isChecked() && dialog->showFadeAway->isChecked()),
delete c; delete c;
@ -124,6 +126,7 @@ void SMServerConfig::save()
c->writeEntry("excludeApps", dialog->excludeLineedit->text()); c->writeEntry("excludeApps", dialog->excludeLineedit->text());
c->setGroup("Logout"); c->setGroup("Logout");
c->writeEntry( "showLogoutStatusDlg", dialog->showLogoutStatusDialog->isChecked()); c->writeEntry( "showLogoutStatusDlg", dialog->showLogoutStatusDialog->isChecked());
c->writeEntry( "doFadeaway", dialog->showFadeAway->isChecked());
c->writeEntry( "doFancyLogout", dialog->showFancyFadeAway->isChecked()); c->writeEntry( "doFancyLogout", dialog->showFancyFadeAway->isChecked());
c->sync(); c->sync();
delete c; delete c;

@ -55,18 +55,32 @@
</property> </property>
</widget> </widget>
<widget class="TQCheckBox"> <widget class="TQCheckBox">
<property name="name"> <property name="name">
<cstring>showFancyFadeAway</cstring> <cstring>showFadeAway</cstring>
</property> </property>
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>false</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Show fancy &amp;logout fadeaway</string> <string>Show &amp;logout fadeaway</string>
</property> </property>
<property name="whatsThis" stdset="0"> <property name="whatsThis" stdset="0">
<string>Check this option if you want to see a fancy fadeaway when displaying a logout confirmation dialog box.</string> <string>Check this option if you want to see a fadeaway when displaying a logout confirmation dialog box.</string>
</property> </property>
</widget>
<widget class="TQCheckBox">
<property name="name">
<cstring>showFancyFadeAway</cstring>
</property>
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Sho&amp;w fancy logout fadeaway</string>
</property>
<property name="whatsThis" stdset="0">
<string>Check this option if you want to see a fancy fadeaway when displaying a logout confirmation dialog box.</string>
</property>
</widget> </widget>
<widget class="TQCheckBox"> <widget class="TQCheckBox">
<property name="name"> <property name="name">
@ -235,16 +249,34 @@
<slot>configChanged()</slot> <slot>configChanged()</slot>
</connection> </connection>
<connection> <connection>
<sender>confirmLogoutCheck</sender> <sender>confirmLogoutCheck</sender>
<signal>toggled(bool)</signal> <signal>toggled(bool)</signal>
<receiver>showFancyFadeAway</receiver> <receiver>showFadeAway</receiver>
<slot>setEnabled(bool)</slot> <slot>setEnabled(bool)</slot>
</connection> </connection>
<connection> <connection>
<sender>showFancyFadeAway</sender> <sender>confirmLogoutCheck</sender>
<signal>toggled(bool)</signal> <signal>toggled(bool)</signal>
<receiver>SMServerConfigDlg</receiver> <receiver>showFancyFadeAway</receiver>
<slot>configChanged()</slot> <slot>setEnabled(bool)</slot>
</connection>
<connection>
<sender>showFadeAway</sender>
<signal>toggled(bool)</signal>
<receiver>showFancyFadeAway</receiver>
<slot>setEnabled(bool)</slot>
</connection>
<connection>
<sender>showFadeAway</sender>
<signal>toggled(bool)</signal>
<receiver>SMServerConfigDlg</receiver>
<slot>configChanged()</slot>
</connection>
<connection>
<sender>showFancyFadeAway</sender>
<signal>toggled(bool)</signal>
<receiver>SMServerConfigDlg</receiver>
<slot>configChanged()</slot>
</connection> </connection>
<connection> <connection>
<sender>showLogoutStatusDialog</sender> <sender>showLogoutStatusDialog</sender>

@ -113,7 +113,8 @@ void KSMShutdownFeedback::fadeBack( void )
void KSMShutdownFeedback::slotPaintEffect() void KSMShutdownFeedback::slotPaintEffect()
{ {
// determine which fade to use // determine which fade to use
if (TDEConfigGroup(TDEGlobal::config(), "Logout").readBoolEntry("doFancyLogout", true)) { if ( (TDEConfigGroup(TDEGlobal::config(), "Logout").readBoolEntry("doFadeaway", true)) &&
(TDEConfigGroup(TDEGlobal::config(), "Logout").readBoolEntry("doFancyLogout", true)) ) {
// fancy logout fade // fancy logout fade
float doFancyLogoutAdditionalDarkness = (float)TDEConfigGroup(TDEGlobal::config(), "Logout").readDoubleNumEntry("doFancyLogoutAdditionalDarkness", 0.6); float doFancyLogoutAdditionalDarkness = (float)TDEConfigGroup(TDEGlobal::config(), "Logout").readDoubleNumEntry("doFancyLogoutAdditionalDarkness", 0.6);
float doFancyLogoutFadeTime = (float)TDEConfigGroup(TDEGlobal::config(), "Logout").readDoubleNumEntry("doFancyLogoutFadeTime", 4000); float doFancyLogoutFadeTime = (float)TDEConfigGroup(TDEGlobal::config(), "Logout").readDoubleNumEntry("doFancyLogoutFadeTime", 4000);
@ -363,149 +364,151 @@ void KSMShutdownFeedback::slotPaintEffect()
} }
} }
else { else {
// standard logout fade if (TDEConfigGroup(TDEGlobal::config(), "Logout").readBoolEntry("doFadeaway", true)) {
if (kapp->isX11CompositionAvailable()) { // standard logout fade
// We can do this in a different (simpler) manner because we have compositing support! if (kapp->isX11CompositionAvailable()) {
// The end effect will be very similar to the old style logout // We can do this in a different (simpler) manner because we have compositing support!
float doFancyLogoutFadeTime = 1000; // The end effect will be very similar to the old style logout
float doFancyLogoutFadeBackTime = 0; float doFancyLogoutFadeTime = 1000;
if ( m_greyImageCreated == false ) { float doFancyLogoutFadeBackTime = 0;
m_greyImageCreated = true; if ( m_greyImageCreated == false ) {
m_greyImageCreated = true;
// eliminate nasty flicker on first show
m_root.resize( width(), height() );
TQImage blendedImage = m_grayImage;
TQPainter p;
p.begin( &m_root );
blendedImage.setAlphaBuffer(false);
p.drawImage( 0, 0, blendedImage );
p.end();
// eliminate nasty flicker on first show setBackgroundPixmap( m_root );
m_root.resize( width(), height() ); setGeometry( TQApplication::desktop()->geometry() );
TQImage blendedImage = m_grayImage; setBackgroundMode( TQWidget::NoBackground );
TQPainter p;
p.begin( &m_root );
blendedImage.setAlphaBuffer(false);
p.drawImage( 0, 0, blendedImage );
p.end();
setBackgroundPixmap( m_root ); m_unfadedImage = m_grayImage.copy();
setGeometry( TQApplication::desktop()->geometry() );
setBackgroundMode( TQWidget::NoBackground );
m_unfadedImage = m_grayImage.copy(); register uchar * r = m_grayImage.bits();
uchar * end = m_grayImage.bits() + m_grayImage.numBytes();
register uchar * r = m_grayImage.bits(); while ( r != end ) {
uchar * end = m_grayImage.bits() + m_grayImage.numBytes(); *reinterpret_cast<TQRgb*>(r) = tqRgba(0, 0, 0, 107);
r += 4;
}
while ( r != end ) { // start timer which is used for cpu-speed-independent fading
*reinterpret_cast<TQRgb*>(r) = tqRgba(0, 0, 0, 107); m_fadeTime.start();
r += 4; m_rowsDone = 0;
} }
// start timer which is used for cpu-speed-independent fading // return if fading is completely done...
m_fadeTime.start(); if ( ( m_grayOpacity >= 1.0f && m_fadeBackwards == FALSE ) || ( m_grayOpacity <= 0.0f && m_fadeBackwards == TRUE ) ) {
m_rowsDone = 0; return;
} }
// return if fading is completely done...
if ( ( m_grayOpacity >= 1.0f && m_fadeBackwards == FALSE ) || ( m_grayOpacity <= 0.0f && m_fadeBackwards == TRUE ) ) {
return;
}
if ( m_fadeBackwards == FALSE ) { if ( m_fadeBackwards == FALSE ) {
m_grayOpacity = m_fadeTime.elapsed() / doFancyLogoutFadeTime; m_grayOpacity = m_fadeTime.elapsed() / doFancyLogoutFadeTime;
if ( m_grayOpacity > 1.0f ) if ( m_grayOpacity > 1.0f )
m_grayOpacity = 1.0f; m_grayOpacity = 1.0f;
} }
else { else {
m_grayOpacity = 1.0f - m_fadeTime.elapsed() / doFancyLogoutFadeBackTime - m_compensation; m_grayOpacity = 1.0f - m_fadeTime.elapsed() / doFancyLogoutFadeBackTime - m_compensation;
if ( m_grayOpacity < 0.0f ) if ( m_grayOpacity < 0.0f )
m_grayOpacity = 0.0f; m_grayOpacity = 0.0f;
} }
const int imgWidth = m_unfadedImage.width(); const int imgWidth = m_unfadedImage.width();
int imgHeight = m_unfadedImage.height(); int imgHeight = m_unfadedImage.height();
int heightUnit = imgHeight / 3; int heightUnit = imgHeight / 3;
if( heightUnit < 1 ) if( heightUnit < 1 )
heightUnit = 1; heightUnit = 1;
int y1 = static_cast<int>( imgHeight*m_grayOpacity - heightUnit + m_grayOpacity*heightUnit*2.0f ); int y1 = static_cast<int>( imgHeight*m_grayOpacity - heightUnit + m_grayOpacity*heightUnit*2.0f );
if( y1 > imgHeight ) { if( y1 > imgHeight ) {
y1 = imgHeight; y1 = imgHeight;
} }
int y2 = y1+heightUnit; int y2 = y1+heightUnit;
if( y2 > imgHeight ) { if( y2 > imgHeight ) {
y2 = imgHeight; y2 = imgHeight;
} }
if( m_fadeBackwards == FALSE ) if( m_fadeBackwards == FALSE )
{
if( y1 > 0 && y1 < imgHeight && y1-m_rowsDone > 0 && m_rowsDone < imgHeight )
{ {
TQImage img( imgWidth, y1-m_rowsDone, 32 ); if( y1 > 0 && y1 < imgHeight && y1-m_rowsDone > 0 && m_rowsDone < imgHeight )
memcpy( img.bits(), m_grayImage.scanLine( m_rowsDone ), imgWidth*(y1-m_rowsDone)*4 ); {
bitBlt( this, 0, m_rowsDone, &img ); TQImage img( imgWidth, y1-m_rowsDone, 32 );
m_rowsDone = y1; memcpy( img.bits(), m_grayImage.scanLine( m_rowsDone ), imgWidth*(y1-m_rowsDone)*4 );
bitBlt( this, 0, m_rowsDone, &img );
m_rowsDone = y1;
}
} }
} else {
else { // when fading back we have to blit area which isnt gray anymore to unfaded image
// when fading back we have to blit area which isnt gray anymore to unfaded image if( y2 > 0 && y2 < imgHeight && m_rowsDone > y2 )
if( y2 > 0 && y2 < imgHeight && m_rowsDone > y2 ) {
{ TQImage img( imgWidth, m_rowsDone-y2, 32 );
TQImage img( imgWidth, m_rowsDone-y2, 32 ); memcpy( img.bits(), m_unfadedImage.scanLine( y2 ), imgWidth*(m_rowsDone-y2)*4 );
memcpy( img.bits(), m_unfadedImage.scanLine( y2 ), imgWidth*(m_rowsDone-y2)*4 ); bitBlt( this, 0, y2, &img );
bitBlt( this, 0, y2, &img ); m_rowsDone = y2;
m_rowsDone = y2; }
} }
}
int start_y1 = y1; int start_y1 = y1;
if( start_y1 < 0 ) { if( start_y1 < 0 ) {
start_y1 = 0; start_y1 = 0;
} }
if( y2 > start_y1 ) { if( y2 > start_y1 ) {
TQImage img( imgWidth, y2-start_y1, 32 ); TQImage img( imgWidth, y2-start_y1, 32 );
memcpy( img.bits(), m_grayImage.scanLine( start_y1 ), ( y2-start_y1 ) * imgWidth * 4 ); memcpy( img.bits(), m_grayImage.scanLine( start_y1 ), ( y2-start_y1 ) * imgWidth * 4 );
register uchar * rs = m_unfadedImage.scanLine( start_y1 ); register uchar * rs = m_unfadedImage.scanLine( start_y1 );
register uchar * rd = img.bits(); register uchar * rd = img.bits();
for( int y = start_y1; y < y2; ++y ) for( int y = start_y1; y < y2; ++y )
{
// linear gradients look bad, so use cos-function
for( short int x = 0; x < imgWidth; ++x )
{ {
*reinterpret_cast<TQRgb*>(rd) = tqRgba(0, 0, 0, 107); // linear gradients look bad, so use cos-function
rs += 4; rd += 4; for( short int x = 0; x < imgWidth; ++x )
{
*reinterpret_cast<TQRgb*>(rd) = tqRgba(0, 0, 0, 107);
rs += 4; rd += 4;
}
} }
bitBlt( this, 0, start_y1, &img );
} }
bitBlt( this, 0, start_y1, &img );
}
TQTimer::singleShot( 1, this, TQT_SLOT( slotPaintEffect() ) ); TQTimer::singleShot( 1, this, TQT_SLOT( slotPaintEffect() ) );
} }
else { else {
if ( m_currentY >= height() ) { if ( m_currentY >= height() ) {
if ( backgroundMode() == TQWidget::NoBackground ) { if ( backgroundMode() == TQWidget::NoBackground ) {
setBackgroundMode( TQWidget::NoBackground ); setBackgroundMode( TQWidget::NoBackground );
setBackgroundPixmap( m_root ); setBackgroundPixmap( m_root );
}
return;
} }
return;
}
if ( m_currentY == 0 ) { if ( m_currentY == 0 ) {
setBackgroundMode( TQWidget::NoBackground ); setBackgroundMode( TQWidget::NoBackground );
setGeometry( TQApplication::desktop()->geometry() ); setGeometry( TQApplication::desktop()->geometry() );
m_root.resize( width(), height() ); // for the default logout m_root.resize( width(), height() ); // for the default logout
KPixmap pixmap;
pixmap = TQPixmap(TQPixmap::grabWindow( tqt_xrootwin(), 0, 0, width(), height() ));
bitBlt( this, 0, 0, &pixmap );
bitBlt( &m_root, 0, 0, &pixmap );
}
KPixmap pixmap; KPixmap pixmap;
pixmap = TQPixmap(TQPixmap::grabWindow( tqt_xrootwin(), 0, 0, width(), height() )); pixmap = TQPixmap(TQPixmap::grabWindow( tqt_xrootwin(), 0, m_currentY, width(), 10 ));
bitBlt( this, 0, 0, &pixmap ); TQImage image = pixmap.convertToImage();
bitBlt( &m_root, 0, 0, &pixmap ); KImageEffect::blend( Qt::black, image, 0.4 );
KImageEffect::toGray( image, true );
pixmap.convertFromImage( image );
bitBlt( this, 0, m_currentY, &pixmap );
bitBlt( &m_root, 0, m_currentY, &pixmap );
m_currentY += 10;
TQTimer::singleShot( 1, this, TQT_SLOT( slotPaintEffect() ) );
} }
KPixmap pixmap;
pixmap = TQPixmap(TQPixmap::grabWindow( tqt_xrootwin(), 0, m_currentY, width(), 10 ));
TQImage image = pixmap.convertToImage();
KImageEffect::blend( Qt::black, image, 0.4 );
KImageEffect::toGray( image, true );
pixmap.convertFromImage( image );
bitBlt( this, 0, m_currentY, &pixmap );
bitBlt( &m_root, 0, m_currentY, &pixmap );
m_currentY += 10;
TQTimer::singleShot( 1, this, TQT_SLOT( slotPaintEffect() ) );
} }
} }

Loading…
Cancel
Save