diff options
author | David Edmundson <david@davidedmundson.co.uk> | 2011-11-20 21:31:13 +0000 |
---|---|---|
committer | David Edmundson <david@davidedmundson.co.uk> | 2011-11-20 21:31:13 +0000 |
commit | 131f0c158933adfe6150b062ddf827ad6c940c60 (patch) | |
tree | 3daedd7167f9dc2199b3afea9c043e060b6bcd28 | |
parent | 917c8fe94754c9de57689f28176b2b12fe1a419b (diff) | |
download | lightdm-131f0c158933adfe6150b062ddf827ad6c940c60.tar.gz |
Start of refactor to make QLightDM use the GObject library.
Initial UsersModel port
-rw-r--r-- | liblightdm-gobject/lightdm.h | 2 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/power.h | 2 | ||||
-rw-r--r-- | liblightdm-gobject/lightdm/system.h | 2 | ||||
-rw-r--r-- | liblightdm-qt/Makefile.am | 3 | ||||
-rw-r--r-- | liblightdm-qt/QLightDM/usersmodel.h | 13 | ||||
-rw-r--r-- | liblightdm-qt/usersmodel.cpp | 273 |
6 files changed, 137 insertions, 158 deletions
diff --git a/liblightdm-gobject/lightdm.h b/liblightdm-gobject/lightdm.h index a23ecdfc..43603e22 100644 --- a/liblightdm-gobject/lightdm.h +++ b/liblightdm-gobject/lightdm.h @@ -20,6 +20,4 @@ #include "lightdm/system.h" #include "lightdm/user.h" -G_END_DECLS - #endif /* _LIGHTDM_H_ */ diff --git a/liblightdm-gobject/lightdm/power.h b/liblightdm-gobject/lightdm/power.h index 284382b2..c8d22198 100644 --- a/liblightdm-gobject/lightdm/power.h +++ b/liblightdm-gobject/lightdm/power.h @@ -12,6 +12,8 @@ #ifndef _LIGHTDM_POWER_H_ #define _LIGHTDM_POWER_H_ +G_BEGIN_DECLS + gboolean lightdm_get_can_suspend (void); gboolean lightdm_suspend (GError **error); diff --git a/liblightdm-gobject/lightdm/system.h b/liblightdm-gobject/lightdm/system.h index f070ec80..a5510403 100644 --- a/liblightdm-gobject/lightdm/system.h +++ b/liblightdm-gobject/lightdm/system.h @@ -14,6 +14,8 @@ #include <glib-object.h> +G_BEGIN_DECLS + const gchar *lightdm_get_hostname (void); G_END_DECLS diff --git a/liblightdm-qt/Makefile.am b/liblightdm-qt/Makefile.am index 4c1df547..a93cb95c 100644 --- a/liblightdm-qt/Makefile.am +++ b/liblightdm-qt/Makefile.am @@ -11,8 +11,9 @@ usersmodel.cpp: QLightDM/usersmodel.h -liblightdm_qt_1_la_LIBADD = $(LIBLIGHTDM_QT_LIBS) +liblightdm_qt_1_la_LIBADD = $(LIBLIGHTDM_QT_LIBS) -llightdm-gobject-1 liblightdm_qt_1_la_CXXFLAGS = $(LIBLIGHTDM_QT_CFLAGS) \ + $(LIBLIGHTDM_GOBJECT_CFLAGS) -DXSESSIONS_DIR=\"$(datadir)/xsessions\" liblightdm_qt_1include_HEADERS = \ diff --git a/liblightdm-qt/QLightDM/usersmodel.h b/liblightdm-qt/QLightDM/usersmodel.h index 498e0bce..280a019b 100644 --- a/liblightdm-qt/QLightDM/usersmodel.h +++ b/liblightdm-qt/QLightDM/usersmodel.h @@ -16,11 +16,11 @@ #include <QtCore/QSharedDataPointer> #include <QAbstractListModel> -class UsersModelPrivate; -class UserItem; namespace QLightDM { +class UsersModelPrivate; + class Q_DECL_EXPORT UsersModel : public QAbstractListModel { Q_OBJECT @@ -35,13 +35,12 @@ public: int rowCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; -private slots: - /** Updates the model with new changes in the password file*/ - void loadUsers(); +protected: + UsersModelPrivate * const d_ptr; private: - UsersModelPrivate *d; - QList<UserItem> getUsers() const; + Q_DECLARE_PRIVATE(UsersModel) + }; }; diff --git a/liblightdm-qt/usersmodel.cpp b/liblightdm-qt/usersmodel.cpp index 3fcc73db..a3487302 100644 --- a/liblightdm-qt/usersmodel.cpp +++ b/liblightdm-qt/usersmodel.cpp @@ -11,18 +11,12 @@ #include "QLightDM/usersmodel.h" -#include <pwd.h> -#include <errno.h> - -#include <QtCore/QSharedData> #include <QtCore/QString> -#include <QtCore/QFileSystemWatcher> -#include <QtCore/QFile> -#include <QtCore/QDir> -#include <QtCore/QSettings> #include <QtCore/QDebug> #include <QtGui/QPixmap> +#include <lightdm-gobject-1/lightdm.h> + using namespace QLightDM; class UserItem @@ -45,189 +39,172 @@ QString UserItem::displayName() const { } } - +namespace QLightDM { class UsersModelPrivate { public: + UsersModelPrivate(UsersModel *parent); QList<UserItem> users; -}; -UsersModel::UsersModel(QObject *parent) : - QAbstractListModel(parent), - d (new UsersModelPrivate()) -{ - //load users on startup and if the password file changes. - QFileSystemWatcher *watcher = new QFileSystemWatcher(this); - watcher->addPath("/etc/passwd"); //FIXME harcoded path - connect(watcher, SIGNAL(fileChanged(QString)), SLOT(loadUsers())); + protected: + UsersModel * const q_ptr; - loadUsers(); + void loadUsers(); + + static void cb_userAdded(LightDMUserList *user_list, LightDMUser *user, gpointer data); + static void cb_userChanged(LightDMUserList *user_list, LightDMUser *user, gpointer data); + static void cb_userRemoved(LightDMUserList *user_list, LightDMUser *user, gpointer data); + private: + Q_DECLARE_PUBLIC(UsersModel) +}; } -UsersModel::~UsersModel() +UsersModelPrivate::UsersModelPrivate(UsersModel* parent) : + q_ptr(parent) { - delete d; -} + g_type_init(); + loadUsers(); + g_signal_connect(lightdm_user_list_get_instance(), "user-added", G_CALLBACK (cb_userAdded), this); + g_signal_connect(lightdm_user_list_get_instance(), "user-changed", G_CALLBACK (cb_userChanged), this); + g_signal_connect(lightdm_user_list_get_instance(), "user-removed", G_CALLBACK (cb_userRemoved), this); +} -int UsersModel::rowCount(const QModelIndex &parent) const +void UsersModelPrivate::loadUsers() { - return d->users.count(); + Q_Q(UsersModel); + + int rowCount = lightdm_user_list_get_length(lightdm_user_list_get_instance()); + + if (rowCount == 0) { + return; + } else { + q->beginInsertRows(QModelIndex(), 0, rowCount-1); + + const GList *items, *item; + items = lightdm_user_list_get_users(lightdm_user_list_get_instance()); + for (item = items; item; item = item->next) { + LightDMUser *ldmUser = static_cast<LightDMUser*>(item->data); + + UserItem user; + user.name = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser)); + user.homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser)); + user.realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser)); + user.image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser)); + user.isLoggedIn = lightdm_user_get_logged_in(ldmUser); + users.append(user); + } + + q->endInsertRows(); + } } -QVariant UsersModel::data(const QModelIndex &index, int role) const +void UsersModelPrivate::cb_userAdded(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data) { - if (!index.isValid()) { - return QVariant(); - } + Q_UNUSED(user_list) + UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data); - int row = index.row(); - switch (role) { - case Qt::DisplayRole: - return d->users[row].displayName(); - case Qt::DecorationRole: - return QPixmap(d->users[row].image); - case UsersModel::NameRole: - return d->users[row].name; - case UsersModel::RealNameRole: - return d->users[row].realName; - case UsersModel::LoggedInRole: - return d->users[row].isLoggedIn; - } + that->q_ptr->beginInsertRows(QModelIndex(), that->users.size(), that->users.size()); - return QVariant(); -} + UserItem user; + user.name = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser)); + user.homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser)); + user.realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser)); + user.image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser)); + user.isLoggedIn = lightdm_user_get_logged_in(ldmUser); + that->users.append(user); + + that->q_ptr->endRemoveRows(); +} -QList<UserItem> UsersModel::getUsers() const +void UsersModelPrivate::cb_userChanged(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data) { - QString file = "/etc/lightdm/users.conf"; //FIXME hardcoded path!! + Q_UNUSED(user_list) + UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data); - qDebug() << "Loading user configuration from " << file; - QSettings settings(file, QSettings::IniFormat); + QString userToChange = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser)); - int minimumUid = settings.value("UserAccounts/minimum-uid", QVariant(500)).toInt(); - QStringList hiddenShells; - if (settings.contains("UserAccounts/hidden-shells")) { - hiddenShells = settings.value("UserAccounts/hidden-shells").toString().split(" "); - } - else { - hiddenShells = QStringList() << "/bin/false" << "/usr/sbin/nologin"; - } - QStringList hiddenUsers; - if (settings.contains("UserAccounts/hidden-users")) { - hiddenUsers = settings.value("UserAccounts/hidden-users").toString().split(" "); - } - else { - hiddenUsers = QStringList() << "nobody" << "nobody4" << "noaccess"; - } - QList<UserItem> users; + for (int i=0;i<that->users.size();i++) { + if (that->users[i].name == userToChange) { - setpwent(); - Q_FOREVER { - errno = 0; - struct passwd *entry = getpwent(); - if(!entry) { - break; - } + that->users[i].homeDirectory = QString::fromLocal8Bit(lightdm_user_get_home_directory(ldmUser)); + that->users[i].realName = QString::fromLocal8Bit(lightdm_user_get_real_name(ldmUser)); + that->users[i].image = QString::fromLocal8Bit(lightdm_user_get_image(ldmUser)); + that->users[i].isLoggedIn = lightdm_user_get_logged_in(ldmUser); - /* Ignore system users */ - if(entry->pw_uid < minimumUid) { - continue; + QModelIndex index = that->q_ptr->createIndex(i, 0); + that->q_ptr->dataChanged(index, index); + break; } + } +} - /* Ignore users disabled by shell */ - if(entry->pw_shell) { - if (hiddenShells.contains(entry->pw_shell)) { - continue; - } - } - if (hiddenUsers.contains(entry->pw_name)) { - continue; - } +void UsersModelPrivate::cb_userRemoved(LightDMUserList *user_list, LightDMUser *ldmUser, gpointer data) +{ + Q_UNUSED(user_list) - QStringList tokens = QString(entry->pw_gecos).split(","); - QString realName; - if(tokens.size() > 0 && tokens.at(0) != "") { - realName = tokens.at(0); - } + UsersModelPrivate *that = static_cast<UsersModelPrivate*>(data); + QString userToRemove = QString::fromLocal8Bit(lightdm_user_get_name(ldmUser)); - QDir homeDir(entry->pw_dir); - QString image = homeDir.filePath(".face"); - if(!QFile::exists (image)) { - image = homeDir.filePath(".face.icon"); - if(!QFile::exists (image)) { - image = ""; - } + QList<UserItem>::iterator i; + for (int i=0;i<that->users.size();i++) { + if (that->users[i].name == userToRemove) { + that->q_ptr->beginRemoveRows(QModelIndex(), i, i); + that->users.removeAt(i); + that->q_ptr->endMoveRows(); + break; } - - UserItem user; - user.name = entry->pw_name; - user.realName = realName; - user.homeDirectory = entry->pw_dir; - user.image = image; - user.isLoggedIn = false; - users.append(user); } +} - if(errno != 0) { - qDebug() << "Failed to read password database: " << strerror(errno); - } - endpwent(); - +UsersModel::UsersModel(QObject *parent) : + QAbstractListModel(parent), + d_ptr(new UsersModelPrivate(this)) +{ - return users; } -void UsersModel::loadUsers() +UsersModel::~UsersModel() { - QList<UserItem> usersToAdd; - - //might get rid of "User" object, keep as private object (like sessionsmodel) - or make it copyable. - - //loop through all the new list of users, if it's in the list already update it (or do nothing) otherwise append to list of new users - QList<UserItem> newUserList = getUsers(); - - Q_FOREACH(const UserItem &user, newUserList) { - bool alreadyInList = false; - for(int i=0; i < d->users.size(); i++) { - if (user.name == d->users[i].name) { - alreadyInList = true; -// d->users[i].update(user.name(), user.homeDirectory(), user.image(), user.isLoggedIn()); - QModelIndex index = createIndex(i,0); - dataChanged(index, index); - } - } + delete d_ptr; +} - if (!alreadyInList) { - usersToAdd.append(user); - } + +int UsersModel::rowCount(const QModelIndex &parent) const +{ + Q_D(const UsersModel); + if (parent == QModelIndex()) { + return d->users.size(); } - //loop through all the existing users, if they're not in the newly gathered list, remove them. + return 0; +} - //FIXME this isn't perfect, looping like this in a mutating list - use mutable iterator. - for (int i=0; i < d->users.size() ; i++) { - bool found = false; - foreach(const UserItem &user, newUserList) { - if (d->users[i].name == user.name) { - found = true; - } - } +QVariant UsersModel::data(const QModelIndex &index, int role) const +{ + Q_D(const UsersModel); - if (!found) { - beginRemoveRows(QModelIndex(), i, i); - d->users.removeAt(i); - endRemoveRows(); - } + if (!index.isValid()) { + return QVariant(); } - //append new users - if (usersToAdd.size() > 0) { - beginInsertRows(QModelIndex(), d->users.size(), d->users.size() + usersToAdd.size() -1); - d->users.append(usersToAdd); - endInsertRows(); + int row = index.row(); + switch (role) { + case Qt::DisplayRole: + return d->users[row].displayName(); + case Qt::DecorationRole: + return QPixmap(d->users[row].image); + case UsersModel::NameRole: + return d->users[row].name; + case UsersModel::RealNameRole: + return d->users[row].realName; + case UsersModel::LoggedInRole: + return d->users[row].isLoggedIn; } + + return QVariant(); } + #include "usersmodel_moc.cpp" |