[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-usability
Subject:    Re: Logout Dialog
From:       Andre Moreira Magalhaes <andrunko () yahoo ! com ! br>
Date:       2004-11-15 14:11:19
Message-ID: 20041115141119.63751.qmail () web51905 ! mail ! yahoo ! com
[Download RAW message or body]

Hi all,

I did some changes to the logout dialog in order to improve it's usability and
eyecandy (at least in my opnion). I would like to know what you think about and
what can be done to improve it (if that's case). 

The new dialog is based on the WinXP logout dialog (that i believe is very good
in usability). Please don't start saying that this sucks just because it's
similar to the Windows version, try this out and if you don't like it, tell me
what can be improved and i will do it (if i agree of course).

Attached there is a patch and some necessary files.
The icons attached are the same found in crystalsvg CVS version. 

Any sugestion is wellcome.
I hope you enjoy.

cheers,
Andrunko

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
["ksmserver.diff" (text/x-patch)]

Index: ksmserver/Makefile.am
===================================================================
RCS file: /home/kde/kdebase/ksmserver/Makefile.am,v
retrieving revision 1.22
diff -u -p -r1.22 Makefile.am
--- ksmserver/Makefile.am	14 Nov 2004 17:22:50 -0000	1.22
+++ ksmserver/Makefile.am	15 Nov 2004 14:07:36 -0000
@@ -22,17 +22,17 @@ INCLUDES= -I$(top_srcdir)/kdmlib $(all_i
 bin_PROGRAMS =
 lib_LTLIBRARIES =
 kdeinit_LTLIBRARIES = ksmserver.la
-noinst_HEADERS = global.h server.h shutdown.h
+noinst_HEADERS = global.h server.h shutdown.h urlbutton.h
 
 ksmserver_la_METASOURCES = AUTO
 # Order is important for --enable-final!
-ksmserver_la_SOURCES = main.cpp server.cpp shutdown.cpp KSMServerInterface.skel
+ksmserver_la_SOURCES = main.cpp server.cpp shutdown.cpp urlbutton.cpp \
KSMServerInterface.skel  
 ksmserver_la_LDFLAGS = $(all_libraries) -avoid-version -module
 ksmserver_la_LIBADD = ../kdmlib/libdmctl.la $(LIB_KDEUI)
 
 picsdir = $(kde_datadir)/ksmserver/pics
-pics_DATA = shutdownkonq.png
+pics_DATA = end_session.png exit.png reboot.png
 
 update_DATA = ksmserver.upd
 update_SCRIPTS = move_session_config.sh
Index: ksmserver/shutdown.cpp
===================================================================
RCS file: /home/kde/kdebase/ksmserver/shutdown.cpp,v
retrieving revision 1.51
diff -u -p -r1.51 shutdown.cpp
--- ksmserver/shutdown.cpp	15 Aug 2004 13:54:23 -0000	1.51
+++ ksmserver/shutdown.cpp	15 Nov 2004 14:07:36 -0000
@@ -7,6 +7,8 @@ Copyright (C) 2000 Matthias Ettrich <ett
 #include <config.h>
 
 #include "shutdown.h"
+#include "urlbutton.h"
+
 #include <qapplication.h>
 #include <qlayout.h>
 #include <qgroupbox.h>
@@ -29,7 +31,6 @@ Copyright (C) 2000 Matthias Ettrich <ett
 #include <kglobalsettings.h>
 #include <kwin.h>
 #include <kuser.h>
-#include <kpixmap.h>
 #include <kpixmapeffect.h>
 #include <kdialog.h>
 #include <kseparator.h>
@@ -47,6 +48,7 @@ KSMShutdownFeedback * KSMShutdownFeedbac
 
 KSMShutdownFeedback::KSMShutdownFeedback()
  : QWidget( 0L, "feedbackwidget", WType_Popup ),
+   // m_fadeVal( 10 )
    m_currentY( 0 )
 {
     setBackgroundMode( QWidget::NoBackground );
@@ -54,9 +56,18 @@ KSMShutdownFeedback::KSMShutdownFeedback
     QTimer::singleShot( 10, this, SLOT( slotPaintEffect() ) );
 }
 
-
 void KSMShutdownFeedback::slotPaintEffect()
 {
+    // if ( m_fadeVal > 40 )
+    //     return;
+    //
+    // if ( m_pixmap.isNull() )
+    //     m_pixmap = QPixmap::grabWindow( qt_xrootwin(), 0, 0, width(), height() );
+    // KPixmapEffect::fade( m_pixmap, m_fadeVal / 1000.0, Qt::black );
+    // bitBlt( this, 0, m_currentY, &m_pixmap );
+    // m_fadeVal += 2;
+    // QTimer::singleShot( 1, this, SLOT( slotPaintEffect() ) );
+    
     if ( m_currentY >= height() )
         return;
 
@@ -77,76 +88,88 @@ KSMShutdownDlg::KSMShutdownDlg( QWidget*
     // 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 );
+    QVBoxLayout* vbox = new QVBoxLayout( this, 0, 1 );
+    
+    QFrame *frame = new QFrame( this, "frame" );
     frame->setLineWidth( style().pixelMetric( QStyle::PM_DefaultFrameWidth, frame ) \
                );
-    vbox->addWidget( frame );
-    vbox = new QVBoxLayout( frame, 2 * KDialog::marginHint(),
-                            2 * KDialog::spacingHint() );
+    frame->setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
+    
+    QVBoxLayout *framelay = new QVBoxLayout( frame, 1, 1, "frameLayout"); 
 
-    QLabel* label = new QLabel( i18n("End Session for \
\"%1\"").arg(KUser().loginName()), frame ); +    QFrame *tfrm = new QFrame( frame, \
"tfrm" ); +    tfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+    tfrm->setPaletteBackgroundColor( colorGroup().background().dark(140) );
+    QHBoxLayout *tfrmlay = new QHBoxLayout( tfrm, KDialog::marginHint(), 0, \
"tfrmlayout" ); +    
+    QLabel* label = new QLabel( i18n("End Session for \
\"%1\"").arg(KUser().loginName()), tfrm, "label" ); +    \
label->setPaletteForegroundColor( QColor( 255, 255, 255 ) );  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 );
-    lfrm->setPaletteBackgroundColor( lfrm->colorGroup().midlight() );
-    hbox->addWidget( lfrm, AlignCenter );
-    QVBoxLayout* iconlay = new QVBoxLayout(
-        lfrm, KDialog::marginHint(), KDialog::spacingHint() );
-    QLabel* icon = new QLabel( lfrm );
-    icon->setPixmap( UserIcon( "shutdownkonq" ) );
-    iconlay->addWidget( icon );
-
-    // right column (buttons)
-    QVBoxLayout* buttonlay = new QVBoxLayout( hbox, 2 * KDialog::spacingHint() );
-    buttonlay->setAlignment( Qt::AlignHCenter );
+    tfrmlay->addWidget( label );
+    framelay->addWidget( tfrm, 0 );
 
-    buttonlay->addStretch( 1 );
+    // (buttons)
+    QFrame *btnfrm = new QFrame( frame, "btnfrm" );
+    btnfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+   
+    QHBoxLayout* buttonlay = new QHBoxLayout( btnfrm, 2 * KDialog::marginHint(), 3 * \
KDialog::spacingHint(), "buttonlay" ); +    buttonlay->setAlignment( Qt::AlignVCenter \
);  
     // End session
-    KPushButton* btnLogout = new KPushButton( KGuiItem( i18n("&End Current \
Session"), "undo"), frame ); +    URLButton* btnLogout = new URLButton( UserIcon( \
"end_session" ), i18n( "&End Current\nSession" ), btnfrm );  QFont btnFont = \
btnLogout->font(); +    btnFont.setBold( TRUE );
+    btnLogout->setFont( btnFont );
     buttonlay->addWidget( btnLogout );
-    connect(btnLogout, SIGNAL(clicked()), SLOT(slotLogout()));
+    connect( btnLogout, SIGNAL( clicked() ), SLOT( slotLogout() ) );
 
-    if (maysd) {
+    // Shutdown
+    URLButton* btnHalt = new URLButton( UserIcon( "exit" ), i18n( "&Turn \
Off\nComputer" ), btnfrm ); +    btnHalt->setFont( btnFont );
+    buttonlay->addWidget( btnHalt );
+    connect( btnHalt, SIGNAL( clicked() ), SLOT( slotHalt() ) );
+
+    // Reboot
+    URLButton* btnReboot = new URLButton( UserIcon( "reboot" ), i18n( \
"&Restart\nComputer" ), btnfrm ); +    btnReboot->setFont( btnFont );
+    buttonlay->addWidget( btnReboot );
+    connect( btnReboot, SIGNAL( clicked() ), SLOT( slotReboot() ) );
 
-        // 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 ( maysd ) {
         if ( sdtype == KApplication::ShutdownTypeHalt )
             btnHalt->setFocus();
-
-        // Reboot
-        KPushButton* btnReboot = new KPushButton( KGuiItem( i18n("&Restart \
                Computer"), "reload"), frame );
-        btnReboot->setFont( btnFont );
-        buttonlay->addWidget( btnReboot );
-        connect(btnReboot, SIGNAL(clicked()), SLOT(slotReboot()));
-        if ( sdtype == KApplication::ShutdownTypeReboot )
+	else if ( sdtype == KApplication::ShutdownTypeReboot )
             btnReboot->setFocus();
-
     }
-
-    buttonlay->addStretch( 1 );
-
-    // Separator
-    buttonlay->addWidget( new KSeparator( frame ) );
-
+    else {
+	btnHalt->setEnabled( FALSE );
+	btnReboot->setEnabled( FALSE );
+    }
+    framelay->addWidget( btnfrm, 1 );
+ 
+    KPixmap pix;
+    pix.resize( btnfrm->sizeHint().width(), btnfrm->sizeHint().height() );
+    btnfrm->setPaletteBackgroundPixmap( KPixmapEffect::gradient( pix, \
colorGroup().background().light( 150 ), colorGroup().background().dark( 150 ), \
KPixmapEffect::DiagonalGradient ) ); +       
     // Back to Desktop
-    KPushButton* btnBack = new KPushButton( KStdGuiItem::cancel(), frame );
-    buttonlay->addWidget( btnBack );
-    connect(btnBack, SIGNAL(clicked()), SLOT(reject()));
-
+    QFrame *bfrm = new QFrame( frame, "bfrm" );
+    bfrm->setFrameStyle( QFrame::NoFrame | QFrame::Plain );
+    bfrm->setPaletteBackgroundColor( colorGroup().background().dark(150) );
+    
+    QHBoxLayout *bfrmlay = new QHBoxLayout( bfrm, KDialog::marginHint(), 0, \
"bfrmlay" ); +    bfrmlay->addStretch( 1 );
+
+    KPushButton* btnBack = new KPushButton( KStdGuiItem::cancel(), bfrm );
+    bfrmlay->addWidget( btnBack );
+    connect( btnBack, SIGNAL( clicked() ), SLOT( reject() ) );
+
+    bfrmlay->addWidget( bfrm );
+    framelay->addWidget( bfrm, 0 );
+    
+    vbox->addWidget( frame );
 }
 
 
Index: ksmserver/shutdown.h
===================================================================
RCS file: /home/kde/kdebase/ksmserver/shutdown.h,v
retrieving revision 1.12
diff -u -p -r1.12 shutdown.h
--- ksmserver/shutdown.h	15 Aug 2004 13:54:23 -0000	1.12
+++ ksmserver/shutdown.h	15 Nov 2004 14:07:36 -0000
@@ -13,6 +13,7 @@ class QPushButton;
 class QVButtonGroup;
 
 #include <kapplication.h>
+// #include <kpixmap.h>
 
 // The (singleton) widget that makes the desktop gray.
 class KSMShutdownFeedback : public QWidget
@@ -33,6 +34,9 @@ private slots:
 private:
     static KSMShutdownFeedback * s_pSelf;
     KSMShutdownFeedback();
+
+    // KPixmap m_pixmap;
+    // short m_fadeVal;
     int m_currentY;
 };
 
Index: ksmserver/urlbutton.cpp
===================================================================
RCS file: ksmserver/urlbutton.cpp
diff -N ksmserver/urlbutton.cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ksmserver/urlbutton.cpp	15 Nov 2004 14:07:36 -0000
@@ -0,0 +1,245 @@
+/******************************************************************************
+** Copyright (c) 2004 Andre Moreira Magalhaes.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a copy
+** of this software and associated documentation files (the "Software"), to deal
+** in the Software without restriction, including without limitation the rights
+** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+** copies of the Software, and to permit persons to whom the Software is
+** furnished to do so, subject to the following conditions:
+**
+** The above copyright notice and this permission notice shall be included in
+** all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+** AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+** AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+**
+*******************************************************************************/
+
+#include "urlbutton.h"
+
+#include <qapplication.h>
+#include <qevent.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qtimer.h>
+
+#include <kcursor.h>
+#include <kpixmap.h>
+#include <kpixmapeffect.h>
+
+URLButton::URLButton( const QPixmap &pix, const QString &textLabel, QWidget *parent, \
const char *name ) +  : QWidget( parent, name ),
+    m_buttonDown( FALSE ),
+    m_mouseOver( FALSE ),
+    m_pressed( FALSE ),
+    m_force( FALSE )
+{
+  setBackgroundOrigin( AncestorOrigin );
+  setFocusPolicy( QLabel::TabFocus );
+
+  QVBoxLayout *hlay = new QVBoxLayout( this, 0, 2 );
+ 
+  m_pix = pix;
+  m_pixLabel = new QLabel( this );
+  m_pixLabel->setBackgroundOrigin( AncestorOrigin );
+  m_pixLabel->setPixmap( m_pix );
+  m_pixLabel->setAlignment( QLabel::AlignCenter );
+  hlay->addWidget( m_pixLabel );
+
+  m_label = new QLabel( textLabel, this );
+  m_label->setText( textLabel );
+  m_label->setBackgroundOrigin( AncestorOrigin );
+  m_label->setAlignment( QLabel::AlignCenter | QLabel::WordBreak );
+  m_label->setBuddy( this );
+  hlay->addWidget( m_label );
+  
+  // #FIXME use setCursor instead of QApplication::setOverrideCursor
+  // m_pixLabel->setCursor( KCursor::handCursor() );
+  // m_label->setCursor( KCursor::handCursor() );
+}
+
+QPixmap *URLButton::pixmap() const 
+{ 
+  return m_pixLabel->pixmap(); 
+}
+
+void URLButton::setPixmap( const QPixmap &pix ) 
+{ 
+  m_pixLabel->setPixmap( pix ); m_force = TRUE; 
+}
+
+QString URLButton::text() const 
+{ 
+  return m_label->text(); 
+}
+
+void URLButton::setText( const QString &textLabel ) 
+{ 
+  m_label->setText( textLabel ); 
+}
+
+QFont URLButton::font() const 
+{ 
+  return m_label->font(); 
+}
+
+void URLButton::setFont( const QFont &f ) 
+{ 
+  m_label->setFont( f ); 
+}
+
+void URLButton::setEnabled( bool enabled )
+{
+  if ( ( !enabled || m_force ) && isEnabled() )
+  {
+    KPixmap gray = KPixmap( m_pix );
+    m_pixLabel->setPixmap( KPixmapEffect::toGray( gray, true ) );
+    m_label->setEnabled( FALSE );
+    setFocusPolicy( QLabel::NoFocus );
+    setWState( WState_Disabled );
+  }
+  else if ( ( enabled || m_force ) && !isEnabled() )
+  {
+    m_pixLabel->setPixmap( m_pix );
+    m_label->setEnabled( TRUE );
+    setFocusPolicy( QLabel::TabFocus );
+    clearWState( WState_Disabled );
+  }
+}
+
+void URLButton::enterEvent( QEvent *e )
+{
+  // #FIXME
+  QApplication::setOverrideCursor( KCursor::handCursor() );
+  
+  m_mouseOver = TRUE;
+  if ( isEnabled() )
+  {
+    if ( !hasFocus() )
+    {
+      KPixmap desaturate = KPixmap( m_pix );
+      m_pixLabel->setPixmap( KPixmapEffect::desaturate( desaturate, 0.6 ) );
+    }
+    
+    QFont f = m_label->font();
+    f.setUnderline( TRUE );
+    m_label->setFont( f ); 
+  }
+  QWidget::enterEvent( e );
+}
+
+void URLButton::leaveEvent( QEvent *e )
+{
+  // #FIXME
+  QApplication::restoreOverrideCursor();
+  
+  m_mouseOver = FALSE;
+  if ( isEnabled() )
+  {
+    if ( !hasFocus() )
+      m_pixLabel->setPixmap( m_pix );
+       
+    QFont f = m_label->font();
+    f.setUnderline( FALSE );
+    m_label->setFont( f ); 
+  }
+  QWidget::leaveEvent( e );
+}
+
+void URLButton::focusInEvent( QFocusEvent *e )
+{
+  if ( isEnabled() )
+  {
+    KPixmap desaturate = KPixmap( m_pix );
+    m_pixLabel->setPixmap( KPixmapEffect::desaturate( desaturate, 0.6 ) );
+    if ( e->reason() == QFocusEvent::Shortcut )
+      QTimer::singleShot( 100, this, SIGNAL( clicked() ) );
+  }
+  QWidget::focusInEvent( e );
+}
+
+void URLButton::focusOutEvent( QFocusEvent *e )
+{
+  if ( isEnabled() )
+  {
+    m_pixLabel->setPixmap( m_pix );
+  }
+  QWidget::focusOutEvent( e );
+}
+
+void URLButton::mousePressEvent( QMouseEvent *e )
+{
+  if ( e->button() != LeftButton ) {
+    e->ignore();
+    return;
+  }
+
+  m_pressed = TRUE;
+  emit pressed();
+  QWidget::mousePressEvent( e );
+}
+
+void URLButton::mouseReleaseEvent( QMouseEvent *e )
+{
+  if ( e->button() != LeftButton ) {
+    e->ignore();
+    return;
+  }
+
+  if ( isEnabled() && m_mouseOver && m_pressed )
+  {
+    emit released();
+    emit clicked();
+  }
+
+  m_pressed = FALSE;
+  QWidget::mouseReleaseEvent( e );
+}
+
+void URLButton::keyPressEvent( QKeyEvent *e )
+{
+  switch ( e->key() ) 
+  {
+    case Key_Enter:
+    case Key_Return:
+      emit clicked();
+      break;
+    case Key_Space:
+      m_buttonDown = TRUE;
+      emit pressed();
+      break;
+    case Key_Up:
+    case Key_Left:
+    case Key_Right:
+    case Key_Down:
+      QWidget::keyPressEvent( e );
+      break;
+    default:
+      e->ignore();
+      break;
+    }
+}
+
+void URLButton::keyReleaseEvent( QKeyEvent *e )
+{
+  switch ( e->key() ) 
+  {
+    case Key_Space:
+      if ( m_buttonDown ) 
+      {
+        m_buttonDown = FALSE;
+	emit released();
+	emit clicked();
+      }
+      break;
+    default:
+      e->ignore();
+  }
+}
+
Index: ksmserver/urlbutton.h
===================================================================
RCS file: ksmserver/urlbutton.h
diff -N ksmserver/urlbutton.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ksmserver/urlbutton.h	15 Nov 2004 14:07:36 -0000
@@ -0,0 +1,80 @@
+/******************************************************************************
+** Copyright (c) 2004 Andre Moreira Magalhaes.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a copy
+** of this software and associated documentation files (the "Software"), to deal
+** in the Software without restriction, including without limitation the rights
+** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+** copies of the Software, and to permit persons to whom the Software is
+** furnished to do so, subject to the following conditions:
+**
+** The above copyright notice and this permission notice shall be included in
+** all copies or substantial portions of the Software.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+** AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+** AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+**
+*******************************************************************************/
+
+#ifndef URLBUTTON_H
+#define URLBUTTON_H
+
+#include <qlabel.h>
+#include <qpixmap.h>
+
+class QEvent;
+class QLabel;
+class QMouseEvent;
+class QKeyEvent;
+
+class URLButton : public QWidget
+{
+  Q_OBJECT
+
+  public: 
+    URLButton( QWidget *parent = 0, const char *name = 0, WFlags f = 0 );
+    URLButton( const QPixmap &pix, const QString &textLabel, QWidget *parent, const \
char *name = 0 ); +
+    QPixmap *pixmap() const;
+    void setPixmap( const QPixmap &pix );
+    
+    QString text() const;
+    void setText( const QString &textLabel );
+
+    QFont font() const;
+    void setFont( const QFont &f );
+
+  public slots:
+    void setEnabled( bool enabled );
+   
+  signals:
+    void clicked();
+    void pressed();
+    void released();
+
+  protected:
+    void enterEvent( QEvent * );
+    void leaveEvent( QEvent * );
+    void focusInEvent( QFocusEvent *e );
+    void focusOutEvent( QFocusEvent *e );
+    void mousePressEvent( QMouseEvent *e );
+    void mouseReleaseEvent( QMouseEvent *e );
+    void keyPressEvent( QKeyEvent *e );
+    void keyReleaseEvent( QKeyEvent *e );
+    
+  private:
+    QPixmap m_pix;
+    QLabel *m_pixLabel;
+    QLabel *m_label;
+    
+    bool m_buttonDown;
+    bool m_mouseOver;
+    bool m_pressed;
+    bool m_force;
+};
+
+#endif // URLBUTTON_H__


["end_session.png" (image/png)]
["exit.png" (image/png)]
["reboot.png" (image/png)]

_______________________________________________
kde-usability mailing list
kde-usability@kde.org
https://mail.kde.org/mailman/listinfo/kde-usability


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic