You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/ksmserver/shutdowndlg.cpp

279 lines
7.9 KiB

/*****************************************************************
ksmserver - the KDE session management server
Copyright (C) 2000 Matthias Ettrich <ettrich@kde.org>
******************************************************************/
#include <config.h>
#include "shutdowndlg.h"
#include <qapplication.h>
#include <qlayout.h>
#include <qgroupbox.h>
#include <qvbuttongroup.h>
#include <qlabel.h>
#include <qvbox.h>
#include <qtimer.h>
#include <qstyle.h>
#include <qcombobox.h>
#include <qcursor.h>
#include <qmessagebox.h>
#include <qbuttongroup.h>
#include <qiconset.h>
#include <qpopupmenu.h>
#include <qtooltip.h>
#include <qimage.h>
#include <klocale.h>
#include <kapplication.h>
#include <kdebug.h>
#include <kpushbutton.h>
#include <kstdguiitem.h>
#include <kiconloader.h>
#include <kglobalsettings.h>
#include <kwin.h>
#include <kuser.h>
#include <kpixmap.h>
#include <kimageeffect.h>
#include <kdialog.h>
#include <kseparator.h>
#include <sys/types.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <stdlib.h>
#include <dmctl.h>
#include <X11/Xlib.h>
#include "shutdowndlg.moc"
KSMShutdownFeedback * KSMShutdownFeedback::s_pSelf = 0L;
KSMShutdownFeedback::KSMShutdownFeedback()
: QWidget( 0L, "feedbackwidget", WType_Popup ),
m_currentY( 0 )
{
setBackgroundMode( QWidget::NoBackground );
setGeometry( QApplication::desktop()->geometry() );
QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) );
m_root.resize( width(), height() );
}
void KSMShutdownFeedback::slotPaintEffect()
{
if ( m_currentY >= height() ) {
if ( backgroundMode() == QWidget::NoBackground ) {
setBackgroundMode( QWidget::NoBackground );
setBackgroundPixmap( m_root );
}
return;
}
KPixmap pixmap;
pixmap = QPixmap::grabWindow( qt_xrootwin(), 0, m_currentY, width(), 10 );
QImage 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;
QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) );
}
//////
KSMShutdownDlg::KSMShutdownDlg( QWidget* parent,
bool maysd, KApplication::ShutdownType sdtype )
: QDialog( parent, 0, TRUE, WType_Popup ), targets(0)
// this is a WType_Popup on purpose. Do not change that! Not
// having a popup here has severe side effects.
{
QVBoxLayout* vbox = new QVBoxLayout( this );
QFrame* frame = new QFrame( this );
frame->setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
frame->setLineWidth( style().pixelMetric( QStyle::PM_DefaultFrameWidth, frame ) );
vbox->addWidget( frame );
vbox = new QVBoxLayout( frame, 2 * KDialog::marginHint(),
2 * KDialog::spacingHint() );
QLabel* label = new QLabel( i18n("End Session for \"%1\"").arg(KUser().loginName()), frame );
QFont fnt = label->font();
fnt.setBold( true );
fnt.setPointSize( fnt.pointSize() * 3 / 2 );
label->setFont( fnt );
vbox->addWidget( label, 0, AlignHCenter );
QHBoxLayout* hbox = new QHBoxLayout( vbox, 2 * KDialog::spacingHint() );
// konqy
QFrame* lfrm = new QFrame( frame );
lfrm->setFrameStyle( QFrame::Panel | QFrame::Sunken );
hbox->addWidget( lfrm, AlignCenter );
QLabel* icon = new QLabel( lfrm );
icon->setPixmap( UserIcon( "shutdownkonq" ) );
lfrm->setFixedSize( icon->sizeHint());
icon->setFixedSize( icon->sizeHint());
// right column (buttons)
QVBoxLayout* buttonlay = new QVBoxLayout( hbox, 2 * KDialog::spacingHint() );
buttonlay->setAlignment( Qt::AlignHCenter );
buttonlay->addStretch( 1 );
// End session
KPushButton* btnLogout = new KPushButton( KGuiItem( i18n("&End Current Session"), "undo"), frame );
QFont btnFont = btnLogout->font();
buttonlay->addWidget( btnLogout );
connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout()));
if (maysd) {
// Shutdown
KPushButton* btnHalt = new KPushButton( KGuiItem( i18n("&Turn Off Computer"), "exit"), frame );
btnHalt->setFont( btnFont );
buttonlay->addWidget( btnHalt );
connect(btnHalt, SIGNAL(clicked()), SLOT(slotHalt()));
if ( sdtype == KApplication::ShutdownTypeHalt )
btnHalt->setFocus();
// Reboot
KSMDelayedPushButton* btnReboot = new KSMDelayedPushButton( KGuiItem( i18n("&Restart Computer"), "reload"), frame );
btnReboot->setFont( btnFont );
buttonlay->addWidget( btnReboot );
connect(btnReboot, SIGNAL(clicked()), SLOT(slotReboot()));
if ( sdtype == KApplication::ShutdownTypeReboot )
btnReboot->setFocus();
int def, cur;
if ( DM().bootOptions( rebootOptions, def, cur ) ) {
targets = new QPopupMenu( frame );
if ( cur == -1 )
cur = def;
int index = 0;
for (QStringList::ConstIterator it = rebootOptions.begin(); it != rebootOptions.end(); ++it, ++index)
{
QString label = (*it);
label=label.replace('&',"&&");
if (index == cur)
targets->insertItem( label + i18n("current option in boot loader", " (current)"), index);
else
targets->insertItem( label, index );
}
btnReboot->setPopup(targets);
connect( targets, SIGNAL(activated(int)), SLOT(slotReboot(int)) );
}
}
buttonlay->addStretch( 1 );
// Separator
buttonlay->addWidget( new KSeparator( frame ) );
// Back to Desktop
KPushButton* btnBack = new KPushButton( KStdGuiItem::cancel(), frame );
buttonlay->addWidget( btnBack );
connect(btnBack, SIGNAL(clicked()), SLOT(reject()));
}
void KSMShutdownDlg::slotLogout()
{
m_shutdownType = KApplication::ShutdownTypeNone;
accept();
}
void KSMShutdownDlg::slotReboot()
{
// no boot option selected -> current
m_bootOption = QString::null;
m_shutdownType = KApplication::ShutdownTypeReboot;
accept();
}
void KSMShutdownDlg::slotReboot(int opt)
{
if (int(rebootOptions.size()) > opt)
m_bootOption = rebootOptions[opt];
m_shutdownType = KApplication::ShutdownTypeReboot;
accept();
}
void KSMShutdownDlg::slotHalt()
{
m_bootOption = QString::null;
m_shutdownType = KApplication::ShutdownTypeHalt;
accept();
}
bool KSMShutdownDlg::confirmShutdown( bool maysd, KApplication::ShutdownType& sdtype, QString& bootOption )
{
kapp->enableStyles();
KSMShutdownDlg* l = new KSMShutdownDlg( 0,
//KSMShutdownFeedback::self(),
maysd, sdtype );
// Show dialog (will save the background in showEvent)
QSize sh = l->sizeHint();
QRect rect = KGlobalSettings::desktopGeometry(QCursor::pos());
l->move(rect.x() + (rect.width() - sh.width())/2,
rect.y() + (rect.height() - sh.height())/2);
bool result = l->exec();
sdtype = l->m_shutdownType;
bootOption = l->m_bootOption;
delete l;
kapp->disableStyles();
return result;
}
KSMDelayedPushButton::KSMDelayedPushButton( const KGuiItem &item,
QWidget *parent,
const char *name)
: KPushButton( item, parent, name), pop(0), popt(0)
{
connect(this, SIGNAL(pressed()), SLOT(slotPressed()));
connect(this, SIGNAL(released()), SLOT(slotReleased()));
popt = new QTimer(this);
connect(popt, SIGNAL(timeout()), SLOT(slotTimeout()));
}
void KSMDelayedPushButton::setPopup(QPopupMenu *p)
{
pop = p;
setIsMenuButton(p != 0);
}
void KSMDelayedPushButton::slotPressed()
{
if (pop)
popt->start(QApplication::startDragTime());
}
void KSMDelayedPushButton::slotReleased()
{
popt->stop();
}
void KSMDelayedPushButton::slotTimeout()
{
QPoint bl = mapToGlobal(rect().bottomLeft());
QWidget *par = (QWidget*)parent();
QPoint br = par->mapToGlobal(par->rect().bottomRight());
pop->popup( bl );
popt->stop();
setDown(false);
}