aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/libLumina/LDesktopUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/libLumina/LDesktopUtils.cpp')
-rw-r--r--src-qt5/core/libLumina/LDesktopUtils.cpp550
1 files changed, 550 insertions, 0 deletions
diff --git a/src-qt5/core/libLumina/LDesktopUtils.cpp b/src-qt5/core/libLumina/LDesktopUtils.cpp
new file mode 100644
index 00000000..4f8d94ef
--- /dev/null
+++ b/src-qt5/core/libLumina/LDesktopUtils.cpp
@@ -0,0 +1,550 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2016, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "LDesktopUtils.h"
+
+#include <QDesktopWidget>
+#include <QApplication>
+#include <QScreen>
+
+#include "LuminaThemes.h"
+
+static QStringList fav;
+
+QString LDesktopUtils::LuminaDesktopVersion(){
+ QString ver = "1.1.1";
+ #ifdef GIT_VERSION
+ ver.append( QString(" (Git Revision: %1)").arg(GIT_VERSION) );
+ #endif
+ return ver;
+}
+
+QString LDesktopUtils::LuminaDesktopBuildDate(){
+ #ifdef BUILD_DATE
+ return BUILD_DATE;
+ #endif
+ return "";
+}
+
+//Various function for finding valid QtQuick plugins on the system
+bool LDesktopUtils::validQuickPlugin(QString ID){
+ return ( !LDesktopUtils::findQuickPluginFile(ID).isEmpty() );
+}
+
+QString LDesktopUtils::findQuickPluginFile(QString ID){
+ if(ID.startsWith("quick-")){ ID = ID.section("-",1,50); } //just in case
+ //Give preference to any user-supplied plugins (overwrites for system plugins)
+ QString path = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/quickplugins/quick-"+ID+".qml";
+ if( QFile::exists(path) ){return path; }
+ path = LOS::LuminaShare()+"quickplugins/quick-"+ID+".qml";
+ if( QFile::exists(path) ){return path; }
+ return ""; //could not be found
+}
+
+QStringList LDesktopUtils::listQuickPlugins(){
+ QDir dir(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/quickplugins");
+ QStringList files = dir.entryList(QStringList() << "quick-*.qml", QDir::Files | QDir::NoDotAndDotDot, QDir::Name);
+ dir.cd(LOS::LuminaShare()+"quickplugins");
+ files << dir.entryList(QStringList() << "quick-*.qml", QDir::Files | QDir::NoDotAndDotDot, QDir::Name);
+ for(int i=0; i<files.length(); i++){
+ files[i] = files[i].section("quick-",1,100).section(".qml",0,0); //just grab the ID out of the middle of the filename
+ }
+ files.removeDuplicates();
+ //qDebug() << "Found Quick Plugins:" << files;
+ return files;
+}
+
+QStringList LDesktopUtils::infoQuickPlugin(QString ID){ //Returns: [Name, Description, Icon]
+ //qDebug() << "Find Quick Info:" << ID;
+ QString path = findQuickPluginFile(ID);
+ //qDebug() << " - path:" << path;
+ if(path.isEmpty()){ return QStringList(); } //invalid ID
+ QStringList contents = LUtils::readFile(path);
+ if(contents.isEmpty()){ return QStringList(); } //invalid file (unreadable)
+ contents = contents.filter("//").filter("=").filter("Plugin"); //now just grab the comments
+ //qDebug() << " - Filtered Contents:" << contents;
+ QStringList info; info << "" << "" << "";
+ for(int i=0; i<contents.length(); i++){
+ if(contents[i].contains("Plugin-Name=")){ info[0] = contents[i].section("Plugin-Name=",1,1).simplified(); }
+ else if(contents[i].contains("Plugin-Description=")){ info[1] = contents[i].section("Plugin-Description=",1,1).simplified(); }
+ else if(contents[i].contains("Plugin-Icon=")){ info[2] = contents[i].section("Plugin-Icon=",1,1).simplified(); }
+ }
+ if(info[0].isEmpty()){ info[0]=ID; }
+ if(info[2].isEmpty()){ info[2]="preferences-plugin"; }
+ //qDebug() << " - info:" << info;
+ return info;
+}
+
+QStringList LDesktopUtils::listFavorites(){
+ static QDateTime lastRead;
+ QDateTime cur = QDateTime::currentDateTime();
+ if(lastRead.isNull() || lastRead<QFileInfo( QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/favorites.list").lastModified()){
+ fav = LUtils::readFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/favorites.list");
+ fav.removeAll(""); //remove any empty lines
+ fav.removeDuplicates();
+ lastRead = cur;
+ }
+
+ return fav;
+}
+
+bool LDesktopUtils::saveFavorites(QStringList list){
+ list.removeDuplicates();
+ bool ok = LUtils::writeFile(QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/favorites.list", list, true);
+ if(ok){ fav = list; } //also save internally in case of rapid write/read of the file
+ return ok;
+}
+
+bool LDesktopUtils::isFavorite(QString path){
+ QStringList fav = LDesktopUtils::listFavorites();
+ for(int i=0; i<fav.length(); i++){
+ if(fav[i].endsWith("::::"+path)){ return true; }
+ }
+ return false;
+}
+
+bool LDesktopUtils::addFavorite(QString path, QString name){
+ //Generate the type of favorite this is
+ QFileInfo info(path);
+ QString type;
+ if(info.isDir()){ type="dir"; }
+ else if(info.suffix()=="desktop"){ type="app"; }
+ else{ type = LXDG::findAppMimeForFile(path); }
+ //Assign a name if none given
+ if(name.isEmpty()){ name = info.fileName(); }
+ //Now add it to the list
+ QStringList favs = LDesktopUtils::listFavorites();
+ bool found = false;
+ for(int i=0; i<favs.length(); i++){
+ if(favs[i].endsWith("::::"+path)){ favs[i] = name+"::::"+type+"::::"+path; }
+ }
+ if(!found){ favs << name+"::::"+type+"::::"+path; }
+ return LDesktopUtils::saveFavorites(favs);
+}
+
+void LDesktopUtils::removeFavorite(QString path){
+ QStringList fav = LDesktopUtils::listFavorites();
+ bool changed = false;
+ for(int i=0; i<fav.length(); i++){
+ if(fav[i].endsWith("::::"+path)){ fav.removeAt(i); i--; changed=true;}
+ }
+ if(changed){ LDesktopUtils::saveFavorites(fav); }
+}
+
+void LDesktopUtils::upgradeFavorites(int fromoldversionnumber){
+ /*if(fromoldversionnumber <= 8004){ // < pre-0.8.4>, sym-links in the ~/.lumina/favorites dir}
+ //Include 0.8.4-devel versions in this upgrade (need to distinguish b/w devel and release versions later somehow)
+ QDir favdir(QDir::homePath()+"/.lumina/favorites");
+ QFileInfoList symlinks = favdir.entryInfoList(QDir::Files | QDir::Dirs | QDir::System | QDir::NoDotAndDotDot);
+ QStringList favfile = LDesktopUtils::listFavorites(); //just in case some already exist
+ bool newentry = false;
+ for(int i=0; i<symlinks.length(); i++){
+ if(!symlinks[i].isSymLink()){ continue; } //not a symlink
+ QString path = symlinks[i].symLinkTarget();
+ QString name = symlinks[i].fileName(); //just use the name of the symlink from the old system
+ QString type;
+ if(symlinks[i].isDir()){ type = "dir"; }
+ else if(name.endsWith(".desktop")){ type = "app"; }
+ else{ type = LXDG::findAppMimeForFile(path); }
+ //Put the line into the file
+ favfile << name+"::::"+type+"::::"+path;
+ //Now remove the symlink - obsolete format
+ QFile::remove(symlinks[i].absoluteFilePath());
+ newentry = true;
+ }
+ if(newentry){
+ LDesktopUtils::saveFavorites(favfile);
+ }
+ }*/ //end check for version <= 0.8.4
+
+}
+
+void LDesktopUtils::LoadSystemDefaults(bool skipOS){
+ //Will create the Lumina configuration files based on the current system template (if any)
+ qDebug() << "Loading System Defaults";
+ QStringList sysDefaults;
+ if(!skipOS){ sysDefaults = LUtils::readFile(LOS::AppPrefix()+"etc/luminaDesktop.conf"); }
+ if(sysDefaults.isEmpty() && !skipOS){ sysDefaults = LUtils::readFile(LOS::AppPrefix()+"etc/luminaDesktop.conf.dist"); }
+ if(sysDefaults.isEmpty() && !skipOS) { sysDefaults = LUtils::readFile(LOS::SysPrefix()+"etc/luminaDesktop.conf"); }
+ if(sysDefaults.isEmpty() && !skipOS){ sysDefaults = LUtils::readFile(LOS::SysPrefix()+"etc/luminaDesktop.conf.dist"); }
+ if(sysDefaults.isEmpty() && !skipOS) { sysDefaults = LUtils::readFile(L_ETCDIR+"/luminaDesktop.conf"); }
+ if(sysDefaults.isEmpty() && !skipOS){ sysDefaults = LUtils::readFile(L_ETCDIR+"/luminaDesktop.conf.dist"); }
+ if(sysDefaults.isEmpty()){ sysDefaults = LUtils::readFile(LOS::LuminaShare()+"luminaDesktop.conf"); }
+ //Find the number of the left-most desktop screen
+ QString screen = "0";
+ QDesktopWidget *desk =QApplication::desktop();
+ QRect screenGeom;
+ for(int i=0; i<desk->screenCount(); i++){
+ if(desk->screenGeometry(i).x()==0){
+ screen = QString::number(i);
+ screenGeom = desk->screenGeometry(i);
+ break;
+ }
+ }
+ //Now setup the default "desktopsettings.conf" and "sessionsettings.conf" files
+ QStringList deskset, sesset;//, lopenset;
+
+ // -- SESSION SETTINGS --
+ QStringList tmp = sysDefaults.filter("session_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("session."); }//for backwards compat
+ sesset << "[General]"; //everything is in this section
+ sesset << "DesktopVersion="+LDesktopUtils::LuminaDesktopVersion();
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ if(val.isEmpty()){ continue; }
+ QString istrue = (val.toLower()=="true") ? "true": "false";
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+
+ if(var.contains("_default_")){ val = LUtils::AppToAbsolute(val); } //got an application/binary
+ //Special handling for values which need to exist first
+ if(var.endsWith("_ifexists") ){
+ var = var.remove("_ifexists"); //remove this flag from the variable
+ //Check if the value exists (absolute path only)
+ if(!QFile::exists(val)){ continue; } //skip this line - value/file does not exist
+ }
+
+ //Parse/save the value
+ QString sset; //temporary strings
+ if(var=="session_enablenumlock"){ sset = "EnableNumlock="+ istrue; }
+ else if(var=="session_playloginaudio"){ sset = "PlayStartupAudio="+istrue; }
+ else if(var=="session_playlogoutaudio"){ sset = "PlayLogoutAudio="+istrue; }
+ else if(var=="session_default_terminal"){
+ LXDG::setDefaultAppForMime("application/terminal", val);
+ //sset = "default-terminal="+val;
+ }else if(var=="session_default_filemanager"){
+ LXDG::setDefaultAppForMime("inode/directory", val);
+ //sset = "default-filemanager="+val;
+ //loset = "directory="+val;
+ }else if(var=="session_default_webbrowser"){
+ //loset = "webbrowser="+val;
+ LXDG::setDefaultAppForMime("x-scheme-handler/http", val);
+ LXDG::setDefaultAppForMime("x-scheme-handler/https", val);
+ }else if(var=="session_default_email"){
+ LXDG::setDefaultAppForMime("application/email",val);
+ //loset = "email="+val;
+ }
+ //Put the line into the file (overwriting any previous assignment as necessary)
+ /*if(!loset.isEmpty()){
+ int index = lopenset.indexOf(QRegExp(loset.section("=",0,0)+"=*", Qt::CaseSensitive, QRegExp::Wildcard));
+ qDebug() << "loset line:" << loset << index << lopenset;
+ if(index<0){ lopenset << loset; } //new line
+ else{ lopenset[index] = loset; } //overwrite the other line
+ }*/
+ if(!sset.isEmpty()){
+ int index = sesset.indexOf(QRegExp(sset.section("=",0,0)+"=*", Qt::CaseSensitive, QRegExp::Wildcard));
+ if(index<0){ sesset << sset; } //new line
+ else{ sesset[index] = sset; } //overwrite the other line
+ }
+ }
+ //if(!lopenset.isEmpty()){ lopenset.prepend("[default]"); } //the session options exist within this set
+
+ // -- MIMETYPE DEFAULTS --
+ tmp = sysDefaults.filter("mime_default_");
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ if(val.isEmpty()){ continue; }
+ QString istrue = (val.toLower()=="true") ? "true": "false";
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ val = LUtils::AppToAbsolute(val);
+ //Special handling for values which need to exist first
+ if(var.endsWith("_ifexists") ){
+ var = var.remove("_ifexists"); //remove this flag from the variable
+ //Check if the value exists (absolute path only)
+ if(!QFile::exists(val)){ continue; } //skip this line - value/file does not exist
+ }
+ //Now turn this variable into the mimetype only
+ var = var.section("_default_",1,-1);
+ LXDG::setDefaultAppForMime(var, val);
+ }
+
+ // -- DESKTOP SETTINGS --
+ //(only works for the primary desktop at the moment)
+ tmp = sysDefaults.filter("desktop_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("desktop."); }//for backwards compat
+ if(!tmp.isEmpty()){deskset << "[desktop-"+screen+"]"; }
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ if(val.isEmpty()){ continue; }
+ QString istrue = (val.toLower()=="true") ? "true": "false";
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ if(var=="desktop_visiblepanels"){ deskset << "panels="+val; }
+ else if(var=="desktop_backgroundfiles"){ deskset << "background\\filelist="+val; }
+ else if(var=="desktop_backgroundrotateminutes"){ deskset << "background\\minutesToChange="+val; }
+ else if(var=="desktop_plugins"){ deskset << "pluginlist="+val; }
+ else if(var=="desktop_generate_icons"){ deskset << "generateDesktopIcons="+istrue; }
+ }
+ if(!tmp.isEmpty()){ deskset << ""; } //space between sections
+
+ // -- PANEL SETTINGS --
+ //(only works for the primary desktop at the moment)
+ for(int i=1; i<11; i++){
+ QString panvar = "panel"+QString::number(i);
+ tmp = sysDefaults.filter(panvar);
+ if(!tmp.isEmpty()){deskset << "[panel"+screen+"."+QString::number(i-1)+"]"; }
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ if(val.isEmpty()){ continue; }
+ QString istrue = (val.toLower()=="true") ? "true": "false";
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ if(var==(panvar+"_pixelsize")){
+ //qDebug() << "Panel Size:" << val;
+ if(val.contains("%")){
+ QString last = val.section("%",1,1).toLower(); //last character
+ val = val.section("%",0,0);
+ if(last=="h"){ val = QString::number( qRound(screenGeom.height()*val.toDouble())/100 ); }//adjust value to a percentage of the height of the screen
+ else if(last=="w"){ val = QString::number( qRound(screenGeom.width()*val.toDouble())/100 ); }//adjust value to a percentage of the width of the screen
+ }
+ //qDebug() << " -- Adjusted:" << val;
+ deskset << "height="+val;
+ }
+ else if(var==(panvar+"_autohide")){ deskset << "hidepanel="+istrue; }
+ else if(var==(panvar+"_location")){ deskset << "location="+val.toLower(); }
+ else if(var==(panvar+"_plugins")){ deskset << "pluginlist="+val; }
+ else if(var==(panvar+"_pinlocation")){ deskset << "pinLocation="+val.toLower(); }
+ else if(var==(panvar+"_edgepercent")){ deskset << "lengthPercent="+val; }
+ }
+ if(!tmp.isEmpty()){ deskset << ""; } //space between sections
+ }
+
+ // -- MENU settings --
+ tmp = sysDefaults.filter("menu_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("menu."); } //backwards compat
+ if(!tmp.isEmpty()){deskset << "[menu]"; }
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).toLower().simplified();
+ if(val.isEmpty()){ continue; }
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ if(var=="menu_plugins"){ deskset << "itemlist="+val; }
+ }
+ if(!tmp.isEmpty()){ deskset << ""; } //space between sections
+
+ // -- FAVORITES --
+ tmp = sysDefaults.filter("favorites_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("favorites."); }
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ qDebug() << "Favorite entry:" << var << val;
+ val = LUtils::AppToAbsolute(val); //turn any relative files into absolute
+ if(var=="favorites_add_ifexists" && QFile::exists(val)){ qDebug() << " - Exists/Adding:"; LDesktopUtils::addFavorite(val); }
+ else if(var=="favorites_add"){ qDebug() << " - Adding:"; LDesktopUtils::addFavorite(val); }
+ else if(var=="favorites_remove"){ qDebug() << " - Removing:"; LDesktopUtils::removeFavorite(val); }
+ }
+
+ // -- QUICKLAUNCH --
+ tmp = sysDefaults.filter("quicklaunch_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("quicklaunch."); }
+ QStringList quickL;
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ val = LUtils::AppToAbsolute(val); //turn any relative files into absolute
+ if(var=="quicklaunch_add_ifexists" && QFile::exists(val)){ quickL << val; }
+ else if(var=="quicklaunch_add"){ quickL << val; }
+ }
+ if(!quickL.isEmpty()){
+ if(sesset.isEmpty()){ sesset << "[General]"; } //everything is in this section
+ sesset << "QuicklaunchApps="+quickL.join(", ");
+ }
+
+ //Now do any theme settings
+ QStringList themesettings = LTHEME::currentSettings();
+ //List: [theme path, colorspath, iconsname, font, fontsize]
+ //qDebug() << "Current Theme Color:" << themesettings[1];
+ tmp = sysDefaults.filter("theme_");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("theme."); }
+ bool setTheme = !tmp.isEmpty();
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ if(val.isEmpty()){ continue; }
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ if(var=="theme_themefile"){ themesettings[0] = val; }
+ else if(var=="theme_colorfile"){ themesettings[1] = val; }
+ else if(var=="theme_iconset"){ themesettings[2] = val; }
+ else if(var=="theme_font"){ themesettings[3] = val; }
+ else if(var=="theme_fontsize"){
+ if(val.endsWith("%")){ val = QString::number( (screenGeom.height()*val.section("%",0,0).toDouble())/100 )+"px"; }
+ themesettings[4] = val;
+ }
+ }
+ //qDebug() << " - Now Color:" << themesettings[1] << setTheme;
+
+ //Now double check that the custom theme/color files exist and reset it will the full path as necessary
+ if(setTheme){
+ QStringList systhemes = LTHEME::availableSystemThemes();
+ QStringList syscolors = LTHEME::availableSystemColors();
+ //theme file
+ //qDebug() << "Detected Themes/colors:" << systhemes << syscolors;
+ if( !themesettings[0].startsWith("/") || !QFile::exists(themesettings[0]) || !themesettings[0].endsWith(".qss.template")){
+ themesettings[0] = themesettings[0].section(".qss",0,0).simplified();
+ for(int i=0; i<systhemes.length(); i++){
+ if(systhemes[i].startsWith(themesettings[0]+"::::",Qt::CaseInsensitive)){
+ themesettings[0] = systhemes[i].section("::::",1,1); //Replace with the full path
+ break;
+ }
+ }
+ }
+ //color file
+ if( !themesettings[1].startsWith("/") || !QFile::exists(themesettings[1]) || !themesettings[1].endsWith(".qss.colors") ){
+ //Remove any extra/invalid extension
+ themesettings[1] = themesettings[1].section(".qss",0,0).simplified();
+ for(int i=0; i<syscolors.length(); i++){
+ if(syscolors[i].startsWith(themesettings[1]+"::::",Qt::CaseInsensitive)){
+ themesettings[1] = syscolors[i].section("::::",1,1); //Replace with the full path
+ break;
+ }
+ }
+ }
+ }
+ //qDebug() << " - Final Theme Color:" << themesettings[1];
+
+ //Ensure that the settings directory exists
+ QString setdir = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop";
+ if(!QFile::exists(setdir)){
+ QDir dir;
+ dir.mkpath(setdir);
+ }
+ //Now save the settings files
+ if(setTheme){ LTHEME::setCurrentSettings( themesettings[0], themesettings[1], themesettings[2], themesettings[3], themesettings[4]); }
+ LUtils::writeFile(setdir+"/sessionsettings.conf", sesset, true);
+ LUtils::writeFile(setdir+"/desktopsettings.conf", deskset, true);
+
+ //Now run any extra config scripts or utilities as needed
+ tmp = sysDefaults.filter("usersetup_run");
+ if(tmp.isEmpty()){ tmp = sysDefaults.filter("usersetup.run"); }
+ for(int i=0; i<tmp.length(); i++){
+ if(tmp[i].startsWith("#") || !tmp[i].contains("=") ){ continue; }
+ QString var = tmp[i].section("=",0,0).toLower().simplified();
+ QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
+ //Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+ if(var=="usersetup_run"){
+ qDebug() << "Running user setup command:" << val;
+ QProcess::execute(val);
+ }
+ }
+
+}
+
+bool LDesktopUtils::checkUserFiles(QString lastversion){
+ //internal version conversion examples:
+ // [1.0.0 -> 1000000], [1.2.3 -> 1002003], [0.6.1 -> 6001]
+ //returns true if something changed
+ int oldversion = LDesktopUtils::VersionStringToNumber(lastversion);
+ int nversion = LDesktopUtils::VersionStringToNumber(QApplication::applicationVersion());
+ bool newversion = ( oldversion < nversion ); //increasing version number
+ bool newrelease = ( lastversion.contains("-devel", Qt::CaseInsensitive) && QApplication::applicationVersion().contains("-release", Qt::CaseInsensitive) ); //Moving from devel to release
+
+ QString confdir = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/";
+ //Check for the desktop settings file
+ QString dset = confdir+"desktopsettings.conf";
+ bool firstrun = false;
+ if(!QFile::exists(dset) || oldversion < 5000){
+ if( oldversion < 100000 && nversion>=100000 ){ system("rm -rf ~/.lumina"); qDebug() << "Current desktop settings obsolete: Re-implementing defaults"; }
+ else{ firstrun = true; }
+ LDesktopUtils::LoadSystemDefaults();
+ }
+ //Convert the favorites framework as necessary (change occured with 0.8.4)
+ if(newversion || newrelease){
+ LDesktopUtils::upgradeFavorites(oldversion);
+ }
+ //Convert from the old desktop numbering system to the new one (change occured with 1.0.1)
+ if(oldversion<=1000001){
+ QStringList DS = LUtils::readFile(dset);
+ QList<QScreen*> screens = QApplication::screens();
+ for(int i=0; i<DS.length(); i++){
+ if(!DS[i].startsWith("[")){ continue; }
+ if(DS[i].startsWith("[desktop-")){
+ bool ok = false;
+ int num = DS[i].section("desktop-",-1).section("]",0,0).toInt(&ok);
+ if(num>=0 && ok && num< screens.length()){
+ //This one needs to be converted
+ DS[i] = "[desktop-"+screens[num]->name()+"]";
+ }
+ }else if(DS[i].startsWith("[panel")){
+ bool ok = false;
+ int num = DS[i].section("panel",-1).section(".",0,0).toInt(&ok);
+ if(num>=0 && ok && num< screens.length()){
+ //This one needs to be converted
+ QString rest = DS[i].section(".",1,-1); //everything after the desktop number in the current setting
+ DS[i] = "[panel_"+screens[num]->name()+"."+rest;
+ }
+ }
+ }
+ LUtils::writeFile(dset, DS, true);
+ }
+
+ //Check the fluxbox configuration files
+ dset = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/";
+ if(!QFile::exists(dset+"fluxbox-init")){
+ firstrun = true;
+ }
+ bool fluxcopy = false;
+ if(!QFile::exists(dset+"fluxbox-init")){ fluxcopy=true; }
+ else if(!QFile::exists(dset+"fluxbox-keys")){fluxcopy=true; }
+ else if(oldversion < 60){ fluxcopy=true; qDebug() << "Current fluxbox settings obsolete: Re-implementing defaults"; }
+ if(fluxcopy){
+ qDebug() << "Copying default fluxbox configuration files";
+ if(QFile::exists(dset+"fluxbox-init")){ QFile::remove(dset+"fluxbox-init"); }
+ if(QFile::exists(dset+"fluxbox-keys")){ QFile::remove(dset+"fluxbox-keys"); }
+ QString finit = LUtils::readFile(LOS::LuminaShare()+"fluxbox-init-rc").join("\n");
+ finit.replace("${XDG_CONFIG_HOME}", QString(getenv("XDG_CONFIG_HOME")));
+ LUtils::writeFile(dset+"fluxbox-init", finit.split("\n"));
+ QFile::copy(LOS::LuminaShare()+"fluxbox-keys", dset+"fluxbox-keys");
+ QFile::setPermissions(dset+"fluxbox-init", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ QFile::setPermissions(dset+"fluxbox-keys", QFile::ReadOwner | QFile::WriteOwner | QFile::ReadUser | QFile::ReadOther | QFile::ReadGroup);
+ }
+
+ if(firstrun){ qDebug() << "First time using Lumina!!"; }
+ return (firstrun || newversion || newrelease);
+}
+
+int LDesktopUtils::VersionStringToNumber(QString version){
+ version = version.section("-",0,0); //trim any extra labels off the end
+ int maj, mid, min; //major/middle/minor version numbers (<Major>.<Middle>.<Minor>)
+ maj = mid = min = 0;
+ bool ok = true;
+ maj = version.section(".",0,0).toInt(&ok);
+ if(ok){ mid = version.section(".",1,1).toInt(&ok); }else{ maj = 0; }
+ if(ok){ min = version.section(".",2,2).toInt(&ok); }else{ mid = 0; }
+ if(!ok){ min = 0; }
+ //Now assemble the number
+ //NOTE: This format allows numbers to be anywhere from 0->999 without conflict
+ return (maj*1000000 + mid*1000 + min);
+}
bgstack15