summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edmundson <david@davidedmundson.co.uk>2011-11-20 21:31:13 +0000
committerDavid Edmundson <david@davidedmundson.co.uk>2011-11-20 21:31:13 +0000
commit131f0c158933adfe6150b062ddf827ad6c940c60 (patch)
tree3daedd7167f9dc2199b3afea9c043e060b6bcd28
parent917c8fe94754c9de57689f28176b2b12fe1a419b (diff)
downloadlightdm-131f0c158933adfe6150b062ddf827ad6c940c60.tar.gz
Start of refactor to make QLightDM use the GObject library.
Initial UsersModel port
-rw-r--r--liblightdm-gobject/lightdm.h2
-rw-r--r--liblightdm-gobject/lightdm/power.h2
-rw-r--r--liblightdm-gobject/lightdm/system.h2
-rw-r--r--liblightdm-qt/Makefile.am3
-rw-r--r--liblightdm-qt/QLightDM/usersmodel.h13
-rw-r--r--liblightdm-qt/usersmodel.cpp273
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"