summaryrefslogtreecommitdiffstats
path: root/opensuse/tdebase/kdm-make_it_cool.diff
diff options
context:
space:
mode:
authorRobert Xu <robxu9@gmail.com>2011-11-10 18:04:39 -0500
committerRobert Xu <robxu9@gmail.com>2011-11-10 18:04:39 -0500
commit21fcfa3348213aa87f0e3aef62ca4720c6d31cb7 (patch)
tree2cfb64c59322628e613ed0895e3c3694d3abe6bd /opensuse/tdebase/kdm-make_it_cool.diff
parent8667643bff14a60d8571c599efd3e48bed3e3b12 (diff)
downloadtde-packaging-21fcfa3348213aa87f0e3aef62ca4720c6d31cb7.tar.gz
tde-packaging-21fcfa3348213aa87f0e3aef62ca4720c6d31cb7.zip
initial commit to suse branch: eclipse integration
Diffstat (limited to 'opensuse/tdebase/kdm-make_it_cool.diff')
-rw-r--r--opensuse/tdebase/kdm-make_it_cool.diff1534
1 files changed, 0 insertions, 1534 deletions
diff --git a/opensuse/tdebase/kdm-make_it_cool.diff b/opensuse/tdebase/kdm-make_it_cool.diff
deleted file mode 100644
index fb1f5b076..000000000
--- a/opensuse/tdebase/kdm-make_it_cool.diff
+++ /dev/null
@@ -1,1534 +0,0 @@
-Index: kdm/kfrontend/kdm_greet.c
-===================================================================
---- kdm/kfrontend/kdm_greet.c.orig
-+++ kdm/kfrontend/kdm_greet.c
-@@ -44,8 +44,8 @@ Foundation, Inc., 51 Franklin Street, Fi
- # include <sched.h>
- #endif
-
--#if defined(HAVE_XTEST) || defined(HAVE_XKB)
- # include <X11/Xlib.h>
-+#if defined(HAVE_XTEST) || defined(HAVE_XKB)
- # include <X11/keysym.h>
- #endif
-
-Index: kdm/kfrontend/themer/kdmrect.h
-===================================================================
---- kdm/kfrontend/themer/kdmrect.h.orig
-+++ kdm/kfrontend/themer/kdmrect.h
-@@ -36,6 +36,7 @@ class KdmRect : public KdmItem {
-
- public:
- KdmRect( KdmItem *parent, const QDomNode &node, const char *name = 0 );
-+ KdmRect( QWidget *parent, const QDomNode &node, const char *name = 0 );
-
- protected:
- // draw the rect
-@@ -54,8 +55,9 @@ protected:
- bool hasBorder;
- } rect;
-
--// virtual void setWidget( QWidget *widget );
-+ virtual void setWidget( QWidget *widget );
- // virtual void setLayoutItem( QLayoutItem *item );
-+ void init( const QDomNode &node, const char *name );
-
- private:
- void setAttribs( QWidget *widget );
-Index: kdm/kfrontend/themer/kdmitem.h
-===================================================================
---- kdm/kfrontend/themer/kdmitem.h.orig
-+++ kdm/kfrontend/themer/kdmitem.h
-@@ -90,6 +90,8 @@ public:
- * Item constructor and destructor
- */
- KdmItem( KdmItem *parent, const QDomNode &node = QDomNode(), const char *name = 0 );
-+ KdmItem( QWidget *parent, const QDomNode &node = QDomNode(), const char *name = 0 ); // for the root
-+
- virtual ~KdmItem();
-
- /**
-@@ -151,6 +153,7 @@ public:
-
- KdmItem *findNode( const QString &id ) const;
- virtual void setWidget( QWidget *widget );
-+ QWidget *widget() const { return myWidget; }
- virtual void setLayoutItem( QLayoutItem *item );
-
- virtual void hide( bool force = false );
-@@ -160,6 +163,9 @@ public:
- bool isExplicitlyHidden() const { return isShown == ExplicitlyHidden; }
- QRect rect() const { return area; }
-
-+ QWidget *parentWidget() const;
-+ QString getId() const { return id; }
-+
- signals:
- void needUpdate( int x, int y, int w, int h );
- void activated( const QString &id );
-@@ -237,6 +243,7 @@ protected:
- void parseColor( const QString &, QColor & );
-
- void inheritFromButton( KdmItem *button );
-+ void init( const QDomNode &node = QDomNode(), const char *name = 0 );
-
- QString itemType, id;
- QValueList<KdmItem *> m_children;
-Index: kdm/kfrontend/themer/kdmpixmap.h
-===================================================================
---- kdm/kfrontend/themer/kdmpixmap.h.orig
-+++ kdm/kfrontend/themer/kdmpixmap.h
-@@ -61,9 +61,10 @@ protected:
- } pixmap;
-
- private:
-- // Method to load the pixmap given by the theme
-- void loadPixmap( const QString &fileName, QPixmap &p, QString &path );
-+ // Method to load the pixmap path given by the theme
-+ QString fullPath( const QString &fileName );
- void renderSvg( PixmapStruct::PixmapClass *pClass, const QRect &area );
-+ void loadPixmap( PixmapStruct::PixmapClass *pClass );
- };
-
- #endif
-Index: kdm/kfrontend/themer/kdmlabel.h
-===================================================================
---- kdm/kfrontend/themer/kdmlabel.h.orig
-+++ kdm/kfrontend/themer/kdmlabel.h
-@@ -67,6 +67,7 @@ protected:
-
- public slots:
- void update();
-+ void slotAccel();
-
- private:
- /* Method to lookup the caption associated with an item */
-@@ -76,6 +77,10 @@ private:
- QString lookupText( const QString &t );
-
- QString cText;
-+ int cAccel;
-+ QAccel *myAccel;
-+
-+ void setTextInt(const QString &);
- };
-
- #endif
-Index: kdm/kfrontend/themer/kdmthemer.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmthemer.cpp.orig
-+++ kdm/kfrontend/themer/kdmthemer.cpp
-@@ -36,11 +36,13 @@
-
- #include <qfile.h>
- #include <qfileinfo.h>
--//#include <qtimer.h> // animation timer - TODO
-+#include <qtimer.h> // animation timer - TODO
- #include <qobjectlist.h>
- #include <qpainter.h>
- #include <qwidget.h>
- #include <qregion.h>
-+#include <qlineedit.h>
-+#include <qapplication.h>
-
- #include <unistd.h>
-
-@@ -72,7 +74,8 @@ KdmThemer::KdmThemer( const QString &_fi
- return;
- }
- // Set the root (screen) item
-- rootItem = new KdmRect( 0, QDomNode(), "kdm root" );
-+ rootItem = new KdmRect( parent, QDomNode(), "kdm root" );
-+
- connect( rootItem, SIGNAL(needUpdate( int, int, int, int )),
- widget(), SLOT(update( int, int, int, int )) );
-
-@@ -82,6 +85,9 @@ KdmThemer::KdmThemer( const QString &_fi
- generateItems( rootItem );
-
- connect( rootItem, SIGNAL(activated( const QString & )), SIGNAL(activated( const QString & )) );
-+ connect( rootItem, SIGNAL(activated( const QString & )), SLOT(slotActivated( const QString & )) );
-+
-+ QTimer::singleShot(800, this, SLOT(slotPaintRoot()));
-
- /* *TODO*
- // Animation timer
-@@ -151,7 +157,7 @@ KdmThemer::widgetEvent( QEvent *e )
- case QEvent::Paint:
- {
- QRect paintRect = static_cast<QPaintEvent *>(e)->rect();
-- kdDebug() << "paint on: " << paintRect << endl;
-+ kdDebug() << timestamp() << " paint on: " << paintRect << endl;
-
- if (!backBuffer)
- backBuffer = new QPixmap( widget()->size() );
-@@ -195,7 +201,7 @@ KdmThemer::generateItems( KdmItem *paren
-
- // Get its tag, and check it's correct ("greeter")
- if (theme.tagName() != "greeter") {
-- kdDebug() << "This does not seem to be a correct theme file." << endl;
-+ kdDebug() << timestamp() << " This does not seem to be a correct theme file." << endl;
- return;
- }
- // Get the list of child nodes
-@@ -214,6 +220,13 @@ KdmThemer::generateItems( KdmItem *paren
- if (tagName == "item") {
- if (!willDisplay( subnode ))
- continue;
-+ QString id = el.attribute("id");
-+ if (id.startsWith("plugin-specific-")) {
-+ id = id.mid(strlen("plugin-specific-"));
-+ if (!_pluginsLogin.contains(id))
-+ continue;
-+ }
-+
- // It's a new item. Draw it
- QString type = el.attribute( "type" );
-
-@@ -225,13 +238,11 @@ KdmThemer::generateItems( KdmItem *paren
- newItem = new KdmPixmap( parent, subnode );
- else if (type == "rect")
- newItem = new KdmRect( parent, subnode );
-- else if (type == "entry") {
-+ else if (type == "entry" || type == "list") {
- newItem = new KdmRect( parent, subnode );
- newItem->setType( type );
- }
- // newItem = new KdmEntry( parent, subnode );
-- //else if (type=="list")
-- // newItem = new KdmList( parent, subnode );
- else if (type == "svg")
- newItem = new KdmPixmap( parent, subnode );
- if (newItem) {
-@@ -287,6 +298,11 @@ bool KdmThemer::willDisplay( const QDomN
- #endif
- if (type == "halt" || type == "reboot")
- return _allowShutdown != SHUT_NONE;
-+ else if (type == "userlist")
-+ return _userList;
-+ else if ( type == "!userlist" )
-+ return !_userList;
-+
- // if (type == "system")
- // return true;
-
-@@ -301,7 +317,7 @@ KdmThemer::showStructure( QObject *obj )
- const QObjectList *wlist = obj->children();
- static int counter = 0;
- if (counter == 0)
-- kdDebug() << "\n\n<======= Widget tree =================" << endl;
-+ kdDebug() << timestamp() << " \n\n<======= Widget tree =================" << endl;
- if (wlist) {
- counter++;
- QObjectListIterator it( *wlist );
-@@ -323,7 +339,46 @@ KdmThemer::showStructure( QObject *obj )
- counter--;
- }
- if (counter == 0)
-- kdDebug() << "\n\n<======= Widget tree =================\n\n" << endl;
-+ kdDebug() << timestamp() << " \n\n<======= Widget tree =================\n\n" << endl;
-+}
-+
-+void
-+KdmThemer::slotActivated( const QString &id )
-+{
-+ QString toactivate;
-+ if (id == "username-label")
-+ toactivate = "user-entry";
-+ else if (id == "password-label")
-+ toactivate = "pw-entry";
-+ else
-+ return;
-+
-+ KdmItem *item = findNode(toactivate);
-+ if (!item || !item->widget())
-+ return;
-+
-+ item->widget()->setFocus();
-+ QLineEdit *le = (QLineEdit*)item->widget()->qt_cast("QLineEdit");
-+ if (le)
-+ le->selectAll();
-+}
-+
-+void
-+KdmThemer::slotPaintRoot()
-+{
-+ KdmItem *back_item = findNode("background");
-+ if (!back_item)
-+ return;
-+
-+ QRect screen = QApplication::desktop()->screenGeometry(0);
-+ QPixmap pm(screen.size());
-+
-+ QPainter painter( &pm, true );
-+ back_item->paint( &painter, back_item->rect());
-+ painter.end();
-+
-+ QApplication::desktop()->screen()->setErasePixmap(pm);
-+ QApplication::desktop()->screen()->erase();
- }
-
- #include "kdmthemer.moc"
-Index: kdm/kfrontend/themer/kdmthemer.h
-===================================================================
---- kdm/kfrontend/themer/kdmthemer.h.orig
-+++ kdm/kfrontend/themer/kdmthemer.h
-@@ -80,6 +80,10 @@ public:
- signals:
- void activated( const QString &id );
-
-+protected slots:
-+ void slotActivated( const QString &id );
-+ void slotPaintRoot();
-+
- private:
- /*
- * Our display mode (e.g. console, remote, ...)
-Index: kdm/kfrontend/themer/kdmlayout.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmlayout.cpp.orig
-+++ kdm/kfrontend/themer/kdmlayout.cpp
-@@ -20,6 +20,7 @@
- */
-
- #include "kdmlayout.h"
-+#include "kdmconfig.h"
- #include "kdmitem.h"
-
- #include <kdebug.h>
-@@ -35,11 +36,11 @@ KdmLayoutFixed::KdmLayoutFixed( const QD
- void
- KdmLayoutFixed::update( const QRect &parentGeometry, bool force )
- {
-- kdDebug() << "KdmLayoutFixed::update " << parentGeometry << endl;
-+ kdDebug() << timestamp() << " KdmLayoutFixed::update " << parentGeometry << endl;
-
- // I can't layout children if the parent rectangle is not valid
- if (parentGeometry.width() < 0 || parentGeometry.height() < 0) {
-- kdDebug() << "invalid\n";
-+ kdDebug() << timestamp() << " invalid\n";
- return;
- }
- // For each child in list I ask their hinted size and set it!
-@@ -102,7 +103,7 @@ KdmLayoutBox::update( const QRect &paren
- childrenRect.setTop( childrenRect.top() + height + box.spacing );
- } else {
- QRect temp( childrenRect.left(), childrenRect.top(), width, childrenRect.height() );
-- kdDebug() << "placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl;
-+ kdDebug() << timestamp() << " placement " << *it << " " << temp << " " << (*it)->placementHint( temp ) << endl;
- temp = (*it)->placementHint( temp );
- (*it)->setGeometry( temp, force );
- childrenRect.setLeft( childrenRect.left() + width + box.spacing );
-@@ -125,7 +126,7 @@ KdmLayoutBox::update( const QRect &paren
- kdDebug() << this << " placementHint " << *it << " " << temp << " " << itemRect << endl;
- temp.setWidth( itemRect.width() );
- childrenRect.setLeft( childrenRect.left() + itemRect.size().width() + box.spacing );
-- kdDebug() << "childrenRect after " << *it << " " << childrenRect << endl;
-+ kdDebug() << timestamp() << " childrenRect after " << *it << " " << childrenRect << endl;
- }
- itemRect = (*it)->placementHint( temp );
- kdDebug() << this << " placementHint2 " << *it << " " << temp << " " << itemRect << endl;
-Index: kdm/kfrontend/themer/kdmrect.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmrect.cpp.orig
-+++ kdm/kfrontend/themer/kdmrect.cpp
-@@ -33,6 +33,18 @@
- KdmRect::KdmRect( KdmItem *parent, const QDomNode &node, const char *name )
- : KdmItem( parent, node, name )
- {
-+ init( node, name );
-+}
-+
-+KdmRect::KdmRect( QWidget *parent, const QDomNode &node, const char *name )
-+ : KdmItem( parent, node, name )
-+{
-+ init( node, name );
-+}
-+
-+void
-+KdmRect::init( const QDomNode &node, const char * )
-+{
- itemType = "rect";
-
- // Set default values for rect (note: strings are already Null)
-@@ -137,13 +149,6 @@ KdmRect::recursiveSetAttribs( QLayoutIte
- }
-
- void
--KdmRect::setWidget( QWidget *widget )
--{
-- KdmItem::setWidget( widget );
-- setAttribs( widget );
--}
--
--void
- KdmRect::setLayoutItem( QLayoutItem *item )
- {
- KdmItem::setLayoutItem( item );
-@@ -151,4 +156,17 @@ KdmRect::setLayoutItem( QLayoutItem *ite
- }
- */
-
-+void
-+KdmRect::setWidget( QWidget *widget )
-+{
-+ if ( rect.normal.color.isValid() && widget )
-+ {
-+ QPalette p = widget->palette();
-+ p.setColor( QPalette::Normal, QColorGroup::Text, rect.normal.color );
-+ widget->setPalette(p);
-+ }
-+ KdmItem::setWidget( widget );
-+ //setAttribs( widget );
-+}
-+
- #include "kdmrect.moc"
-Index: kdm/kfrontend/themer/kdmitem.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmitem.cpp.orig
-+++ kdm/kfrontend/themer/kdmitem.cpp
-@@ -23,10 +23,11 @@
- * Generic Kdm Item
- */
-
--//#define DRAW_OUTLINE 1 // for debugging only
-+// #define DRAW_OUTLINE 1 // for debugging only
-
- #include "kdmitem.h"
- #include "kdmlayout.h"
-+#include "kdmconfig.h"
-
- #include <kglobal.h>
- #include <kdebug.h>
-@@ -35,9 +36,7 @@
- #include <qwidget.h>
- #include <qlayout.h>
- #include <qimage.h>
--#ifdef DRAW_OUTLINE
--# include <qpainter.h>
--#endif
-+#include <qpainter.h>
-
- KdmItem::KdmItem( KdmItem *parent, const QDomNode &node, const char *name )
- : QObject( parent, name )
-@@ -48,6 +47,25 @@ KdmItem::KdmItem( KdmItem *parent, const
- , myLayoutItem( 0 )
- , buttonParent( 0 )
- {
-+ init(node, name);
-+}
-+
-+
-+KdmItem::KdmItem( QWidget *parent, const QDomNode &node, const char *name )
-+ : QObject( parent, name )
-+ , boxManager( 0 )
-+ , fixedManager( 0 )
-+ , image( 0 )
-+ , myWidget( 0 )
-+ , myLayoutItem( 0 )
-+ , buttonParent( 0 )
-+{
-+ init(node, name);
-+}
-+
-+void
-+KdmItem::init( const QDomNode &node, const char * )
-+{
- // Set default layout for every item
- currentManager = MNone;
- pos.x = pos.y = 0;
-@@ -62,7 +80,7 @@ KdmItem::KdmItem( KdmItem *parent, const
- state = Snormal;
-
- // The "toplevel" node (the screen) is really just like a fixed node
-- if (!parent || !parent->inherits( "KdmItem" )) {
-+ if (!parent() || !parent()->inherits( "KdmItem" )) {
- setFixedLayout();
- return;
- }
-@@ -87,7 +105,7 @@ KdmItem::KdmItem( KdmItem *parent, const
- id = tnode.toElement().attribute( "id", QString::number( (ulong)this, 16 ) );
-
- // Tell 'parent' to add 'me' to its children
-- KdmItem *parentItem = static_cast<KdmItem *>( parent );
-+ KdmItem *parentItem = static_cast<KdmItem *>( parent() );
- parentItem->addChildItem( this );
- }
-
-@@ -195,7 +213,7 @@ KdmItem::setWidget( QWidget *widget )
- if (frame)
- frame->setFrameStyle( QFrame::NoFrame );
-
-- myWidget->setGeometry(area);
-+ setGeometry(area, true);
-
- connect( myWidget, SIGNAL(destroyed()), SLOT(widgetGone()) );
- }
-@@ -236,15 +254,21 @@ KdmItem::setGeometry( const QRect &newGe
-
- area = newGeometry;
-
-- if (myWidget)
-- myWidget->setGeometry( newGeometry );
-+ if (myWidget) {
-+ QRect widGeo = newGeometry;
-+ if ( widGeo.height() > myWidget->maximumHeight() ) {
-+ widGeo.moveTop( widGeo.top() + ( widGeo.height() - myWidget->maximumHeight() ) / 2 );
-+ widGeo.setHeight( myWidget->maximumHeight() );
-+ }
-+ myWidget->setGeometry( widGeo );
-+ }
- if (myLayoutItem)
- myLayoutItem->setGeometry( newGeometry );
-
- // recurr to all boxed children
- if (boxManager && !boxManager->isEmpty())
- boxManager->update( newGeometry, force );
--
-+
- // recurr to all fixed children
- if (fixedManager && !fixedManager->isEmpty())
- fixedManager->update( newGeometry, force );
-@@ -258,8 +282,16 @@ KdmItem::paint( QPainter *p, const QRect
- if (isHidden())
- return;
-
-- if (myWidget || (myLayoutItem && myLayoutItem->widget()))
-- return;
-+ if (myWidget || (myLayoutItem && myLayoutItem->widget())) {
-+ // KListView because it's missing a Q_OBJECT
-+ if ( myWidget && myWidget->isA( "KListView" ) ) {
-+ QPixmap copy( myWidget->size() );
-+ kdDebug() << myWidget->geometry() << " " << area << " " << myWidget->size() << endl;
-+ bitBlt( &copy, QPoint( 0, 0), p->device(), myWidget->geometry(), Qt::CopyROP );
-+ myWidget->setPaletteBackgroundPixmap( copy );
-+ }
-+ return;
-+ }
-
- if (area.intersects( rect )) {
- QRect contentsRect = area.intersect( rect );
-@@ -280,6 +312,8 @@ KdmItem::paint( QPainter *p, const QRect
- QValueList<KdmItem *>::Iterator it;
- for (it = m_children.begin(); it != m_children.end(); ++it)
- (*it)->paint( p, rect );
-+
-+
- }
-
- KdmItem *KdmItem::currentActive = 0;
-@@ -287,8 +321,11 @@ KdmItem *KdmItem::currentActive = 0;
- void
- KdmItem::mouseEvent( int x, int y, bool pressed, bool released )
- {
-+ if (isShown == ExplicitlyHidden)
-+ return;
-+
- if (buttonParent && buttonParent != this) {
-- buttonParent->mouseEvent( x, y, pressed, released );
-+ buttonParent->mouseEvent( x, y, pressed, released );
- return;
- }
-
-@@ -362,7 +399,8 @@ KdmItem::placementHint( const QRect &par
- w = parentRect.width(),
- h = parentRect.height();
-
-- kdDebug() << "KdmItem::placementHint parentRect=" << id << parentRect << " hintedSize=" << hintedSize << endl;
-+ kdDebug() << timestamp() << " KdmItem::placementHint parentRect=" << parentRect << " hintedSize=" << hintedSize << endl;
-+
- // check if width or height are set to "box"
- if (pos.wType == DTbox || pos.hType == DTbox) {
- if (myLayoutItem || myWidget)
-@@ -372,7 +410,7 @@ KdmItem::placementHint( const QRect &par
- return parentRect;
- boxHint = boxManager->sizeHint();
- }
-- kdDebug() << " => boxHint " << boxHint << endl;
-+ kdDebug() << timestamp() << " boxHint " << boxHint << endl;
- }
-
- if (pos.xType == DTpixel)
-@@ -380,25 +418,25 @@ KdmItem::placementHint( const QRect &par
- else if (pos.xType == DTnpixel)
- x = parentRect.right() - pos.x;
- else if (pos.xType == DTpercent)
-- x += int( parentRect.width() / 100.0 * pos.x );
-+ x += qRound( parentRect.width() / 100.0 * pos.x );
-
- if (pos.yType == DTpixel)
- y += pos.y;
- else if (pos.yType == DTnpixel)
- y = parentRect.bottom() - pos.y;
- else if (pos.yType == DTpercent)
-- y += int( parentRect.height() / 100.0 * pos.y );
-+ y += qRound( parentRect.height() / 100.0 * pos.y );
-
- if (pos.wType == DTpixel)
- w = pos.width;
- else if (pos.wType == DTnpixel)
- w -= pos.width;
- else if (pos.wType == DTpercent)
-- w = int( parentRect.width() / 100.0 * pos.width );
-+ w = qRound( parentRect.width() / 100.0 * pos.width );
- else if (pos.wType == DTbox)
- w = boxHint.width();
- else if (hintedSize.width() > 0)
-- w = hintedSize.width();
-+ w = hintedSize.width();
- else
- w = 0;
-
-@@ -407,14 +445,22 @@ KdmItem::placementHint( const QRect &par
- else if (pos.hType == DTnpixel)
- h -= pos.height;
- else if (pos.hType == DTpercent)
-- h = int( parentRect.height() / 100.0 * pos.height );
-+ h = qRound( parentRect.height() / 100.0 * pos.height );
- else if (pos.hType == DTbox)
- h = boxHint.height();
-- else if (hintedSize.height() > 0)
-- h = hintedSize.height();
-- else
-+ else if (hintedSize.height() > 0) {
-+ if (w && pos.wType != DTnone)
-+ h = (hintedSize.height() * w) / hintedSize.width();
-+ else
-+ h = hintedSize.height();
-+ } else
- h = 0;
-
-+ // we choose to take the hinted size, but it's better to listen to the aspect ratio
-+ if (pos.wType == DTnone && pos.hType != DTnone && h && w) {
-+ w = qRound(float(hintedSize.width() * h) / hintedSize.height());
-+ }
-+
- // defaults to center
- int dx = -w / 2, dy = -h / 2;
-
-@@ -430,7 +476,7 @@ KdmItem::placementHint( const QRect &par
- dx = -w;
- }
- // KdmItem *p = static_cast<KdmItem*>( parent() );
-- kdDebug() << "KdmItem::placementHint " << id << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl;
-+ kdDebug() << timestamp() << " placementHint " << this << " x=" << x << " dx=" << dx << " w=" << w << " y=" << y << " dy=" << dy << " h=" << h << " " << parentRect << endl;
- y += dy;
- x += dx;
-
-@@ -529,4 +575,17 @@ KdmItem::setFixedLayout( const QDomNode
- currentManager = MFixed;
- }
-
-+QWidget *
-+KdmItem::parentWidget() const
-+{
-+ if (myWidget)
-+ return myWidget;
-+ if (!this->parent())
-+ return 0;
-+
-+ if (parent()->qt_cast("QWidget"))
-+ return (QWidget*)parent();
-+ return ((KdmItem*)parent())->parentWidget();
-+}
-+
- #include "kdmitem.moc"
-Index: kdm/kfrontend/themer/kdmpixmap.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmpixmap.cpp.orig
-+++ kdm/kfrontend/themer/kdmpixmap.cpp
-@@ -22,6 +22,7 @@
- #include <config.h>
-
- #include "kdmpixmap.h"
-+#include <kdmconfig.h>
-
- #include <kimageeffect.h>
- #ifdef HAVE_LIBART
-@@ -29,6 +30,7 @@
- #endif
-
- #include <kdebug.h>
-+#include <kstandarddirs.h>
-
- #include <qpainter.h>
- #include <qpixmap.h>
-@@ -58,21 +60,28 @@ KdmPixmap::KdmPixmap( KdmItem *parent, c
- QString tagName = el.tagName();
-
- if (tagName == "normal") {
-- loadPixmap( el.attribute( "file", "" ), pixmap.normal.pixmap, pixmap.normal.fullpath );
-+ pixmap.normal.fullpath = fullPath( el.attribute( "file", "" ) );
- parseColor( el.attribute( "tint", "#ffffff" ), pixmap.normal.tint );
- pixmap.normal.alpha = el.attribute( "alpha", "1.0" ).toFloat();
- } else if (tagName == "active") {
- pixmap.active.present = true;
-- loadPixmap( el.attribute( "file", "" ), pixmap.active.pixmap, pixmap.active.fullpath );
-+ pixmap.active.fullpath = fullPath( el.attribute( "file", "" ) );
- parseColor( el.attribute( "tint", "#ffffff" ), pixmap.active.tint );
- pixmap.active.alpha = el.attribute( "alpha", "1.0" ).toFloat();
- } else if (tagName == "prelight") {
- pixmap.prelight.present = true;
-- loadPixmap( el.attribute( "file", "" ), pixmap.prelight.pixmap, pixmap.prelight.fullpath );
-+ pixmap.prelight.fullpath = fullPath(el.attribute( "file", "" ) );
- parseColor( el.attribute( "tint", "#ffffff" ), pixmap.prelight.tint );
- pixmap.prelight.alpha = el.attribute( "alpha", "1.0" ).toFloat();
- }
- }
-+
-+ // look if we have to have the aspect ratio ready
-+ if (((pos.wType == DTnone && pos.hType != DTnone) ||
-+ (pos.wType != DTnone && pos.hType == DTnone) ||
-+ (pos.wType == DTnone && pos.hType == DTnone)) &&
-+ !pixmap.normal.fullpath.endsWith( ".svg" ))
-+ loadPixmap( &pixmap.normal );
- }
-
- QSize
-@@ -100,19 +109,16 @@ KdmPixmap::setGeometry( const QRect &new
- }
-
-
--void
--KdmPixmap::loadPixmap( const QString &fileName, QPixmap &map, QString &fullName )
-+QString
-+KdmPixmap::fullPath( const QString &fileName)
- {
-- if (fileName.isEmpty())
-- return;
-+ if (fileName.isEmpty())
-+ return QString::null;
-
-- fullName = fileName;
-+ QString fullName = fileName;
- if (fullName.at( 0 ) != '/')
- fullName = baseDir() + "/" + fileName;
--
-- if (!fullName.endsWith( ".svg" )) // we delay it for svgs
-- if (!map.load( fullName ))
-- fullName = QString::null;
-+ return fullName;
- }
-
- void
-@@ -140,6 +146,25 @@ KdmPixmap::renderSvg( PixmapStruct::Pixm
- }
-
- void
-+KdmPixmap::loadPixmap( PixmapStruct::PixmapClass *pClass )
-+{
-+ QString fullpath = pClass->fullpath;
-+
-+ kdDebug() << timestamp() << " load " << fullpath << endl;
-+ int index = fullpath.findRev('.');
-+ QString ext = fullpath.right(fullpath.length() - index);
-+ fullpath = fullpath.left(index);
-+ kdDebug() << timestamp() << " ext " << ext << " " << fullpath << endl;
-+ QString testpath = QString("-%1x%2").arg(area.width()).arg(area.height()) + ext;
-+ kdDebug() << timestamp() << " testing for " << fullpath + testpath << endl;
-+ if (KStandardDirs::exists(fullpath + testpath))
-+ pClass->pixmap.load(fullpath + testpath);
-+ else
-+ pClass->pixmap.load( fullpath + ext );
-+ kdDebug() << timestamp() << " done\n";
-+}
-+
-+void
- KdmPixmap::drawContents( QPainter *p, const QRect &r )
- {
- // choose the correct pixmap class
-@@ -149,12 +174,20 @@ KdmPixmap::drawContents( QPainter *p, co
- if (state == Sprelight && pixmap.prelight.present)
- pClass = &pixmap.prelight;
-
-+ kdDebug() << "draw " << id << " " << pClass->pixmap.isNull() << endl;
-+
- if (pClass->pixmap.isNull()) {
-- if (pClass->fullpath.isEmpty()) // if neither is set, we're empty
-+
-+ if (pClass->fullpath.isEmpty()) // if neither is set, we're empty
- return;
--
-- kdDebug() << "renderSVG\n";
-- renderSvg( pClass, area );
-+
-+ if (!pClass->fullpath.endsWith( ".svg" ) ) {
-+ loadPixmap(pClass);
-+ } else {
-+ kdDebug() << timestamp() << " renderSVG\n";
-+ renderSvg( pClass, area );
-+ kdDebug() << timestamp() << " done\n";
-+ }
- }
-
- int px = area.left() + r.left();
-@@ -176,25 +209,37 @@ KdmPixmap::drawContents( QPainter *p, co
-
-
- if (pClass->readyPixmap.isNull()) {
-- QImage scaledImage;
-+
-+ bool haveTint = pClass->tint.rgb() != 0xFFFFFF;
-+ bool haveAlpha = pClass->alpha < 1.0;
-
-+ QImage scaledImage;
-+
- // use the loaded pixmap or a scaled version if needed
-
-+ kdDebug() << timestamp() << " prepare readyPixmap " << pClass->fullpath << " " << area.size() << " " << pClass->pixmap.size() << endl;
- if (area.size() != pClass->pixmap.size()) {
- if (pClass->fullpath.endsWith( ".svg" )) {
-- kdDebug() << "renderSVG\n";
-+ kdDebug() << timestamp() << " renderSVG\n";
- renderSvg( pClass, area );
- scaledImage = pClass->pixmap.convertToImage();
- } else {
-- kdDebug() << "convertFromImage\n";
-+ kdDebug() << timestamp() << " convertFromImage smoothscale\n";
- QImage tempImage = pClass->pixmap.convertToImage();
-+ kdDebug() << timestamp() << " convertToImage done\n";
- scaledImage = tempImage.smoothScale( area.width(), area.height() );
-+ kdDebug() << timestamp() << " done\n";
- }
-- } else
-+ } else {
-+ if (haveTint || haveAlpha)
-+ {
- scaledImage = pClass->pixmap.convertToImage();
--
-- bool haveTint = pClass->tint.rgb() != 0xFFFFFF;
-- bool haveAlpha = pClass->alpha < 1.0;
-+ // enforce rgba values for the later
-+ scaledImage = scaledImage.convertDepth( 32 );
-+ }
-+ else
-+ pClass->readyPixmap = pClass->pixmap;
-+ }
-
- if (haveTint || haveAlpha) {
- // blend image(pix) with the given tint
-@@ -221,9 +266,12 @@ KdmPixmap::drawContents( QPainter *p, co
-
- }
-
-- pClass->readyPixmap.convertFromImage( scaledImage );
-+ if (!scaledImage.isNull()) {
-+ kdDebug() << timestamp() << " convertFromImage " << id << " " << area << endl;
-+ pClass->readyPixmap.convertFromImage( scaledImage );
-+ }
- }
-- // kdDebug() << "Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl;
-+ kdDebug() << timestamp() << " Pixmap::drawContents " << pClass->readyPixmap.size() << " " << px << " " << py << " " << sx << " " << sy << " " << sw << " " << sh << endl;
- p->drawPixmap( px, py, pClass->readyPixmap, sx, sy, sw, sh );
- }
-
-Index: kdm/kfrontend/themer/kdmlabel.cpp
-===================================================================
---- kdm/kfrontend/themer/kdmlabel.cpp.orig
-+++ kdm/kfrontend/themer/kdmlabel.cpp
-@@ -19,8 +19,10 @@
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-+#include <config.h>
- #include "kdmlabel.h"
--#include <kgreeter.h>
-+#include "kdmconfig.h"
-+#include "../kgreeter.h"
-
- #include <kglobal.h>
- #include <klocale.h>
-@@ -31,6 +33,7 @@
- #include <qpainter.h>
- #include <qfontmetrics.h>
- #include <qtimer.h>
-+#include <qaccel.h>
-
- #include <unistd.h>
- #include <sys/utsname.h>
-@@ -39,7 +42,7 @@
- #endif
-
- KdmLabel::KdmLabel( KdmItem *parent, const QDomNode &node, const char *name )
-- : KdmItem( parent, node, name )
-+ : KdmItem( parent, node, name ), myAccel(0)
- {
- itemType = "label";
-
-@@ -92,21 +95,46 @@ KdmLabel::KdmLabel( KdmItem *parent, con
- }
- }
-
-- // Check if this is a timer label
-+ // Check if this is a timer label)
- label.isTimer = label.text.find( "%c" ) >= 0;
- if (label.isTimer) {
- timer = new QTimer( this );
- timer->start( 1000 );
- connect( timer, SIGNAL(timeout()), SLOT(update()) );
- }
-- cText = lookupText( label.text );
-+ setTextInt( lookupText( label.text ) );
-+}
-+
-+void
-+KdmLabel::setTextInt( const QString &txt)
-+{
-+ // TODO: catch &&
-+ cText = txt;
-+ cAccel = txt.find('&');
-+ delete myAccel;
-+ myAccel = 0;
-+ if (cAccel != -1) {
-+ cText.remove('&');
-+ myAccel = new QAccel(parentWidget());
-+ myAccel->insertItem(ALT + UNICODE_ACCEL + cText.at(cAccel).lower().unicode());
-+ connect(myAccel, SIGNAL(activated(int)), SLOT(slotAccel()));
-+ }
-+}
-+
-+void
-+KdmLabel::slotAccel()
-+{
-+ if (buttonParent)
-+ emit activated(buttonParent->getId());
-+ else
-+ emit activated(id);
- }
-
- void
- KdmLabel::setText( const QString &txt )
- {
- label.text = txt;
-- update();
-+ setTextInt( lookupText( label.text ) );
- }
-
- QSize
-@@ -139,7 +167,23 @@ KdmLabel::drawContents( QPainter *p, con
- p->setFont( l->font );
- p->setPen( l->color );
- //TODO paint clipped (tested but not working..)
-- p->drawText( area, AlignLeft | SingleLine, cText );
-+ if (cAccel != -1 && (!id.isEmpty() || buttonParent) ) {
-+ QString left = cText.left(cAccel);
-+ QString right = cText.mid(cAccel + 1);
-+ p->drawText( area, AlignLeft | SingleLine, left );
-+ QRect tarea = area;
-+ QFontMetrics fm(l->font);
-+ tarea.rLeft() += fm.width(left);
-+ QFont f(l->font);
-+ f.setUnderline(true);
-+ p->setFont ( f );
-+ p->drawText( tarea, AlignLeft | SingleLine, QString(cText.at(cAccel)));
-+ tarea.rLeft() += fm.width(cText.at(cAccel));
-+ p->setFont( l->font );
-+ p->drawText( tarea, AlignLeft | SingleLine, right);
-+ } else {
-+ p->drawText( area, AlignLeft | SingleLine, cText);
-+ }
- }
-
- void
-@@ -159,7 +203,7 @@ KdmLabel::update()
- {
- QString text = lookupText( label.text );
- if (text != cText) {
-- cText = text;
-+ setTextInt(text);
- needUpdate();
- }
- }
-@@ -167,22 +211,23 @@ KdmLabel::update()
- static const struct {
- const char *type, *text;
- } stocks[] = {
-- { "language", I18N_NOOP("Language") },
-- { "session", I18N_NOOP("Session Type") },
-- { "system", I18N_NOOP("Menu") }, // i18n("Actions");
-- { "disconnect", I18N_NOOP("Disconnect") },
-- { "quit", I18N_NOOP("Quit") },
-- { "halt", I18N_NOOP("Power off") },
-- { "suspend", I18N_NOOP("Suspend") },
-- { "reboot", I18N_NOOP("Reboot") },
-+ { "language", I18N_NOOP("&Language") },
-+ { "session", I18N_NOOP("Session &Type") },
-+ { "system", I18N_NOOP("&System") }, // i18n("Actions");
-+ { "disconnect", I18N_NOOP("&Disconnect") },
-+ { "quit", I18N_NOOP("&Quit") },
-+ { "halt", I18N_NOOP("Power O&ff") },
-+ { "suspend", I18N_NOOP("S&uspend") },
-+ { "reboot", I18N_NOOP("&Reboot") },
- { "chooser", I18N_NOOP("XDMCP Chooser") },
- { "config", I18N_NOOP("Configure") },
-- { "caps-lock-warning", I18N_NOOP("You have got caps lock on.") },
-- { "timed-label", I18N_NOOP("User %s will login in %d seconds") },
-- { "welcome-label", I18N_NOOP("Welcome to %h") }, // _greetString
-- { "username-label", I18N_NOOP("Username:") },
-- { "password-label", I18N_NOOP("Password:") },
-- { "login", I18N_NOOP("Login") }
-+ { "caps-lock-warning", I18N_NOOP("Caps Lock is enabled.") },
-+ { "timed-label", I18N_NOOP("User %s will log in in %d seconds") },
-+ { "welcome-label", I18N_NOOP("Welcome to %h") }, // _greetString
-+ { "username-label", I18N_NOOP("&Username:") },
-+ { "password-label", I18N_NOOP("&Password:") },
-+ { "domain-label", I18N_NOOP("&Domain:") },
-+ { "login", I18N_NOOP("L&ogin") }
- };
-
- QString
-@@ -195,7 +240,7 @@ KdmLabel::lookupStock( const QString &st
- if (type == stocks[i].type)
- return i18n(stocks[i].text);
-
-- kdDebug() << "Invalid <stock> element. Check your theme!" << endl;
-+ kdDebug() << timestamp() << " Invalid <stock> element. Check your theme!" << endl;
- return stock;
- }
-
-@@ -205,7 +250,6 @@ KdmLabel::lookupText( const QString &t )
- QString text = t;
-
- text.replace( '_', '&' );
--// text.remove( '_' ); // FIXME add key accels, remove underscores for now
-
- QMap<QChar,QString> m;
- struct utsname uts;
-Index: kdm/kfrontend/kdmconfig.h
-===================================================================
---- kdm/kfrontend/kdmconfig.h.orig
-+++ kdm/kfrontend/kdmconfig.h
-@@ -35,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <qstring.h>
- #include <qstringlist.h>
- #include <qfont.h>
-+#include <sys/time.h>
-
- extern QString _stsFile;
- extern bool _isLocal;
-@@ -46,6 +47,19 @@ CONF_GREET_CPP_DECLS
- struct dpySpec;
- void decodeSess( dpySpec *sess, QString &user, QString &loc );
-
-+extern struct timeval st;
-+
-+inline QString timestamp() {
-+ struct timeval nst;
-+ gettimeofday(&nst, 0);
-+ if (!st.tv_sec)
-+ gettimeofday(&st, 0);
-+
-+ QString ret;
-+ ret.sprintf("[%07ld]", (nst.tv_sec - st.tv_sec) * 1000 + (nst.tv_usec - st.tv_usec) / 1000);
-+ return ret;
-+}
-+
- extern "C"
- #endif
- void init_config( void );
-Index: kdm/kfrontend/kgreeter.h
-===================================================================
---- kdm/kfrontend/kgreeter.h.orig
-+++ kdm/kfrontend/kgreeter.h
-@@ -73,9 +73,10 @@ class KGreeter : public KGDialog, public
- void slotUserEntered();
-
- protected:
-+ void readFacesList();
- void installUserList();
- void insertUser( const QImage &, const QString &, struct passwd * );
-- void insertUsers();
-+ void insertUsers( int limit = -1);
- void putSession( const QString &, const QString &, bool, const char * );
- void insertSessions();
- virtual void pluginSetup();
-@@ -87,10 +88,13 @@ class KGreeter : public KGDialog, public
- QStringList *userList;
- QPopupMenu *sessMenu;
- QValueVector<SessType> sessionTypes;
-+ QStringList randomFaces;
-+ QMap<QString, QString> randomFacesMap;
- int nNormals, nSpecials;
- int curPrev, curSel;
- bool prevValid;
- bool needLoad;
-+ bool themed;
-
- static int curPlugin;
- static PluginList pluginList;
-Index: kdm/kfrontend/kgdialog.cpp
-===================================================================
---- kdm/kfrontend/kgdialog.cpp.orig
-+++ kdm/kfrontend/kgdialog.cpp
-@@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include "kdm_greet.h"
-
- #include <klocale.h>
-+#include <kiconloader.h>
-
- #include <qaccel.h>
- #include <qlayout.h>
-@@ -58,7 +59,7 @@ KGDialog::completeMenu()
- #ifdef HAVE_VTS
- if (_isLocal) {
- dpyMenu = new QPopupMenu( this );
-- int id = inserten( i18n("Sw&itch User"), ALT+Key_I, dpyMenu );
-+ int id = inserten( i18n("Sw&itch User"), CTRL + Key_I, dpyMenu );
- connect( dpyMenu, SIGNAL(activated( int )),
- SLOT(slotDisplaySelected( int )) );
- connect( dpyMenu, SIGNAL(aboutToShow()),
-@@ -71,7 +72,7 @@ KGDialog::completeMenu()
-
- if (_allowClose)
- inserten( _isLocal ? i18n("R&estart X Server") : i18n("Clos&e Connection"),
-- ALT+Key_E, SLOT(slotExit()) );
-+ 0, SLOT(slotExit()) );
-
- #ifdef XDMCP
- if (_isLocal && _loginMode != _switchIf) {
-@@ -81,10 +82,11 @@ KGDialog::completeMenu()
- #endif
-
- if (_hasConsole)
-- inserten( i18n("Co&nsole Login"), ALT+Key_N, SLOT(slotConsole()) );
-+ inserten( i18n("Co&nsole Login"), CTRL+Key_N, SLOT(slotConsole()) );
-
- if (_allowShutdown != SHUT_NONE) {
-- inserten( i18n("&Shutdown..."), ALT+Key_S, SLOT(slotShutdown( int )) );
-+ ensureMenu();
-+ optMenu->insertItem(SmallIconSet( "exit" ), i18n("&Shutdown..."), this, SLOT(slotShutdown(int)), CTRL+Key_S );
- QAccel *accel = new QAccel( this );
- accel->insertItem( ALT+CTRL+Key_Delete );
- connect( accel, SIGNAL(activated( int )), SLOT(slotShutdown( int )) );
-Index: kdm/kfrontend/kdmconfig.cpp
-===================================================================
---- kdm/kfrontend/kdmconfig.cpp.orig
-+++ kdm/kfrontend/kdmconfig.cpp
-@@ -33,6 +33,8 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <unistd.h>
- #include <sys/utsname.h>
-
-+struct timeval st = {0, 0};
-+
- CONF_GREET_DEFS
-
- QString _stsFile;
-Index: kdm/kfrontend/kgapp.cpp
-===================================================================
---- kdm/kfrontend/kgapp.cpp.orig
-+++ kdm/kfrontend/kgapp.cpp
-@@ -36,6 +36,8 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <kcrash.h>
- #include <kstandarddirs.h>
- #include <ksimpleconfig.h>
-+#include <klocale.h>
-+#include <kdebug.h>
-
- #include <qtimer.h>
- #include <qcursor.h>
-@@ -130,6 +132,7 @@ kg_main( const char *argv0 )
- static char *argv[] = { (char *)"kdmgreet", 0 };
- KCmdLineArgs::init( 1, argv, *argv, 0, 0, 0, true );
-
-+ kdDebug() << timestamp() << "start" << endl;
- kde_have_kipc = false;
- KApplication::disableAutoDcopRegistration();
- KCrash::setSafer( true );
-@@ -166,6 +169,7 @@ kg_main( const char *argv0 )
-
- GSendInt( G_Ready );
-
-+ kdDebug() << timestamp() << " main1" << endl;
- setCursor( dpy, app.desktop()->winId(), XC_left_ptr );
-
- for (;;) {
-@@ -206,6 +210,7 @@ kg_main( const char *argv0 )
- if (_useTheme && !_theme.isEmpty()) {
- KThemedGreeter *tgrt;
- dialog = tgrt = new KThemedGreeter;
-+ kdDebug() << timestamp() << " themed" << endl;
- if (!tgrt->isOK()) {
- delete tgrt;
- dialog = new KStdGreeter;
-Index: kdm/kfrontend/kgreeter.cpp
-===================================================================
---- kdm/kfrontend/kgreeter.cpp.orig
-+++ kdm/kfrontend/kgreeter.cpp
-@@ -38,6 +38,7 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <klistview.h>
- #include <ksimpleconfig.h>
- #include <kstringhandler.h>
-+#include <kdebug.h>
-
- #undef Unsorted // x headers suck - make qdir.h work with --enable-final
- #include <qdir.h>
-@@ -46,6 +47,7 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <qmemarray.h>
- #include <qimage.h>
- #include <qmovie.h>
-+#include <qpainter.h>
- #include <qpopupmenu.h>
- #include <qtimer.h>
- #include <qheader.h>
-@@ -63,27 +65,46 @@ Foundation, Inc., 51 Franklin Street, Fi
- #include <unistd.h>
- #include <fcntl.h>
- #include <sys/types.h>
-+#include <utmp.h>
-+#include <utmpx.h>
-
- #include <X11/Xlib.h>
-
- class UserListView : public KListView {
- public:
-- UserListView( QWidget *parent = 0, const char *name = 0 )
-+ UserListView( bool _them, QWidget *parent = 0, const char *name = 0 )
- : KListView( parent, name )
-- , cachedSizeHint( -1, 0 )
-+ , themed(_them), cachedSizeHint( -1, 0 )
- {
- setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Ignored );
- header()->hide();
- addColumn( QString::null );
- setColumnAlignment( 0, AlignVCenter );
- setResizeMode( QListView::LastColumn );
-+ if (themed) {
-+ setBackgroundMode( Qt::NoBackground );
-+ viewport()->setBackgroundMode( Qt::NoBackground );
-+ setFrameStyle( QFrame::NoFrame );
-+ }
- }
-
-+ bool themed;
- mutable QSize cachedSizeHint;
-
-- protected:
-+ int sumHeight() const
-+ {
-+ int sum = 0;
-+ for (QListViewItem *itm = firstChild(); itm; itm = itm->nextSibling()) {
-+ sum += itm->height();
-+ }
-+ return sum;
-+ }
-+public:
- virtual QSize sizeHint() const
- {
-+ if (themed)
-+ return KListView::sizeHint();
-+
- if (!cachedSizeHint.isValid()) {
- constPolish();
- uint maxw = 0;
-@@ -98,8 +119,23 @@ class UserListView : public KListView {
- }
- return cachedSizeHint;
- }
--};
-+ virtual void paintEmptyArea ( QPainter * p, const QRect & rect )
-+ {
-+ if (!themed)
-+ return KListView::paintEmptyArea(p, rect );
-+
-+ const QPixmap *pm = paletteBackgroundPixmap();
-+ if (!pm || pm->isNull())
-+ return;
-+
-+ kdDebug() << "paintEmpty " << rect << endl;
-+ QRect devRect = p->xForm( rect );
-+ kdDebug() << "paintEmpty2 " << devRect << endl;
-+ p->drawPixmap(0, 0, *pm, devRect.left(), devRect.top() );
-+ }
-
-+ QPixmap background;
-+};
-
- int KGreeter::curPlugin = -1;
- PluginList KGreeter::pluginList;
-@@ -115,12 +151,14 @@ KGreeter::KGreeter( bool framed )
- , curSel( -1 )
- , prevValid( true )
- , needLoad( false )
-+ , themed( framed )
- {
- stsFile = new KSimpleConfig( _stsFile );
- stsFile->setGroup( "PrevUser" );
-
- if (_userList) {
-- userView = new UserListView( this );
-+ readFacesList();
-+ userView = new UserListView( framed, this );
- connect( userView, SIGNAL(clicked( QListViewItem * )),
- SLOT(slotUserClicked( QListViewItem * )) );
- connect( userView, SIGNAL(doubleClicked( QListViewItem * )),
-@@ -128,10 +166,8 @@ KGreeter::KGreeter( bool framed )
- }
- if (_userCompletion)
- userList = new QStringList;
-- if (userView || userList)
-- insertUsers();
-
-- sessMenu = new QPopupMenu( this );
-+ sessMenu = new QPopupMenu( this );
- connect( sessMenu, SIGNAL(activated( int )),
- SLOT(slotSessionSelected( int )) );
- insertSessions();
-@@ -150,6 +186,33 @@ KGreeter::~KGreeter()
- delete stsFile;
- }
-
-+void KGreeter::readFacesList()
-+{
-+ FILE *f = fopen( QFile::encodeName( _faceDir + "/.randomlist" ), "rt" );
-+ if ( !f )
-+ return;
-+ QTextIStream is( f );
-+ while ( !is.eof() )
-+ {
-+ QString line = is.readLine().simplifyWhiteSpace();
-+ if ( line.isEmpty() )
-+ continue;
-+ QString icon;
-+ int index = line.find( ' ' );
-+ if ( index > 0 ) {
-+ icon = line.left( index );
-+ line = line.mid( index );
-+ } else {
-+ icon = line;
-+ line = QString::null;
-+ }
-+ randomFaces.push_back( icon );
-+ QStringList list = QStringList::split( ' ', line );
-+ for ( QStringList::ConstIterator it = list.begin(); it != list.end(); ++it )
-+ randomFacesMap[*it] = icon;
-+ }
-+}
-+
- class UserListViewItem : public KListViewItem {
- public:
- UserListViewItem( UserListView *parent, const QString &text,
-@@ -163,6 +226,14 @@ class UserListViewItem : public KListVie
- parent->cachedSizeHint.setWidth( -1 );
- }
-
-+ virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
-+ {
-+ if (((UserListView*)listView())->themed)
-+ QListViewItem::paintCell(p, cg, column, width, alignment);
-+ else
-+ KListViewItem::paintCell(p, cg, column, width, alignment);
-+ }
-+
- QString login;
- };
-
-@@ -224,10 +295,23 @@ KGreeter::insertUser( const QImage &defa
- QSize ns( 48, 48 );
- if (p.size() != ns)
- p = p.convertDepth( 32 ).smoothScale( ns, QImage::ScaleMin );
-- goto gotit;
-+ break;
- } while (--nd >= 0);
-- p = default_pix;
-- gotit:
-+
-+ if ( p.isNull() && randomFaces.count() ) {
-+ QString randomFace = randomFacesMap[username];
-+ if ( randomFace.isNull() ) {
-+ QStringList::size_type index = 0;
-+ for ( size_t i = 0; i < username.length(); ++i )
-+ index += ( 0x7f - username.at( i ).latin1() ) % 37;
-+ randomFace = randomFaces[ index % randomFaces.count() ];
-+ }
-+ p.load( _faceDir + "/../pics/users/" + randomFace + ".png" );
-+ }
-+
-+ if ( p.isNull() )
-+ p = default_pix;
-+
- QString realname = KStringHandler::from8Bit( ps->pw_gecos );
- realname.truncate( realname.find( ',' ) );
- if (realname.isEmpty() || realname == username)
-@@ -278,7 +362,7 @@ UserList::UserList( char **in )
- }
-
- void
--KGreeter::insertUsers()
-+KGreeter::insertUsers(int limit_users)
- {
- struct passwd *ps;
-
-@@ -305,6 +389,8 @@ KGreeter::insertUsers()
- if (_showUsers == SHOW_ALL) {
- UserList noUsers( _noUsers );
- QDict<int> dupes( 1000 );
-+ QStringList toinsert;
-+ int count = 0;
- for (setpwent(); (ps = getpwent()) != 0;) {
- if (*ps->pw_dir && *ps->pw_shell &&
- (ps->pw_uid >= (unsigned)_lowUserId ||
-@@ -316,10 +402,53 @@ KGreeter::insertUsers()
- QString username( QFile::decodeName( ps->pw_name ) );
- if (!dupes.find( username )) {
- dupes.insert( username, (int *)-1 );
-- insertUser( default_pix, username, ps );
-+ toinsert.append( username );
-+
-+ if ( limit_users >= 0 && ++count > limit_users )
-+ break;
- }
- }
- }
-+ if ( limit_users >= 0 && ++count > limit_users ) {
-+ utmpname( _PATH_WTMP );
-+ setutxent();
-+ toinsert = QStringList();
-+ dupes.clear();
-+
-+ for ( count = 0; count < limit_users; ) {
-+ struct utmpx * ent = getutxent();
-+ if ( !ent )
-+ break;
-+ struct passwd *ps = getpwnam( ent->ut_user );
-+ if (ps && *ps->pw_dir && *ps->pw_shell &&
-+ (ps->pw_uid >= (unsigned)_lowUserId ||
-+ !ps->pw_uid && _showRoot) &&
-+ ps->pw_uid <= (unsigned)_highUserId &&
-+ !noUsers.hasUser( ps->pw_name ) &&
-+ !noUsers.hasGroup( ps->pw_gid ))
-+ {
-+ QString username( QFile::decodeName( ent->ut_user ) );
-+ if (!dupes.find( username )) {
-+ dupes.insert( username, (int *)-1 );
-+ toinsert.append( username );
-+ count++;
-+ }
-+ }
-+
-+
-+ }
-+ endutxent();
-+ }
-+
-+ for ( QStringList::ConstIterator it = toinsert.begin();
-+ it != toinsert.end(); ++it )
-+ {
-+ // pretty stupid to do another lookup round, but the number is limited
-+ // and caching struct passwd is pretty ugly
-+ struct passwd *ps = getpwnam( QFile::encodeName( *it ) );
-+ if ( ps )
-+ insertUser( default_pix, *it, ps );
-+ }
- } else {
- UserList users( _users );
- if (users.hasGroups()) {
-@@ -721,21 +850,24 @@ KStdGreeter::KStdGreeter()
- hbox2->addStretch( 1 );
-
- if (sessMenu->count() > 1) {
-- inserten( i18n("Session &Type"), ALT+Key_T, sessMenu );
-+ inserten( i18n("Session &Type"), 0, sessMenu );
- needSep = true;
- }
-
- if (plugMenu) {
-- inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu );
-+ inserten( i18n("&Authentication Method"), 0, plugMenu );
- needSep = true;
- }
-
- #ifdef XDMCP
-- completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), ALT+Key_R );
-+ completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), 0 );
- #else
- completeMenu();
- #endif
-
-+ if (userView || userList)
-+ insertUsers();
-+
- if (optMenu)
- menuButton->setPopup( optMenu );
- else
-@@ -829,6 +961,9 @@ KThemedGreeter::KThemedGreeter()
- if (xauth_warning && (_authorized || !_authComplain))
- xauth_warning->hide( true );
-
-+ if (userView || userList)
-+ insertUsers( 7 ); // TODO: find out how many are a good value
-+
- // if (!_greetString.isEmpty()) {
- // }
- // clock = new KdmClock( this, "clock" );
-@@ -854,37 +989,31 @@ KThemedGreeter::KThemedGreeter()
- if ((itm = themer->findNode( "session_button" ))) {
- if (sessMenu->count() <= 1)
- itm->hide( true );
-- else {
-- session_button = itm;
-- QAccel *accel = new QAccel( this );
-- accel->insertItem( ALT+Key_T, 0 );
-- connect( accel, SIGNAL(activated( int )), SLOT(slotSessMenu()) );
-- }
-+ else
-+ session_button = itm;
- } else {
- if (sessMenu->count() > 1) {
-- inserten( i18n("Session &Type"), ALT+Key_T, sessMenu );
-+ inserten( i18n("Session &Type"), 0, sessMenu );
- needSep = true;
- }
- }
-
- if (plugMenu) {
-- inserten( i18n("&Authentication Method"), ALT+Key_A, plugMenu );
-+ inserten( i18n("&Authentication Method"), 0, plugMenu );
- needSep = true;
- }
-
- #ifdef XDMCP
-- completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), ALT+Key_R );
-+ completeMenu( LOGIN_LOCAL_ONLY, ex_choose, i18n("&Remote Login"), 0 );
- #else
- completeMenu();
- #endif
-
- system_button = themer->findNode( "system_button" );
-- QAccel *accel = new QAccel( this );
-- accel->insertItem( ALT+Key_M, 0 );
-- connect( accel, SIGNAL(activated( int )), SLOT(slotActionMenu()) );
-
- pluginSetup();
-
-+
- verify->start();
- }
-
-@@ -902,8 +1031,8 @@ KThemedGreeter::pluginSetup()
- inherited::pluginSetup();
-
- if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_rect) {
-+ userView->setMaximumHeight( userView->sumHeight() );
- userlist_rect->setWidget( userView );
-- userView->show();
- } else {
- if (userView)
- userView->hide();
-@@ -919,12 +1048,17 @@ KThemedGreeter::verifyFailed()
- {
- // goButton->setEnabled( false );
- inherited::verifyFailed();
-+ if (userView)
-+ userView->setEnabled(false);
- }
-
- void
- KThemedGreeter::verifyRetry()
- {
- // goButton->setEnabled( true );
-+ if (userView)
-+ userView->setEnabled(true);
-+
- }
-
- QString KThemedGreeter::timedUser = QString::null;