/* * Copyright (c) 2010,2011 - RZ Uni Freiburg * Copyright (c) 2010,2011 - OpenSLX Project * * This program/file is free software distributed under the GPL version 2. * See http://gpl.openslx.org/ * * If you have any feedback please consult http://feedback.openslx.org/ and * send your feedback to feedback@openslx.org * * General information about OpenSLX - libChooser can be found under * http://openslx.org * */ #include #include #include #include #include #include "XSession.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 { return true; } bool XSession::isLocked() const { return false; } int XSession::priority() const { return 0; } QString XSession::icon() const { QString icon(this->icon_); if (icon.isEmpty()) { if (this->exec_.contains("kde", Qt::CaseInsensitive)) { icon = "kde"; } else if (this->exec_.contains("gnome", Qt::CaseInsensitive)) { icon = "gnome"; } else if (this->exec_.contains("term", Qt::CaseInsensitive)) { icon = "term"; } else if (this->exec_.contains("xfce", Qt::CaseInsensitive)) { icon = "xfce"; } else if (this->exec_.contains("lxde", Qt::CaseInsensitive)) { icon = "lxde"; } else { icon = "linux"; } } return icon; } 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 || QProcess::Running) return true; else return false; } int XSession::type() const { return Session::XSESSION; } 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; }