Index: kdm/kfrontend/kgreeter.cpp
===================================================================
--- kdm/kfrontend/kgreeter.cpp.orig
+++ kdm/kfrontend/kgreeter.cpp
@@ -66,20 +66,20 @@ Foundation, Inc., 51 Franklin Street, Fi
 
 class UserListView : public QListWidget {
   public:
-	UserListView( QWidget *parent = 0 )
+	UserListView( bool _themed, QWidget *parent = 0 )
 		: QListWidget( parent )
 		, cachedSizeHint( -1, 0 )
+                , themed( _themed )
 	{
 		setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Ignored );
 		setUniformItemSizes( true );
 		setVerticalScrollMode( ScrollPerPixel );
 		setIconSize( QSize( 48, 48 ) );
-		setAlternatingRowColors( true );
+		setAlternatingRowColors( !themed );
 	}
 
 	mutable QSize cachedSizeHint;
 
-  protected:
 	virtual QSize sizeHint() const
 	{
 		if (!cachedSizeHint.isValid()) {
@@ -147,6 +147,7 @@ class UserListView : public QListWidget
 
   private:
 	bool m_suppressClick;
+	bool themed;
 };
 
 class UserListViewItem : public QListWidgetItem {
@@ -183,7 +184,7 @@ KGreeter::KGreeter( bool framed )
 	                             "PrevUser" );
 
 	if (_userList) {
-		userView = new UserListView( this );
+		userView = new UserListView( framed, this );
 		connect( userView, SIGNAL(itemClicked( QListWidgetItem * )),
 		         SLOT(slotUserClicked( QListWidgetItem * )) );
 		connect( userView, SIGNAL(itemDoubleClicked( QListWidgetItem * )),
@@ -191,8 +192,6 @@ KGreeter::KGreeter( bool framed )
 	}
 	if (_userCompletion)
 		userList = new QStringList;
-	if (userView || userList)
-		insertUsers();
 
 	sessMenu = new QMenu( this );
 	connect( sessMenu, SIGNAL(triggered( QAction * )),
@@ -361,8 +360,11 @@ UserList::UserList( char **in )
 			users.insert( *in );
 }
 
+#include <utmp.h>
+#include <utmpx.h>
+
 void
-KGreeter::insertUsers()
+KGreeter::insertUsers( int limit_users )
 {
 	struct passwd *ps;
 
@@ -387,6 +389,9 @@ KGreeter::insertUsers()
 	if (_showUsers == SHOW_ALL) {
 		UserList noUsers( _noUsers );
 		QSet<QString> dupes;
+                QStringList toinsert;
+
+                int count = 0;
 		for (setpwent(); (ps = getpwent()) != 0;) {
 			if (*ps->pw_dir && *ps->pw_shell &&
 			    (ps->pw_uid >= (unsigned)_lowUserId ||
@@ -398,10 +403,53 @@ KGreeter::insertUsers()
 				QString username( QFile::decodeName( ps->pw_name ) );
 				if (!dupes.contains( username )) {
 					dupes.insert( username );
-					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.contains( username )) {
+                                dupes.insert( username );
+                                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()) {
@@ -777,6 +825,9 @@ KStdGreeter::KStdGreeter()
 			break;
 	}
 
+        if (userView || userList)
+		insertUsers();
+
 	if (userView) {
 		if (clock)
 			inner_box->addWidget( clock, 0, Qt::AlignCenter );
@@ -890,6 +941,9 @@ KThemedGreeter::KThemedGreeter( KdmTheme
 
 	adjustGeometry();
 
+        // default
+        themer->setTypeVisible( "userlist", true );
+
 	themer->setWidget( this );
 
 	connect( themer, SIGNAL(activated( const QString & )),
@@ -973,6 +1027,13 @@ KThemedGreeter::KThemedGreeter( KdmTheme
 	completeMenu();
 #endif
 
+        if (userView || userList)
+        {
+            insertUsers(7);
+            themer->setTypeVisible( "userlist", true );
+        } else
+            themer->setTypeVisible( "userlist", false );
+
 	if ((system_button = themer->findNode( "system_button" ))) {
 		if (optMenu)
 			addAction( optMenu->menuAction() );
@@ -1003,7 +1064,10 @@ KThemedGreeter::pluginSetup()
 {
 	inherited::pluginSetup();
 
-	if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_node) {
+        if (userView && verify->entitiesLocal() && verify->entityPresettable() && userlist_node) {
+                userView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
+                userView->setMaximumHeight( userView->sizeHint().height() );
+
 		userlist_node->setWidget( userView );
 		userlist_rect->setVisible( true );
 	} else {
Index: kdm/kfrontend/kgreeter.h
===================================================================
--- kdm/kfrontend/kgreeter.h.orig
+++ kdm/kfrontend/kgreeter.h
@@ -71,7 +71,7 @@ class KGreeter : public KGDialog, public
   protected:
 	void installUserList();
 	void insertUser( const QImage &, const QString &, struct passwd * );
-	void insertUsers();
+	void insertUsers(int limit_users = -1);
 	void putSession( const QString &, const QString &, bool, const char * );
 	void insertSessions();
 	virtual void pluginSetup();
Index: kdm/kfrontend/themer/kdmitem.cpp
===================================================================
--- kdm/kfrontend/themer/kdmitem.cpp.orig
+++ kdm/kfrontend/themer/kdmitem.cpp
@@ -65,7 +65,6 @@ KdmItem::KdmItem( QObject *parent, const
 		      !modes.split( ",", QString::SkipEmptyParts ).contains( "console" ))))
 		{
 			m_visible = false;
-			return;
 		}
 
 		m_showType = sel.attribute( "type" );
@@ -78,7 +77,6 @@ KdmItem::KdmItem( QObject *parent, const
 			    themer()->typeVisible( m_showType ) == m_showTypeInvert)
 			{
 				m_visible = false;
-				return;
 			}
 		}
 
Index: kdm/kfrontend/themer/kdmlist.cpp
===================================================================
--- kdm/kfrontend/themer/kdmlist.cpp.orig
+++ kdm/kfrontend/themer/kdmlist.cpp
@@ -29,8 +29,6 @@ KdmList::KdmList( QObject *parent, const
 	: KdmItem( parent, node )
 {
 	itemType = "list";
-	if (!isVisible())
-		return;
 
 	// Read RECT TAGS
 	QDomNodeList childList = node.childNodes();
Index: kdm/kfrontend/themer/kdmthemer.cpp
===================================================================
--- kdm/kfrontend/themer/kdmthemer.cpp.orig
+++ kdm/kfrontend/themer/kdmthemer.cpp
@@ -227,11 +227,7 @@ KdmThemer::generateItems( KdmItem *paren
 			else if (type == "svg")
 				newItem = new KdmPixmap( parent, subnode );
 			else
-				continue;
-			if (!newItem->isVisible()) {
-				delete newItem;
-				continue;
-			}
+                                continue;
 			connect( newItem, SIGNAL(needUpdate( int, int, int, int )),
 			         SLOT(update( int, int, int, int )) );
 			connect( newItem, SIGNAL(needPlacement()),
