diff options
author | Ken Moore <ken@pcbsd.org> | 2015-02-27 13:08:32 -0500 |
---|---|---|
committer | Ken Moore <ken@pcbsd.org> | 2015-02-27 13:08:32 -0500 |
commit | e3fc2e3b7c634df819fa75629233e5f319ae6903 (patch) | |
tree | 649f4d5d91a1282e980feecd217bc03ca482d685 | |
parent | Have lumina-search load the icons a moment after the application is done init... (diff) | |
download | lumina-e3fc2e3b7c634df819fa75629233e5f319ae6903.tar.gz lumina-e3fc2e3b7c634df819fa75629233e5f319ae6903.tar.bz2 lumina-e3fc2e3b7c634df819fa75629233e5f319ae6903.zip |
Update how lumina-open detects applications which are registered on the system for a particular mimetype. Now it uses the manual method (checking each *.desktop file for that particular mimetype - since it has to load all of them anyway), as well as use the results of any matches in the <XDG_DATA_DIRS>/applications/mimeinfo.cache file.
-rw-r--r-- | libLumina/LuminaXDG.cpp | 29 | ||||
-rw-r--r-- | libLumina/LuminaXDG.h | 2 | ||||
-rw-r--r-- | lumina-open/LFileDialog.cpp | 14 |
3 files changed, 41 insertions, 4 deletions
diff --git a/libLumina/LuminaXDG.cpp b/libLumina/LuminaXDG.cpp index 3ec16887..27b3b637 100644 --- a/libLumina/LuminaXDG.cpp +++ b/libLumina/LuminaXDG.cpp @@ -569,6 +569,35 @@ QString LXDG::findDefaultAppForMime(QString mime){ return cdefault; } +QStringList LXDG::findAvailableAppsForMime(QString mime){ + QStringList dirs = LXDG::systemApplicationDirs(); + QStringList out; + //Loop over all possible directories that contain *.destop files + // and check for the mimeinfo.cache file + for(int i=0; i<dirs.length(); i++){ + if(QFile::exists(dirs[i]+"/mimeinfo.cache")){ + QStringList matches = LUtils::readFile(dirs[i]+"/mimeinfo.cache").filter(mime+"="); + //Find any matches for our mimetype in the cache + for(int j=0; j<matches.length(); j++){ + QStringList files = matches[j].section("=",1,1).split(";",QString::SkipEmptyParts); + //Verify that each file exists before putting the full path to the file in the output + for(int m=0; m<files.length(); m++){ + if(QFile::exists(dirs[i]+"/"+files[m])){ + out << dirs[i]+"/"+files[m]; + }else if(files[m].contains("-")){ //kde4-<filename> -> kde4/<filename> (stupid KDE variations!!) + files[m].replace("-","/"); + if(QFile::exists(dirs[i]+"/"+files[m])){ + out << dirs[i]+"/"+files[m]; + } + } + } + } + } + } + //qDebug() << "Found Apps for Mime:" << mime << out << dirs; + return out; +} + void LXDG::setDefaultAppForMime(QString mime, QString app){ QString filepath = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-mimeapps.list"; QStringList cinfo = LUtils::readFile(filepath); diff --git a/libLumina/LuminaXDG.h b/libLumina/LuminaXDG.h index ad09d490..fe44a4fd 100644 --- a/libLumina/LuminaXDG.h +++ b/libLumina/LuminaXDG.h @@ -91,6 +91,8 @@ public: static QString findMimeComment(QString mime); //Find the default application for a mime-type static QString findDefaultAppForMime(QString mime); + //Fine the available applications for a mime-type + static QStringList findAvailableAppsForMime(QString mime); //Set the default application for a mime-type static void setDefaultAppForMime(QString mime, QString app); //List all the registered audio/video file extensions diff --git a/lumina-open/LFileDialog.cpp b/lumina-open/LFileDialog.cpp index 5214a2f1..d648925b 100644 --- a/lumina-open/LFileDialog.cpp +++ b/lumina-open/LFileDialog.cpp @@ -38,7 +38,7 @@ void LFileDialog::setFileInfo(QString filename, QString extension, bool isFile){ else if(extension=="email"){ ui->label_extension->setText( QString(tr("(Email Link)")) ); } else if(extension=="webbrowser"){ ui->label_extension->setText( QString(tr("(Internet URL)")) ); } else{ui->label_extension->setText("("+extension+" link)"); } - fileEXT = extension; + fileEXT = extension; //NOTE: this is the mime-type for the file now, not the extension generateAppList(); } @@ -66,9 +66,13 @@ void LFileDialog::setDefaultApp(QString extension, QString appFile){ // PRIVATE // ----------- QStringList LFileDialog::getPreferredApplications(){ - //Now search the settings for that extension - QStringList keys = settings->allKeys(); QStringList out; + //First list all the applications registered for that same mimetype + QString mime = fileEXT; + out << LXDG::findAvailableAppsForMime(mime); + + //Now search the internal settings for that extension and find any applications last used + QStringList keys = settings->allKeys(); for(int i=0; i<keys.length(); i++){ if(keys[i].startsWith("default/")){ continue; } //ignore the defaults (they will also be in the main) if(keys[i].toLower() == fileEXT.toLower()){ @@ -83,6 +87,8 @@ QStringList LFileDialog::getPreferredApplications(){ if(!out.isEmpty()){ break; } //already found files } } + //Make sure we don't have any duplicates before we return the list + out.removeDuplicates(); return out; } @@ -159,7 +165,7 @@ void LFileDialog::generateAppList(){ PREFAPPS = getPreferredApplications(); ui->combo_rec->clear(); //Now get the application mimetype for the file extension (if available) - QString mimetype = LXDG::findAppMimeForFile(fileEXT); + QString mimetype = fileEXT; //Now add all the detected applications QHash< QString, QList<XDGDesktop> > hash = LXDG::sortDesktopCats( LXDG::systemDesktopFiles() ); QStringList cat = hash.keys(); |