aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Moore <ken@pcbsd.org>2015-02-27 13:08:32 -0500
committerKen Moore <ken@pcbsd.org>2015-02-27 13:08:32 -0500
commite3fc2e3b7c634df819fa75629233e5f319ae6903 (patch)
tree649f4d5d91a1282e980feecd217bc03ca482d685
parentHave lumina-search load the icons a moment after the application is done init... (diff)
downloadlumina-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.cpp29
-rw-r--r--libLumina/LuminaXDG.h2
-rw-r--r--lumina-open/LFileDialog.cpp14
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();
bgstack15