#include #include #include #include #include #include "xsession.h" #include "sessionsiconholder.h" void XSession::init(const QString& name, const QString& exec, const QString& comment, const QString& icon) { this->name_ = name; this->exec_ = exec; this->comment_ = comment; this->icon_ = icon; } bool XSession::init(const QString& filename) { QSettings settings(filename, QSettings::IniFormat); settings.setIniCodec("UTF-8"); settings.beginGroup("Desktop Entry"); if (settings.value("NoDisplay").toString().compare("true") == 0 || settings.value("Hidden").toString().compare("true") == 0) { return false; } if (!settings.contains("Exec")) { return false; } QString exec(settings.value("Exec").toString()); QString locale(QLocale::system().name()); QString language(locale.split("_").at(0)); QString name; if (settings.contains("Name[" + locale + "]")) { name = settings.value("Name[" + locale + "]").toString(); } else if (settings.contains("Name[" + language + "]")) { name = settings.value("Name[" + language + "]").toString(); } else if (settings.contains("Name")) { name = settings.value("Name").toString(); } else { return false; } QString comment; if (settings.contains("Comment[" + locale + "]")) { comment = settings.value("Comment[" + locale + "]").toString(); } else if (settings.contains("Comment[" + language + "]")) { comment = settings.value("Comment[" + language + "]").toString(); } else { comment = settings.value("Comment").toString(); } QString icon(settings.value("Icon").toString()); if (QDir::isRelativePath(icon)) { // icons with relative paths are too complicated to find // see http://freedesktop.org/wiki/Specifications/icon-theme-spec // let's just ignore them icon = QString(); } this->name_ = name; this->exec_ = exec; this->comment_ = comment; this->icon_ = icon; _process = new QProcess(); return true; } bool XSession::isActive() const { return true; } bool XSession::isValid() const { QFileInfo fi(this->exec_); return !fi.isAbsolute() || (fi.isFile() && fi.isExecutable()); } bool XSession::isLocked() const { return false; } int XSession::priority() const { return 0; } QIcon XSession::icon() const { QIcon retIcon; if (!this->icon_.isEmpty()) { retIcon = SessionsIconHolder::get()->getIcon(this->icon_); } if (retIcon.isNull()) { QString icon; if (this->exec_.contains("kde", Qt::CaseInsensitive)) { icon = "kde"; } else if (this->exec_.contains("gnome", Qt::CaseInsensitive)) { icon = "gnome"; } else if (this->exec_.contains("xfce", Qt::CaseInsensitive)) { icon = "xfce"; } else if (this->exec_.startsWith("i3", Qt::CaseInsensitive) || this->exec_.contains("/i3", Qt::CaseInsensitive)) { icon = "i3"; } else if (this->exec_.contains("lxde", Qt::CaseInsensitive)) { icon = "lxde"; } else if (this->exec_.contains("term", Qt::CaseInsensitive)) { icon = "term"; } else { icon = "linux"; } retIcon = SessionsIconHolder::get()->getIcon(icon); } return retIcon; } bool XSession::run() const { _process->start(this->exec_); QObject::connect(_process, SIGNAL(finished(int, QProcess::ExitStatus)), QApplication::instance(), SLOT(quit())); if (_process->state() == QProcess::Starting || _process->state() == QProcess::Running) return true; else return false; } int XSession::type() const { return Session::XSESSION; } QList XSession::readSessions(const QString& path) { QList retval; foreach (QFileInfo fi, QDir(path).entryInfoList(QStringList("*.desktop"))) { if (fi.baseName().compare("default") == 0) { continue; } XSession* session = new XSession; if (session->init(fi.absoluteFilePath())) { retval.append(session); } else { delete session; } } return retval; } bool XSession::operator<(const Session& other) const { int p0 = this->priority(); int p1 = other.priority(); if (p0 < p1) return true; if (p0 == p1) { QString d0 = this->shortDescription(); QString d1 = other.shortDescription(); return d0.localeAwareCompare(d1) < 0; } return false; } bool XSession::containsKeywords(const QList& keywords) const { for (int j = 0; j < keywords.length(); ++j) { if (!this->shortDescription().contains(keywords[j], Qt::CaseInsensitive) && !this->description().contains(keywords[j], Qt::CaseInsensitive)) { return false; } } return true; }